Python cv2 .mp4 编解码器无法在浏览器中显示

Python cv2 .mp4 codec unable to be displayed in browser

当我使用下面的 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 文件,它们可以正常工作。

并非所有编解码器都适用于网络浏览器。参见维基百科:HTML5 video

所有浏览器都应该可以工作编解码器 H.264 所以你可以试试

vid_cod = cv2.VideoWriter_fourcc(*'H264')

如果这行不通 - 即。当 cv2 是在没有这个编解码器的情况下编译的 - 然后你可以用外部工具转换它,比如 ffmpeg

在系统中console/shell

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

编辑:

您也可以使用 ffmpegWebCam

录制

对于 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