首页 > 解决方案 > Python cv2 .mp4 编解码器无法在浏览器中显示

问题描述

当我使用下面的 Python 代码录制我的网络摄像头时,它会将其保存到 webcam.mp4 中。
在我的本地计算机上,我可以查看视频,但是当我在浏览器中显示它时,它不起作用。看来,编解码器是错误的,但我不知道为什么,也不知道如何让它正确。

Python 代码

    global rec_bool
    rec_bool = False

    def timer(seconds):
        global rec_bool
        rec_bool = True
        time.sleep(seconds)
        rec_bool = False

    seconds = 3
    timer_thread = threading.Thread(target=timer, args=(seconds,)).start()
    vid_capture = cv2.VideoCapture(0)
    vid_cod = cv2.VideoWriter_fourcc(*'mp4v')
    output = cv2.VideoWriter("webcam.mp4", vid_cod, 20.0, (640,480))
    while(rec_bool == True):
        ret,frame = vid_capture.read()
        
        output.write(frame)

    vid_capture.release()
    output.release()
    cv2.destroyAllWindows()

HTML 代码

<iframe class="video" id="webcam_video" src="/static/videos/webcam.mp4" frameborder="0" allowfullscreen></iframe>

它只显示一个加载符号。另一方面,当我使用 curl 下载它时,它工作得非常好。我已经尝试过使用其他 mp4 文件,它们可以正常工作。

标签: pythonopencvcv2

解决方案


并非所有编解码器都可以在 Web 浏览器中使用。参见维基百科:HTML5 视频

对于所有浏览器都应该可以使用编解码器H.264,因此您可以尝试

vid_cod = cv2.VideoWriter_fourcc(*'H264')

如果这不起作用 - 即。何时cv2在没有此编解码器的情况下编译 - 然后您可以使用ffmpeg等外部工具对其进行转换

在系统控制台/外壳中

ffmpeg -i webcam.mp4 -vcodec libx264 -f mp4 output.mp4

在代码中

os.system("ffmpeg -i webcam.mp4 -vcodec libx264 -f mp4 output.mp4")

或者

import subproces

# with `shell=True`
subproces.run("ffmpeg -i webcam.mp4 -vcodec libx264 -f mp4 output.mp4", shell=True)

# without `shell=True`
subproces.run( ["ffmpeg", "-i", "webcam.mp4", "-vcodec", "libx264", "-f", "mp4", "output.mp4"] )

或使用ffmpeg-pythonMoviePy等使用ffmpeg的模块。


顺便说一句: ffmpeg还安装ffprobe可能显示文件中使用的编解码器详细信息的程序。

 ffprobe webcam.mp4

编辑:

您还可以使用ffmpeg网络摄像头录制

对于 Linux(我使用)

ffmpeg -f v4l2 -i /dev/video0 -t 00:00:03 output.mp4

或通过一些设置

ffmpeg -f v4l2 -framerate 20 -video_size 640x480 -i /dev/video0 -t 00:00:03 output.mp4

3 seconds=-t 00:00:03-t 3

对于其他系统,您应该在文档WebCam中找到信息


推荐阅读