python - 编写视频而不会丢失数据或比特率 - opencv(python)

标签 python opencv ffmpeg bitrate fourcc

我正在尝试在 OpenCV 中编写没有任何损失的视频文件,但到目前为止,我从fourcc 编解码器列表中选择的任何编解码器都会以某种方式导致数据丢失。
关于我正在使用的记录参数:
fps = int(cap.get(cv2.CAP_PROP_FPS))
宽度 = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
高度 = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
到目前为止使用了这些编解码器,但它们要么压缩要么提升视频比特率
fourcc = cv2.VideoWriter_fourcc(*'MP4V')
fourcc = cv2.VideoWriter_fourcc(*'DIVX')
fourcc = cv2.VideoWriter_fourcc(*'RGBA')
fourcc = cv2.VideoWriter_fourcc(*'x265')
fourcc = cv2.VideoWriter_fourcc('H','2','6','4')
我的视频编写器功能是:
writer= cv2.VideoWriter(out_dest,fourcc,fps,(宽度,高度))
为了清楚起见,我不希望对输出视频进行任何形式的压缩。
我也用
vid_format = int(cap.get(cv2.CAP_PROP_FOURCC))
获取输出视频比特率并将其与原始视频进行比较。
我还在 GitHub 上发现有人使用 skvideo 但无法执行相同的代码
https://gist.github.com/docPhil99/a612c355cd31e69a0d3a6d2f87bfde8b
因为它一直显示扩展错误并且找不到有关如何使用它的正确文档!
先感谢您
关于该主题的更新:
最终输出编写器编解码器将用作 OpenCV 中 BGR 到 RGB 转换的视频编写器,如果您有任何其他可以完成这项工作的想法或建议,我会全力以赴!

最佳答案

如果您需要做的只是从原始 AVI 文件中获取 RGB 数据并使用 MediaPipe 提供 RGB 帧数据,则不需要中间文件来存储 RGB 数据,因为 FFmpeg 可以通过指定输出 -pix_fmt rgb24 即时转换像素格式选项。
为此,您可以尝试我的 ffmpegio package 来加载数据。我的包是为您的用例设计的,以消除设置 FFmpeg 调用的需要。安装:

pip install ffmpegio
您还需要系统中的 FFmpeg。
然后video.read()加载视频数据:
import ffmpegio

fs, I = ffmpegio.video.read('datafile.avi',pix_fmt='rgb24')
# fs = framerate
# I = 250x480x640x3 numpy array containing RGB video data

如果您不想一次读取所有 250 帧,可以使用流接口(interface)一次处理 X 帧:
with ffmpegio.open('datafile.avi','rv', blocksize=25, pix_fmt='rgb24') as f:
    for I in f: # loops 10 times, 25 frames at a time
        # I = 25x480x640x3 numpy array

关于python - 编写视频而不会丢失数据或比特率 - opencv(python),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71558150/

相关文章:

python - 如何更改 `id` 字段的初始值?

c++ - OpenCv:如何将 Mat::Rect 保存到文件中?

opencv - 如何通过视差图投影图像?

ffmpeg - 无法设置 ffmpeg 的周期/超时选项

python - 类型错误 : '>=' not supported between instances of 'dict' and 'int'

python - 使用 python wand 对图像进行灰度化

python - net.forward()的返回类型

javascript - 在 Node js 中水平生成视频快照。

docker - 创建 docker swarm 服务时如何传递自定义参数?

python - Django 1.2 : login issue (GET parameter: next)