RKNN3588——利用rtmp、ffmpeg视频推流

 1. 在客户端运行rtsp_server(mediamtx.exe)服务器

下载链接:https://github.com/bluenviron/mediamtx

使用教程:https://blog.youkuaiyun.com/qq_20937557/article/details/132271507?spm=1001.2014.3001.5501

2. 在服务端利用ffmpeg向rtmp服务器推流

import cv2
 
# subprocess 模块允许我们启动一个新进程,并连接到它们的输入/输出/错误管道,从而获取返回值。
import subprocess
 
# 视频读取对象
cap = cv2.VideoCapture(60)
 
# 推流地址
rtmp = "rtmp://192.168.129.160/live/stream"# 推流的服务器地址
# rtsp = "rtsp://192.168.227.160:8000/live/stream"# 推流的服务器地址
# 设置推流的参数
command = ['ffmpeg',
           '-y',
           '-f', 'rawvideo',
           '-vcodec', 'rawvideo',
           '-pix_fmt', 'bgr24',
           '-s', '640*480',  # 根据输入视频尺寸填写
           '-r', '8',
           '-i', '-',
            '-b:v', '8000k', # 限制视频码率
            '-maxrate', '9600k', # 最大码率
            '-bufsize', '160000k', # 缓冲区大小

           '-qmin','1',
           '-qmax','10',
           '-c:v', 'h264_rkmpp', # h264
           '-pix_fmt', 'yuv420p',
           '-preset', 'ultrafast',
           '-f', 'flv',
           rtmp]
 
# command = [
#               'ffmpeg',
#               '-y', # 覆盖输出文件
#               '-f', 'rawvideo', # 输入格式为原始视频
#               '-vcodec', 'rawvideo', # 输入编解码器为 rawvideo
#               '-pix_fmt', 'bgr24', # 输入像素格式
#               '-s', '640x480', # 输入分辨率
#               '-r', '30', # 输入帧率
#               '-i', '-', # 从标准输入读取
#               '-c:v', 'h264', # 输出编解码器为 libx264
#               '-b:v', '8000k', # 限制视频码率
#               '-maxrate', '9600k', # 最大码率
#               '-bufsize', '160000k', # 缓冲区大小
#               '-qmin', '1', # 最小质量
#               '-qmax', '20', # 最大质量
#               '-pix_fmt', 'yuv420p', # 输出像素格式
#               '-preset', 'ultrafast', # 编码速度
#               '-f', 'rtsp', # 输出格式为 rtsp
#               '-rtsp_transport', 'udp', # 使用 TCP 进行 RTSP 传输
#               rtsp # RTSP 推流地址
# ]
 
# 创建、管理子进程
pipe = subprocess.Popen(command, stdin=subprocess.PIPE)
size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
 
# 循环读取
while cap.isOpened():
    # 读取一帧
    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)
 
    # 按键退出
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
 
    # 读取尺寸、推流
    img = cv2.resize(frame, size)
 
    pipe.stdin.write(img.tobytes())
    
 
# 关闭窗口
cv2.destroyAllWindows()
 
# 停止读取
cap.release()

3. 用VLC media player在客户端接收来自服务器的视频流

下载地址:https://www.videolan.org/vlc/

4. ffmpeg常用命令

获得图片

ffmpeg -rtsp_transport tcp -i "rtsp://admin:a1234567@192.168.1.64:554/h264/ch1/main/av_stream" -vframes 1 -y output.png 

参数含义
-rtsp_transport tcp使用 TCP 避免 UDP 丢帧(建议开启)
-vframes 1-frames:v 1只提取 1 帧
-q:v 1JPEG 图像质量设置中 1 表示最高质量(范围是 1–31,1 为最好)
-update 1如果持续保存帧到同一个文件,可启用该参数,保存最新帧(非必须)
-y自动覆盖旧图像

获得视频

 ffmpeg -rtsp_transport tcp -i "rtsp://admin:a1234567@192.168.10.101:554/h264/ch1/main/av_stream" \
-c:v libx264 -preset slow -crf 18 -t 00:01:00 -y output_high.mp4

