树莓派Python+ffmpeg+opencv实现推流 并 解决报错:BrokenPipeError: [Errno 32] Broken pipe

这篇具有很好参考价值的文章主要介绍了树莓派Python+ffmpeg+opencv实现推流 并 解决报错:BrokenPipeError: [Errno 32] Broken pipe。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


一、问题描述

  最近在用ffmpeg+Python opencv 的方法实现采集摄像头实时视频并完成推流。实现思路是:cv2先获取摄像头视频数据,然后建立一个subprocess.popen管道去推流,然后将视频帧处理完后写入管道中完成图像处理并推流的工作。在windows下调试可以正常实现,代码如下(这个网上很多,我把我调试成功的代码也贴出来)。但是我想要在树莓派上实现,将该部分代码移植到树莓派上后就出现报错:pipe.stdin.write(img.tostring()) BrokenPipeError: [Errno 32] Broken pipe。现象是:代码刚跑起来,刚显示一两帧画面就中断了。

import cv2
import subprocess
 
# 视频读取对象
cap = cv2.VideoCapture(0,cv2.CAP_DSHOW)

# 推流地址
rtsp = "rtsp://192.168.1.100:554/live/test1"# 推流的服务器地址

# 设置推流的参数
command = ['ffmpeg',
           '-y',
           '-f', 'rawvideo',
           '-vcodec', 'rawvideo',
           '-pix_fmt', 'bgr24',
           '-s', '640*480',  # 根据输入视频尺寸填写
           '-r', '30',
           '-i', '-',
           '-c:v', 'h264',
           '-pix_fmt', 'yuv420p',
           '-preset', 'ultrafast',
           '-f', 'rtsp',
           rtsp]

# 创建、管理子进程
pipe = subprocess.Popen(command,shell=True, stdin=subprocess.PIPE)
size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))

# 循环读取
num = 0
while cap.isOpened():
    num = num + 1
    print(num)
    # 读取一帧
    ret, frame = cap.read()
    if frame is None:
        print('read frame err!')
        continue
 
    # 显示一帧
    fps = int(cap.get(cv2.CAP_PROP_FPS))
    cv2.imshow("frame", frame)
    print("fps:",fps)
 
    # 按键退出
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
 
    # 读取尺寸、推流
    img = cv2.resize(frame, size)
 
    pipe.stdin.write(img.tobytes())

# 关闭窗口
cv2.destroyAllWindows()
 
# 停止读取
cap.release()

二、问题解决

1.找到问题

  从别人的帖子里发现可以用pipe.poll()来检查当前popen的工作状态,如果然后0,表示进程正常结束,返回1表示进程sleep挂起,返回2,表示子进程不存在,返回-15表示进程被kill,返回None,表示进程正在在运行。我print之后发现,返回了1,所以预估应该是,在树莓派上和windows上的popen创建方法有差别,在树莓派这里popen刚开始工作就被挂起了,终于找到解决办法。
python opencv 推流,树莓派,python学习,Linux,python,ffmpeg,opencv,树莓派

2.解决办法

  尝试了一下,将创建popen的shell = True 改为 shell = False就可以了。
将如下代码,

pipe = subprocess.Popen(command,shell=True, stdin=subprocess.PIPE)

  改为

pipe = subprocess.Popen(command,shell=False, stdin=subprocess.PIPE)

  即可文章来源地址https://www.toymoban.com/news/detail-608111.html

