python - 如何使用 H264 编解码器编写 mp4 视频文件?

标签 python opencv video ffmpeg codec

在 OSX 上,我可以使用以下简单脚本从我的网络摄像头录制视频文件:

import cv2
camera = cv2.VideoCapture(0)

# Define the codec and create VideoWriter object to save the video
fourcc = cv2.VideoWriter_fourcc(*'XVID')
video_writer = cv2.VideoWriter('output.avi', fourcc, 25.0, (640, 480))

while True:
    try:
        (grabbed, frame) = camera.read()  # grab the current frame
        frame = cv2.resize(frame, (640, 480))  # resize the frame
        video_writer.write(frame)  # Write the video to the file system

    except KeyboardInterrupt:
        camera.release()
        break

生成的 avi 文件虽然很大。我想要一个较小的文件,最好是 mp4。所以我将文件名更改为 output.mp4 并将 fourcc 编解码器更改为 H264。这写了一个有效的视频文件,但给我以下错误:

$ python write_video_file.py 
OpenCV: FFMPEG: tag 0x34363248/'H264' is not supported with codec id 28 and format 'mp4 / MP4 (MPEG-4 Part 14)'
OpenCV: FFMPEG: fallback to use tag 0x00000021/'!???'

因为我认为我在 ffmpeg 中缺少 H264 编解码器,所以我决定卸载 ffmpeg 和 opencv 并重新安装它们以支持 H264。为此,我使用了以下命令:

# First ffmpeg
brew install ffmpeg --with-fdk-aac --with-libvidstab --with-openh264 \
      --with-openjpeg  --with-openssl --with-tools --with-webp --with-x265 --with-zeromq
# then opencv3
brew tap homebrew/science
brew install opencv3 --with-contrib --with-ffmpeg --with-tbb

在此之后我再次运行脚本,使用以下组合:

  • output.mp4H264
  • output.mp4X264

不幸的是,我仍然收到 OpenCV 警告/错误。该文件是可读的,但它仍然让我烦恼,我得到这些错误。有人知道如何让 OpenCV 使用 H264 编解码器编写 mp4 视频文件吗?

欢迎所有提示!

最佳答案

我花了很长时间试图找到 ma​​cOS 上的视频编解码器列表,并找到哪些编解码器适用于哪些容器,然后确定 QuickTime 是否真的可以读取生成的文件.

我可以将我的发现总结如下:

.mov container and fourcc('m','p','4','v') work and QuickTime can read it
.mov container and fourcc('a','v','c','1') work and QuickTime can read it
.avi container and fourcc('F','M','P','4') works but QuickTime cannot read it without conversion

我确实设法在 mp4 容器中编写了 h264 视频,如您所愿,只是没有使用 OpenCV 的 VideoWriter 模块。相反,我更改了代码(我的恰好是 C++)以仅输出原始 bgr24 格式数据——这就是 OpenCV 喜欢存储像素的方式:

因此,存储在名为 FrameMat 中的一帧视频的输出变为:

cout.write(reinterpret_cast<const char *>(Frame.data),width*height*3);

然后将程序的输出通过管道传输到 ffmpeg 中,如下所示:

./yourProgram | ffmpeg -y -f rawvideo -pixel_format bgr24 -video_size 1024x768 -i - -c:v h264 -pix_fmt yuv420p video.mp4

是的,我知道我做了一些假设:

  • 数据是CV8_UC3,
  • 尺寸在 OpenCVffmpeg 中匹配,并且
  • OpenCV 数据中没有 padding 或 mad stride,

但基本技术是有效的,您可以根据其他尺寸和情况调整它。

关于python - 如何使用 H264 编解码器编写 mp4 视频文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43940538/

相关文章:

python - 删除 python mysql 问题

python - 在 Python 中,我可以按索引号顺序打印 3 个列表吗?

performance - OpenCV 的视频流很慢

android - 录制视频的问题

python - Parrot MiniDrone 滚动蜘蛛可编程?

Python 子进程 readlines()?

java - 使用 OpenCV for Android 将小图像复制到相机框架中

python - 如何处理CV2(Cv2.imwrite)中的错误?

android - SurfaceView创建前未捕获异常-Android-视频播放

c# - 在录制视频ffmpeg中增加fps