ZLMediaKit的转流流程(二)

在前面提到的转流流程还有一个细节:

  • 推流端和拉流端如果协议相同,则没有组视频帧的过程,而是直接转发。
  • 如果不相同,则有视频组帧,再打包的过程。

直接转发

这里以Rtmp推流端为例子。
RtmpSession中,有一个_push_src的成员变量,它是RtmpMediaSourceImp类型,作为一个Rtmp的源。
RtmpMediaSourceImp中有MultiMediaSourceMuxer成员变量_muxer,它是一个各种协议的muxer类,将视频帧按不同的协议进行拆包。可以看看这篇文章

在文件RtmpMediaSourceImp.cppsetProtocolOption方法中,创建对象_muxer时,关闭了rtmp的muxer。如下代码:

//关闭rtmp的muxer
_option.enable_rtmp = false;
//创建MultiMediaSourceMuxer对象
_muxer = std::make_shared<MultiMediaSourceMuxer>(_tuple, _demuxer->getDuration(), _option);

作为源的RtmpMediaSource对象会注册到全局MediaSource中(MediaSource可以看看这篇文章),作为rtmp的源。
**如果有rtmp的拉流端则会直接使用这个源,以RtmpMediaSource_ring成员作为转流结构,而它类型定义如下:

using RingDataType = std::shared_ptr<toolkit::List<RtmpPacket::Ptr> >;
using RingType = toolkit::RingBuffer<RingDataType>;

可以看到这个RingBuffer中的类型就是RtmpPacket。可见是没有组帧(视频)的过程是直接转发。RTSP也是如此流程。

以视频帧转发

当转流需要MultiMediaSourceMuxer中的suorce作为源时,此时就涉及到了组帧,拆包的过程了。这里的核心就是MultiMediaSourceMuxer。下面是它的类图

ZLMediaKit中的MediaSink.jpg
视频帧的转发的被抽象为一个FrameDispathcer类,它有一个std::map<void,FrameWriteInterface>类型的成员变量,存放的就是Frame的消费者。
Frame通过inputFrame方法,将Frame转发至各个FrameWriteInterface类型的消费者中。MultiMediaSourceMuxer就是FrameWriteInterface类型。

RtmpDemux,RtspDemux中,通过信令协商产生了对应的音视频的Track,视频对应的Track为H265TrackH264Track,它们都是具体的FrameDispathcer类型,数据将由它们转发。下面Frame的牛转图。

ZLMediaKit转流流程.png
在以Rtsp为源的情况下,RtspDemuxer::inputRtp方法传入的是rtp包,经过H264RtpDecoder后就将rtp包组成了视频帧。视频帧再通过FrameDispatcher体系,最终到达MultiMediaSourceMuxer中各个类型的source,视频帧又被拆分为各协议对应的包。

### ZLMediaKit 推流地址配置 在 `zlmediakit` 中,为了成功推送 WebSocket FLV 流或其他类型的媒体流,需要正确配置推流参数。这些参数通常括服务器地址、端口号以及使用的传输协议等信息。 #### 配置文件说明 对于基于配置文件的方式,在 `conf/mediaServer.xml` 或者其他指定位置的 XML 文件里定义如下结构: ```xml <MediaServer> <!-- ... --> <Rtmp> <Port>1935</Port> <Enable>true</Enable> </Rtmp> <Http> <Port>80</Port> <WebSocketPort>8080</WebSocketPort> <Enable>true</Enable> </Http> <!-- 其他服务配置... --> </MediaServer> ``` 此部分设置了 RTMP 和 HTTP/WebSocket 服务的相关选项[^3]。 #### 使用命令行工具进行推流 除了通过修改配置文件外,还可以利用 FFmpeg 命令来完成向 ZLMediaKit 进行推流的操作。下面是一个简单的例子,展示了如何使用 FFmpeg 将本地摄像头捕获的画面实时上传到运行中的 ZLMediaKit 实例上: ```bash ffmpeg -f dshow -i video="Integrated Camera" \ -vcodec libx264 -preset ultrafast -tune zerolatency -b:v 500k \ -f flv rtmp://localhost:1935/live/stream_key ``` 这段脚本实现了从设备读取视频数据并编码成 H.264 格式的码流,最后将其发送至位于同一台机器上的 ZLMediaKit (假设其监听于默认端口),其中 `/live/stream_key` 是自定义的应用名加流密钥组合[^2]。 #### C++ API 示例代码 如果希望集成更复杂的逻辑,则可以考虑采用 SDK 提供的功能接口来进行编程操作。这里给出一段简化的 C++ 代码片段用于展示基本流程: ```cpp #include "PushStream.h" int main() { // 初始化网络环境和其他必要资源 std::string url = "rtmp://server_ip:port/app_name/stream_id"; PushStream pusher(url); while (!should_stop()) { auto frame_data = capture_next_video_frame(); if(!frame_data.empty()){ pusher.sendFrame(frame_data); } } // 清理工作... } ``` 上述程序创建了一个名为 `pusher` 的对象实例,并指定了目标 URL 地址;接着在一个循环体内不断获取新的图像帧并通过调用成员函数 `sendFrame()` 发送给远端服务器[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

mo4776

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

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

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

打赏作者

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

抵扣说明:

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

余额充值