OpenCV - FFmpeg H264 和 Webm 错误

14

我使用的是Ubuntu 16.04 LTS和OpenCV 3.4.0(Intel i5和AMD显卡)。我需要创建一个支持浏览器的视频,可以在浏览器中播放。

如果我使用H264,会出现以下问题:

OpenCV: FFMPEG: tag 0x34363248/'H264' is not supported with codec id 27 and format 'mp4 / MP4 (MPEG-4 Part 14)' OpenCV: FFMPEG: fallback to use tag 0x31637661/'avc1' [h264_nvenc @ 0x7f4e0407f5e0] Cannot load libcuda.so.1 Could not open codec 'h264_nvenc': Unspecified error

如果我使用的是webm VP8

OpenCV: FFMPEG: tag 0x30385056/'VP80' is not supported with codec id 139 and format 'webm / WebM'

如果我在使用WebM VP9

OpenCV: FFMPEG: tag 0x30395056/'VP90' is not supported with codec id 167 and format 'webm / WebM'

我正在使用这段代码进行转换。

    fourcc = cv2.VideoWriter_fourcc(*'VP80')
    frame = cv2.imread(movements[0].file_path)
    height, width, _ = frame.shape
    event_video_name = video.file_name.split('.')[0] + '_eventvideo.webm'
    event_video = cv2.VideoWriter(path + event_video_name, fourcc, 5, (width, height))

    for _, image in enumerate(movements):
        image = Image.objects.get(id=image.id)
        frame = cv2.imread(image.file_path)
        event_video.write(frame)
    event_video.release()

1
确保你的ffmpeg支持你想要使用的编解码器。如果你正在使用Linux,在终端输入:ffmpeg -codecs | grep -P "(h264|VP8|VP9)"。如果你在输出中看到以DEV开头的编解码器,则说明你的ffmpeg支持它们。 - zindarod
1
DEV.LS h264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (decoders: h264 h264_crystalhd h264_vdpau ) (encoders: libx264 libx264rgb ) DEV.L. vp8 On2 VP8 (decoders: vp8 libvpx ) (encoders: libvpx ) DEV.L. vp9 Google VP9 (decoders: vp9 libvpx-vp9 ) (encoders: libvpx-vp9 ) - Karthikaeyan
@zindarod 在使用OpenCV和FFMPEG时遇到了问题:tag 0x30385056/'VP80' is not supported with codec id 139 and format 'webm / WebM',我也遇到了同样的问题。 - Karthikaeyan
1
阅读此链接以了解容器和编解码器的兼容性(例如AVI和H.264)。 - zindarod
2个回答

7
我曾经遇到过同样的问题一个星期。在探索和浪费了很多时间后,它们中没有一个适用于我。 https://developer.mozilla.org/en-US/docs/Web/Media/Formats 请阅读这篇文章,它一定会对你们有所帮助,就像它对我有很大的帮助一样,它将提供有关编解码器及其适当容器类型以及其浏览器兼容性的详细知识。
我建议请先阅读这篇文章。
在尝试了许多合适的编解码器组合之后,使用容器类型为'webm'的编解码器'VP90'适用于我。我使用的是Ubuntu 18.04 LTS和Python3,以及'opencv-python 4.2.0.34'。
fourcc =  cv2.VideoWriter_fourcc(*'VP90')
            self.writer = cv2.VideoWriter('videoName.webm', fourcc, 20, (self.im_width,self.im_height)) 

不知何故我仍然找到了这个错误消息,但如果出现请忽略它。因为上面的代码片段将成功处理您的视频并以浏览器兼容格式保存。

错误消息:

OpenCV: FFMPEG: tag 0x30395056/'VP90' is not supported with codec id 167 and format 'webm / WebM'

请忽略这个错误信息,等待并让视频处理。 尝试这个方法,它有效。 谢谢。

感谢您的回答,我通过使用多线程解决了这个问题。由于写入方法需要更长的时间,在此期间,OpenCV 可能会错过参考帧,因此我使用了单独的线程进行读取和写入。然后使用队列在写入之前存储图像。 - Karthikaeyan

-3

感谢您的答案,我通过使用多线程解决了这个问题。由于 write 方法需要更多时间,在这段时间里 opencv 可能会错过参考帧,因此我使用了单独的线程来进行读和写。然后使用队列在将图像写入磁盘之前存储图像。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接