python - 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 文件,它们可以正常工作。
解决方案
并非所有编解码器都可以在 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-python或MoviePy等使用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中找到信息