python - 从视频中读取的 cv2 帧与从重新创建的视频中读取的帧不同
问题描述
我需要从视频文件中读取帧并从这些帧中创建新视频。然后我从新视频中读取帧,我需要这些帧与我从原始视频中读取的帧相同。
这就是我所做的(例如我只用一帧做的) -
从视频中读取帧:
vidcap = cv2.VideoCapture('video_name.mp4')
success,orig_frame = vidcap.read()
从此帧写入新视频:
size = (1920,1080)
vidWriter = cv2.VideoWriter('new_video.mp4', cv2.VideoWriter_fourcc(*'MP4V'), 25, size)
vidWriter.write(orig_frame)
vidWriter.release()
从 new_video 读取帧:
vidcap = cv2.VideoCapture('new_video.mp4')
success,new_frame = vidcap.read()
比较 orig_frame 和 new_frame 表明它们并不相同。
原帧:
新框架:
如何从原始视频和新视频中获得相同的帧?
解决方案
MP4 无法做到这一点,因为它们使用有损编码来写入视频数据。您将无法在两个视频之间获得精确的逐像素匹配。
但是,如果您想获得精确匹配,则需要使用无损编解码器。
这取决于您使用什么系统来确定支持哪些编解码器,但很可能是使用 PNG 编码将视频帧写入文件。
尝试:
size = (1920,1080)
vidWriter = cv2.VideoWriter('new_video.avi', cv2.VideoWriter_fourcc(*'png '), 25, size)
vidWriter.write(orig_frame)
vidWriter.release()
如果以上不满意,请尝试咨询:Lossless compression for video in opencv
如果我可以提出一些建议,我不会使用 OpenCV 来执行此操作,因为您无法控制输出比特率、颜色分布等。您可以使用 FFMPEG 更好地控制这一点。请在此处查看有关如何使用无损压缩复制视频的帖子: 无损 ffmpeg 转换/编码
推荐阅读
- python - Django 中的持久化蛞蝓
- wordpress - Wordpress 下拉菜单突然不可见
- python - 在递归函数中添加条件以读取嵌套 json 文件中的特定键及其值
- python - Django / DRF - 响应对象中的无效语法
- javascript - 如何将离子项值传递给函数
- c++ - 是否有 strrchr 和 wcsrchr 不区分大小写的版本?(c++)
- android - 是否有任何用于在 android 设备上获取 Widevine (DRM) id 的颤振包?
- solidity - TypeError:无法读取未定义的属性“BuyToken”
- javascript - 使用 THREE.js 加载数据并将结果推送到列表时,列表保持为空
- javascript - foreach 异步超出了最大调用堆栈大小