openCV-ffmpeg H264和Webm错误

Kar*_*yan 7 opencv ffmpeg h.264 html5-video webm

我已经安装了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
Run Code Online (Sandbox Code Playgroud)

如果我使用的是webm VP8

OpenCV: FFMPEG: tag 0x30385056/'VP80' is not supported with codec id 139 and format 'webm / WebM'
Run Code Online (Sandbox Code Playgroud)

如果我使用的是webm VP9

OpenCV: FFMPEG: tag 0x30395056/'VP90' is not supported with codec id 167 and format 'webm / WebM'
Run Code Online (Sandbox Code Playgroud)

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

    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()
Run Code Online (Sandbox Code Playgroud)

Shr*_*him 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)) 
Run Code Online (Sandbox Code Playgroud)

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

错误信息:

OpenCV: FFMPEG: tag 0x30395056/'VP90' is not supported with codec id 167 and format 'webm / WebM'
Run Code Online (Sandbox Code Playgroud)

请忽略此错误消息,等待并让视频处理。试试这个,它有效。谢谢。


Kar*_*yan -3

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