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-python 或 MoviePy 这样的模块,它们使用 ffmpeg.
顺便说一句: ffmpeg
还会安装程序 ffprobe
,它可能会显示有关文件中使用的编解码器的详细信息。
ffprobe webcam.mp4
编辑:
您也可以使用 ffmpeg
从 WebCam
录制
对于 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
当我使用下面的 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-python 或 MoviePy 这样的模块,它们使用 ffmpeg.
顺便说一句: ffmpeg
还会安装程序 ffprobe
,它可能会显示有关文件中使用的编解码器的详细信息。
ffprobe webcam.mp4
编辑:
您也可以使用 ffmpeg
从 WebCam
对于 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