OpenCV Python脚本在树莓派3B保存MP4视频报错0xc10100be求助
问题
用OpenCV编写的Python脚本在笔记本电脑上可正常录制并保存MP4视频,回放无问题;但在树莓派3B上保存的MP4视频播放时出现错误码0xc10100be,提示“文件无法播放,原因是文件类型不支持、文件扩展名不正确或文件已损坏”。想知道树莓派是否无法保存MP4文件?是否需要安装额外组件,或是有其他原因导致该问题?
附上原代码:
import cv2 video_cam = cv2.VideoCapture(0) # opens camera for video capture, 0 for inbuilt camera, 1 for USB cam width = int(video_cam.get(3)) height = int(video_cam.get(4)) size = (width, height) print(size) print(type(video_cam)) print(video_cam.isOpened()) # returns true if video capturig initialised, means VideoCapture construcor succeeded out = cv2.VideoWriter('video.mp4', cv2.VideoWriter_fourcc(*'mp4v'), 20, size, True) while video_cam.isOpened(): check, frame = video_cam.read() # takes, decodes and returns video frame if check==True: out.write(frame) # writes frame to mp4/avi file for saving cv2.imshow("image", frame) # display in image, takes 2 inputs, window name being displayed in and the actual image # waitkey(): if use (0) displays still image and image remains until key is pressed # if use (1) frame displayed for 1ms before closing # keep streaming until press q 0xFF - means the ASCII input, waitKey returns 32 bit integer value but we only want last 8 bits if cv2.waitKey(1) & 0xFF ==ord('q'): break else: break video_cam.release() # closes video camera out.release() cv2.destroyAllWindows()
原因分析
树莓派3B完全可以保存MP4文件,问题出在这几个点:
- 树莓派上默认安装的OpenCV通常缺少完整的MP4编码依赖,比如
mp4v对应的MPEG-4编码库,导致写入的视频文件结构不完整,播放器无法识别。 - 原代码指定的20帧/秒可能超出树莓派USB摄像头的实际输出能力,帧写入不连贯也会损坏文件。
- 树莓派上USB摄像头的设备号不一定是0,可能导致摄像头初始化异常,写入空帧损坏文件。
解决方案
补全编码依赖
执行以下命令安装OpenCV所需的编码组件:sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev sudo apt-get install libxvidcore-dev libx264-dev如果是用pip安装的OpenCV,建议卸载后改用apt安装带完整编码支持的版本:
pip uninstall opencv-python sudo apt-get install python3-opencv更换兼容编码与帧率
树莓派对H.264编码的支持更好,把mp4v换成avc1(H.264的FourCC码),同时将帧率降到15,适配树莓派的硬件性能:out = cv2.VideoWriter('video.mp4', cv2.VideoWriter_fourcc(*'avc1'), 15, size, True)确认摄像头设备号
先通过ls /dev/video*命令查看树莓派上的摄像头设备编号,再修改VideoCapture的参数,比如设备号是1就写成video_cam = cv2.VideoCapture(1)。
修改后的可用代码
import cv2 # 先通过ls /dev/video*确认设备号,树莓派USB摄像头通常是1 video_cam = cv2.VideoCapture(1) width = int(video_cam.get(3)) height = int(video_cam.get(4)) size = (width, height) print(size) print(video_cam.isOpened()) # 使用H.264编码,帧率设为15适配树莓派性能 out = cv2.VideoWriter('video.mp4', cv2.VideoWriter_fourcc(*'avc1'), 15, size, True) while video_cam.isOpened(): check, frame = video_cam.read() if check == True: out.write(frame) cv2.imshow("image", frame) if cv2.waitKey(1) & 0xFF == ord('q'): break else: break video_cam.release() out.release() cv2.destroyAllWindows()
内容的提问来源于stack exchange,提问作者Benjy
相关产品推荐
相关产品推荐

