使用python+ffmpeg+mediamtx实现笔记本摄像头本地推流小记

最近有个项目使用到了监控推流的功能,记录一下自己在实现本地推流的一个经历。

作为一名菜鸟前端切图仔,遇到这种需求的时候,第一时间想到的就是用python去实现(纯属是因为不懂java,并且我认为python相对来说简单点),通过不断的询问DS最终整理出一份可行的方案。

1、安装ffmpeg

首先在电脑上安装chocolatey,管理员身份运行powershell,输入以下代码:

Set-ExecutionPolicy Bypass -Scope Process -Force

回车后进入下一行代码:

 iwr https://chocolatey.org/install.ps1 -UseBasicParsing | iex

静静的等待他安装完毕,安装成功后输入choco -v查看他的版本:

如果正常返回则表示chocolatey安装成功,可以继续安装ffmpeg:

choco install ffmpeg

静静的等待他安装完毕,安装成功后输入ffmpeg校验他是否安装成功:

如果正常返回则表示ffmpeg安装成功。

2、安装mediamtx:

官网下载压缩包

本人为windows系统,所以本人选择以下包进行下载

这里需要说明以下,这个官网里面最新的这些版本为mediamtx的包,他会自动帮你将rtsp流转换成不同的协议(http、webrtc),如果你单纯只是想要实现rtsp流的话,你可以选择往后面翻页找到rtsp-simple-server的包进行下载:

下载好mediamtx的包后进行解压,得到以下文件:

运行mediamtx.exe文件(可以通过指令方式运行,也可以点击exe文件直接运行):

出现上图的命令板代表这个流已经起起来了,默认rtsp的端口号为8554(这个记着,到时候python需要用到),hls的端口号为8888,webrtc的端口号为8889。

至此,启动rtsp流的步骤已经实现了,接下来就是将你要推的视频流挂载到这个流上面,我通过python去实现对本地笔记本摄像头进行推流

3、python代码

# cv2需要安装opencv-python的依赖
import cv2
import subprocess

# 摄像头设备索引(0 表示默认摄像头)
camera_index = 0

# 推流的地址
rtsp_url = "rtsp://你的ip地址:8554/stream" #8554为上面mediamtx的默认端口号,stream没有特别的意义,单纯是我本人起的一个路径

# 打开本地摄像头
cap = cv2.VideoCapture(camera_index)

# 检查摄像头是否打开
if not cap.isOpened():
    print("无法打开摄像头")
    exit()

# 获取摄像头分辨率
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = int(cap.get(cv2.CAP_PROP_FPS))

# FFmpeg 推流命令
command = [
    "ffmpeg",
    "-y",  # 覆盖输出文件
    "-f", "rawvideo",  # 输入格式
    "-pix_fmt", "bgr24",  # 像素格式
    "-s", f"{width}x{height}",  # 分辨率
    "-r", str(fps),  # 帧率
    "-i", "-",  # 从标准输入读取
    "-vf", "scale=1280:720",
    "-c:v", "libx264",  # 视频编码
    "-preset", "ultrafast",  # 编码速度
    "-b:v", "512k",  # 视频码率
    "-tune", "zerolatency",  # 低延迟
    "-rtsp_transport", "tcp",  # RTSP 传输协议
    "-f", "rtsp",  # 输出格式
    rtsp_url  # 推流地址
]

# 启动 FFmpeg 进程
process = subprocess.Popen(command, stdin=subprocess.PIPE)

try:
    while True:
        # 获取摄像头帧率
        ret, frame = cap.read()
        if not ret:
            print("获取摄像头帧率失败")
            break

        # 将帧写入 FFmpeg 的标准输入
        process.stdin.write(frame.tobytes())

        # 显示帧(可选)
        cv2.imshow("Camera", frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):  # 按 q 退出
            break
finally:
    # 释放资源
    cap.release()
    process.stdin.close()
    process.wait()
    cv2.destroyAllWindows()

运行python代码 

如上图则运行成功,这时就可以通过各种途径访问了

VLC:rtsp://你的域名:8554/stream

HLS:http://你的域名:8888/stream (这个可以直接通过浏览器进行访问)

webrtc:http://你的域名:8889/stream/whep (这个也可以直接通过浏览器进行访问,但是有可能同局域网内其他用户访问时会被防火墙拦截。这里我的前端项目用的是这个方式访问流,后期如果有空再出一个vue3项目实现webrtc推流功能的文章)

本人技术有限,如有大佬发现小弟的bug欢迎指出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值