参数说明
-c:v libx264使用 H.264 编码
-crf 18Constant Rate Factor,18 表示非常高质量(越小越清晰,推荐范围 18–23)
-preset slow编码预设(越慢质量越好),可选:ultrafast, fast, medium, slow, slower
-t 00:01:00录制时长(此处是 1 分钟)
-y自动覆盖输出文件

 

### RK3588平台使用ZLMediaKit实现RTSP #### 准备工作 为了在RK3588平台上成功部署并运行基于ZLMediaKit的RTSP服务,需完成一系列准备工作。这包括但不限于获取必要的软件包、配置环境变量以及安装依赖项。 - **获取源码** ZLMediaKit是一个开源项目,可以从GitHub仓库克隆最新版本到本地环境中[^2]。 ```bash git clone https://github.com/ZLMediakit/ZLMediaKit.git cd ZLMediaKit ``` - **准备工具链** 对于RK3588这样的ARM架构设备来说,通常需要特定版本的交叉编译器来构建应用程序。确保已下载适用于目标系统的预编译工具链或自行搭建适合的交叉编译环境。 #### 编译与安装OpenSSL 由于ZLMediaKit依赖于OpenSSL提供安全传输支持,在继续之前还需要先编译和安装适配于嵌入式Linux系统的OpenSSL库。 ```bash tar xf openssl-*.tar.gz && cd openssl-* ./Configure linux-generic32 shared --prefix=/usr/local/ssl -fPIC no-hw no-engine make depend make sudo make install export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/ssl/lib/pkgconfig/ ``` 上述命令序列展示了如何针对通用32位Linux系统编译静态链接形式下的OpenSSL库,并将其安装至指定路径下以便后续环节能够顺利找到所需的头文件及动态链接库。 #### 配置ZLMediaKit 进入ZLMediaKit根目录后执行如下操作: ```bash mkdir build && cd build cmake .. make -j$(nproc) sudo make install ``` 此过程会读取CMakeLists.txt脚本定义的各项参数设置,自动检测当前主机环境特性从而生成相应的Makefile文件用于指导实际编译程;`-j$(nproc)`选项允许充分利用多核CPU加速整个编译进度。 #### 实现RTSP功能 当所有前置条件均已满足之后,则可着手编写具体的应用逻辑代码片段以达成预期目的——即利用ZLMediaKit框架向远端客户端送实时音视频媒体资源。下面给出了一段简单的Python示例程序说明怎样创建一个基本的服务实例并向外界暴露可供访问的RTSP URL地址[^3]: ```cpp #include "Rtsp/RtspServer.h" using namespace mediakit; int main() { // 初始化日志模块,默认输出级别为INFO Tool::SetLogHandler([](const char *log){ printf("%s\n", log); }); // 启动RTSP服务器监听0.0.0.0:554端口上的连接请求 RtspServer::Instance().start("0.0.0.0", 554); // 注册自定义业务处理类对象关联至某一路直播频道ID(此处仅为示意) auto track = std::make_shared<RtspTrack>(); track->setOnPlay([track](std::shared_ptr<RtspMediaSource> &src, const SockAddr& addr, uint32_t session_id, bool is_play) { LOGI(L"Client %u.%u.%u.%u:%d play/pause stream", (uint8_t)(addr.sin_addr.s_addr >> 24), (uint8_t)(addr.sin_addr.s_addr >> 16), (uint8_t)(addr.sin_addr.s_addr >> 8), (uint8_t)(addr.sin_addr.s_addr), ntohs(addr.sin_port)); }); // 将轨道加入到名为test的播放列表中去 RtspMediaSource::Instance()[StringPrintf("rtsp://%s/test", getLocalIp().c_str())].addTrack(track); while(true){sleep(1);} // 死循环保持进程存活状态 return 0; } ``` 这段代码实现了启动一个简易版RTSP Server的功能,它会在后台持续等待来自外部网络节点发起的新建会话尝试直至接收到有效的PLAY指令才正式开始发送多媒体数据报文给对方解析显示出来。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张飞飞飞飞飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值