You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 07:25:19