鱼C论坛

 找回密码
 立即注册
查看: 3218|回复: 6

[技术交流] python导出的视频文件出错

[复制链接]
发表于 2019-10-2 13:19:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 伏惜寒 于 2019-10-2 13:22 编辑

代码可以正常运行,但是导出的视频文件无法播放
求告知是代码问题,还是其他问题,最好有解决方法
这是一个模拟录屏软件的程序,通过电脑截图然后合成成视频文件导出
  1. import cv2, os
  2. import time
  3. import win32gui, win32ui, win32con, win32api

  4. def window_capture(filename):
  5.     hwnd = 0 # 窗口的编号,0号表示当前活跃窗口
  6.     # 根据窗口句柄获取窗口的设备上下文DC(Divice Context)
  7.     hwndDC = win32gui.GetWindowDC(hwnd)
  8.     # 根据窗口的DC获取mfcDC
  9.     mfcDC = win32ui.CreateDCFromHandle(hwndDC)
  10.     # mfcDC创建可兼容的DC
  11.     saveDC = mfcDC.CreateCompatibleDC()
  12.     # 创建bigmap准备保存图片
  13.     saveBitMap = win32ui.CreateBitmap()
  14.     # 获取监控器信息
  15.     MoniterDev = win32api.EnumDisplayMonitors(None, None)
  16.     w = MoniterDev[0][2][2]
  17.     h = MoniterDev[0][2][3]
  18.     #print(w,h)    #图片大小
  19.     # 为bitmap开辟空间
  20.     saveBitMap.CreateCompatibleBitmap(mfcDC, w, h)
  21.     # 高度saveDC,将截图保存到saveBitmap中
  22.     saveDC.SelectObject(saveBitMap)
  23.     # 截取从左上角(0,0)长宽为(w,h)的图片
  24.     saveDC.BitBlt((0, 0), (w, h), mfcDC, (0, 0), win32con.SRCCOPY)
  25.     saveBitMap.SaveBitmapFile(saveDC, filename)
  26.     win32gui.DeleteObject(saveBitMap.GetHandle())
  27.     saveDC.DeleteDC()
  28.     mfcDC.DeleteDC()
  29.     win32gui.ReleaseDC(hwnd, hwndDC)

  30. a = input("输入1开始录制:")
  31. if a == "1":
  32.     os.chdir("image")
  33.     name = 0
  34.     running = True
  35.     # 10帧,0.03秒一次截图,录制2秒
  36.     while running:
  37.         name += 1
  38.         photo_name = str(name) + ".jng"
  39.         window_capture(photo_name)
  40.         time.sleep(0.03)
  41.         if name == 20:
  42.             running = False

  43. size = (1366,768) #图片的分辨率片
  44. # 图片合成视频
  45. def picvideo(path,size):
  46.     path = r'C:\Users\猫娘赛高\Desktop\录屏程序\image\\'#文件路径
  47.     filelist = os.listdir(path) #获取该目录下的所有文件名
  48.     fps = 10
  49.     file_path = r"C:\Users\猫娘赛高\Desktop\录屏程序\video\" + str(int(time.time())) + ".mp4"#导出路径
  50.     fourcc = cv2.VideoWriter_fourcc('D', 'I', 'V', 'X')#不同视频编码对应不同视频格式(例:'I','4','2','0' 对应avi格式)
  51.     video = cv2.VideoWriter( file_path, fourcc, fps, size )
  52.     for item in filelist:
  53.         if item.endswith('.png'):
  54.             #判断图片后缀是否是.png
  55.             item = path + '/' + item
  56.             img = cv2.imread(item)
  57.             #使用opencv读取图像,直接返回numpy.ndarray 对象,通道顺序为BGR ,注意是BGR,通道值默认范围0-255。
  58.             video.write(img)
  59.             #把图片写进视频
  60.     video.release() #释放
  61. picvideo(r"C:\Users\猫娘赛高\Desktop\录屏程序\video", size)
复制代码
无标题.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-10-2 17:34:56 | 显示全部楼层
建议重新下载文件或重新编写代码,虽然太浪费时间,但是暂时只有这个办法了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-10-3 11:20:50 | 显示全部楼层
顶一下
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-10-3 11:39:09 | 显示全部楼层
weijl 发表于 2019-10-2 17:34
建议重新下载文件或重新编写代码,虽然太浪费时间,但是暂时只有这个办法了

废话
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-10-3 21:39:29 | 显示全部楼层
没有研究过这类的问题,文件保存的时候 str(int(time.time()))的结果是不是已经含有.号?会不会导致文件格式出错? 另外有一句:video.write(img) ,这个写入文件是用什么方式写入的?‘w’ 'wb' 还是别的?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-10-4 10:30:48 | 显示全部楼层
niuthon 发表于 2019-10-3 21:39
没有研究过这类的问题,文件保存的时候 str(int(time.time()))的结果是不是已经含有.号?会不会导致文件格 ...

文件保存的时候 str(int(time.time()))的结果是不是已经含有.号?会不会导致文件格式出错?
不会的结果没有.号,并不是导致文件出错的原因
对比文件大小来看,一个图片4M,但合成视频只有700kb,我觉得也是写入问题,但不知道怎么改才好
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-10-4 11:55:51 | 显示全部楼层
找了无数帖子,自行解决问题了
  1. """python + opencv 实现屏幕录制_by-_Zjh_"""
  2. from PIL import ImageGrab
  3. import numpy as np
  4. import cv2
  5. p = ImageGrab.grab()#获得当前屏幕
  6. k=np.zeros((200,200),np.uint8)
  7. a,b=p.size#获得当前屏幕的大小
  8. fourcc = cv2.VideoWriter_fourcc(*'XVID')#编码格式
  9. video = cv2.VideoWriter('test.avi', fourcc, 16, (a, b))#输出文件命名为test.mp4,帧率为16,可以自己设置
  10. while True:
  11.     im = ImageGrab.grab()
  12.     imm=cv2.cvtColor(np.array(im), cv2.COLOR_RGB2BGR)#转为opencv的BGR格式
  13.     video.write(imm)
  14.     cv2.imshow('imm', k)
  15.     if cv2.waitKey(1) & 0xFF == ord('q'):
  16.         break
  17. video.release()
  18. cv2.destroyAllWindows()
  19.         
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-10-12 03:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表