到了这里,关于树莓派Python+ffmpeg+opencv实现推流 并 解决报错:BrokenPipeError: [Errno 32] Broken pipe的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python工具方法 45 基于ffmpeg以面向对象多线程的方式实现实时推流

    参考基于ffmpeg模拟监控摄像头输出rtsp视频流并opencv播放 实现视频流的推流。 其基本操作就是,安装视频流推流服务器,ffmpeg,准备好要推流的视频。 命令如下所示: ffmpeg -re -stream_loop -1 -i 风景视频素材分享.flv -c copy -f rtsp rtsp://127.0.0.1:554/input 其中 风景视频素材分享.flv 为

    2024年02月20日
    浏览(32)
  • FFmpeg 实现无间断推流

    FFmpeg是一个强大的跨平台多媒体处理工具,可以用来进行音视频编码、解码、转码、过滤和流媒体处理等操作。下面介绍一下如何使用FFmpeg实现无间断推流: 1、使用参数-re实现实时推流 在FFmpeg中,参数\\\"-re\\\"表示以实时模式推流。使用该参数时,FFmpeg会尽可能快地读取源文件

    2024年02月11日
    浏览(34)
  • 利用ffmpeg实现rtmp推流

    http://ffmpeg.org/ 官方下载链接为:http://ffmpeg.org/ cmd进入ffmpeg.exe所在目录 输入下面的语句即可列出电脑的设备 ffmpeg -list_devices true -f dshow -i dummy ffmpeg -list_devices true -f dshow -i dummy 可以看到我电脑里面有USB2.0 PC CAMERA摄像头和一个乱码的麦克风 如果设备名称有中文,会出现乱码,想

    2024年02月13日
    浏览(77)
  • 树莓派4b安装opencv4.6.0并开启ffmpeg视频加速(2022.10.27)

    按ctrl + o ,enter保存,ctrl + x 关闭; 将以下内容写入配置文件(为pip配置阿里和豆瓣源):(保存并退出同上)

    2023年04月16日
    浏览(44)
  • 【树莓派】USB摄像头+python+opencv 六、报错:python Non-ASCII character '\xe5' in file

    插入usb摄像头,在命令行模式下输入        lsusb         如果看到列举出来的信息有camera的话就说明识别成功,可以使用。 1、拍照测试 安装 fswebcam 输入以下命令,开启摄像头 2、录像测试 安装 luvcview 输入以下命令,开启摄像头 如果发现安装的是python3的话就需要把pyth

    2024年02月05日
    浏览(53)
  • 利用ffmpeg实现rtmp推流直播

    我们这次利用ffmpeg实现rtmp推流(最终推流地址统一为rtmp://127.0.0.1:1935/live/123) 1.首先下载ffmpeg和ffplay 官方下载链接为:FFmpeg 下载后开始配置环境变量: 系统属性-环境变量-path-添加ffmpeg/bin的路径; 打开命令窗口,输入ffmpeg,检测是否配置成功  以上代表正常安装配置(这一步很简单

    2023年04月08日
    浏览(37)
  • 【rtsp推流】rtsp服务器+ffmpeg+Python+VLC

    本地摄像头实时监控/mp4视频文件 通过rtsp服务器转为rtsp地址 通过VLC将rtsp地址传入Python Python检测并标记好检测框(人脸识别/是否佩戴口罩) 通过ffmpeg推流,抛出一个新的rtsp地址 VLC即可访问新的rtsp地址 Python接收rtsp地址 1. 系统 2. 查看本机设备规格和WIndows规格 1. 下载 ① 官

    2024年02月16日
    浏览(41)
  • windows环境下实现ffmpeg本地视频进行rtsp推流

    摘要:有时候服务端(如linux)或者边缘端(jetson盒子)需要接受摄像头的视频流输入,而摄像头的输入视频流一般为rtsp,测试时需要搭建摄像头环境,很不方便,因此需要对本地视频进行rtsp推流,模拟摄像头的rtsp输入。 本地使用windows10, 64位 rtsp下载地址:https://github.com

    2024年04月13日
    浏览(36)
  • 使用 ffmpeg-python+命名管道进行图片转视频或推流

    命名管道(Named Pipe),也被称为FIFO,是一种在UNIX、Linux和类Unix系统中用于实现进程间通信(IPC)的机制。在Python中,我们可以使用 os 模块来创建和操作命名管道。 命名管道实际上是个特殊的文件,需要先创建 读写前后需要打开关闭 ffmpeg从命名管道输入源的方法与普通文件

    2024年04月16日
    浏览(39)
  • Python进行ffmpeg推流和拉流rtsp、rtmp + AI模型推理

    流媒体协议,英文学名Streaming Protocol,用一句人话来解释:流媒体协议是一种用于通过 Web 传递多媒体的协议。 传统视频流协议:RTMP和RTSP ,其中 RTMP 是基于 TCP 开发的,那么 RTSP 使用到了 UDP 。 底层协议:TCP 视频编解码器: H.264 音频编解码器:AAC 延迟:3 - 30 秒 RTMP 的最大

    2024年02月06日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包