首页 > 其他分享 >FFmpeg开发笔记(四十二)使用ZLMediaKit开启SRT视频直播服务

FFmpeg开发笔记(四十二)使用ZLMediaKit开启SRT视频直播服务

时间:2024-07-28 12:30:09浏览次数:9  
标签:ZLMediaKit FFmpeg SRT cpp 576478 poller event MediaServer

​《FFmpeg开发实战:从零基础到短视频上线》一书在第10章介绍了轻量级流媒体服务器MediaMTX,通过该工具可以测试RTSP/RTMP等流媒体协议的推拉流。不过MediaMTX的功能实在是太简单了,无法应用于真实直播的生产环境,真正能用于生产环境的流媒体服务器还要看SRS或者ZLMediaKit。

ZLMediaKit是一款国产的开源流媒体服务器,支持RTSP、RTMP、SRT等主流直播协议,它的安装说明参见之前的文章《Linux环境安装ZLMediaKit实现视频推流》。结合ZLMediaKit与ffmpeg实现RTSP/RTMP协议的推流功能,已在《Linux环境安装ZLMediaKit实现视频推流》一文中详细介绍,这里单独讲解如何通过ZLMediaKit与ffmpeg实现SRT协议的推流功能。
ZLMediaKit在编译和启动的时候已经默认支持SRT,查看ZLMediaKit的配置文件config.ini,找到srt部分的配置信息如下,可见ZLMediaKit默认把9000端口分配给SRT协议。

[srt]
latencyMul=4
pktBufSize=8192
port=9000
timeoutSec=5

除此以外,ZLMediaKit无需另外调整什么配置,只要在启动之后运行下面的ffmpeg命令即可将视频文件向SRT地址推流。注意,务必确保Linux服务器上的FFmpeg已经集成了libsrt库,否则ffmpeg无法向srt地址推流,详细的集成步骤参见之前的文章《Linux环境给FFmpeg集成libsrt和librist》。

ffmpeg -re -stream_loop -1 -i "/usr/local/src/test/cctv5.ts" -c copy -f mpegts 'srt://127.0.0.1:9000?streamid=#!::r=live/test,m=publish'

注意,上面命令中的srt地址后半段为“r=live/test,m=publish”,其中“r=live/test”表示SRT的服务名称叫做“live/test”,而“m=publish”表示该地址属于发布功能也就是给推流方使用。
ZLMediaKit对视频源文件的封装格式也有要求,不仅要求源文件为ts格式,还要求推流格式也为ts格式,所以ffmpeg命令中添加了“-f mpegts”表示转换成mpeg的ts流格式。如果源文件不是ts格式,或者没转成mpegts格式,后续通过ffplay播放srt链接都会报下面的错误。

non-existing PPS 0 referenced

此外,ZLMediaKit支持的音视频编码标准罗列在src/Extension/Frame.h中,详细的音视频支持标准如下所示。

#define CODEC_MAP(XX) \
    XX(CodecH264,  TrackVideo, 0, "H264", PSI_STREAM_H264, MOV_OBJECT_H264)          \
    XX(CodecH265,  TrackVideo, 1, "H265", PSI_STREAM_H265, MOV_OBJECT_HEVC)          \
    XX(CodecAAC,   TrackAudio, 2, "mpeg4-generic", PSI_STREAM_AAC, MOV_OBJECT_AAC)   \
    XX(CodecG711A, TrackAudio, 3, "PCMA", PSI_STREAM_AUDIO_G711A, MOV_OBJECT_G711a)  \
    XX(CodecG711U, TrackAudio, 4, "PCMU", PSI_STREAM_AUDIO_G711U, MOV_OBJECT_G711u)  \
    XX(CodecOpus,  TrackAudio, 5, "opus", PSI_STREAM_AUDIO_OPUS, MOV_OBJECT_OPUS)    \
    XX(CodecL16,   TrackAudio, 6, "L16", PSI_STREAM_RESERVED, MOV_OBJECT_NONE)       \
    XX(CodecVP8,   TrackVideo, 7, "VP8", PSI_STREAM_VP8, MOV_OBJECT_VP8)             \
    XX(CodecVP9,   TrackVideo, 8, "VP9", PSI_STREAM_VP9, MOV_OBJECT_VP9)             \
    XX(CodecAV1,   TrackVideo, 9, "AV1", PSI_STREAM_AV1, MOV_OBJECT_AV1)             \
    XX(CodecJPEG,  TrackVideo, 10, "JPEG", PSI_STREAM_JPEG_2000, MOV_OBJECT_JPEG)

由此可见,如果待推流的视频文件不属于上面的音视频编码标准,将无法通过SRT服务地址正常推流。
运行ffmpeg的SRT推流命令之后,ZLMediaKit输出以下的日志信息,可见其SRT推流功能正常运行。

[MediaServer] [576478-event poller 0] SrtSession.cpp:103 onRecv | 1-11(127.0.0.1:33630) 
[MediaServer] [576478-event poller 0] SrtTransportImp.cpp:166 operator() | test(127.0.0.1:33630) 允许 srt 推流
[MediaServer] [576478-event poller 0] Decoder.cpp:143 onTrack | Got track: H264
[MediaServer] [576478-event poller 0] Decoder.cpp:143 onTrack | Got track: mpeg4-generic
[MediaServer] [576478-event poller 0] Decoder.cpp:97 onStream | Add track finished
[MediaServer] [576478-event poller 0] MediaSink.cpp:161 emitAllTrackReady | All track ready use 172ms
[MediaServer] [576478-event poller 0] MediaSource.cpp:517 emitEvent | 媒体注册:fmp4://__defaultVhost__/live/test
[MediaServer] [576478-event poller 0] MultiMediaSourceMuxer.cpp:551 onAllTrackReady | stream: schema://__defaultVhost__/app/stream , codec info: mpeg4-generic[48000/2/16] H264[1280/720/25] 
[MediaServer] [576478-event poller 0] MediaSource.cpp:517 emitEvent | 媒体注册:rtmp://__defaultVhost__/live/test
[MediaServer] [576478-event poller 0] MediaSource.cpp:517 emitEvent | 媒体注册:rtsp://__defaultVhost__/live/test
[MediaServer] [576478-event poller 0] MediaSource.cpp:517 emitEvent | 媒体注册:ts://__defaultVhost__/live/test
[MediaServer] [576478-event poller 0] MediaSource.cpp:517 emitEvent | 媒体注册:hls://__defaultVhost__/live/test

接着按照《FFmpeg开发实战:从零基础到短视频上线》一书“1.3  Windows系统安装FFmpeg”的介绍,在个人电脑上安装FFmpeg并打开MSYS的命令行,运行下面的ffplay命令,期望从SRT地址拉流播放。注意,务必确保电脑上的FFmpeg已经集成了libsrt库,否则ffplay无法播放srt链接,详细的集成步骤参见之前的文章《Windows环境给FFmpeg集成libsrt》。

ffplay -i 'srt://124.xxx.xxx.xxx:9000?streamid=#!::r=live/test,m=request'

上面的SRT拉流地址与之前的推流地址大同小异,除了把内网IP换成外网IP之外,就是把链接末尾的“m=publish”改成了“m=request”,其中request表示请求也就是用于拉流方。
ffplay运行后弹出播放器窗口,正常播放视频画面和声音。同时观察ZLMediaKit的服务日志如下所示:

[MediaServer] [576478-event poller 0] SrtSession.cpp:103 onRecv | 2-16(112.5.138.145:57022) 
[MediaServer] [576478-event poller 0] SrtTransport.cpp:731 onShutdown | peer close connection
[MediaServer] [576478-event poller 0] SrtSession.cpp:118 one rror | 2-16(112.5.138.145:57022) 6(peer close connection)
[MediaServer] [576478-event poller 0] SrtTransportImp.cpp:14 ~SrtTransportImp | test(112.5.138.145:57022) srt 播放器(__defaultVhost__/live/test)断开,耗时(s):16

从以上日志可见,ZLMediaKit通过SRT协议成功实现了视频直播的SRT推拉流功能。

更多详细的FFmpeg开发知识参见《FFmpeg开发实战:从零基础到短视频上线》一书。

 

标签:ZLMediaKit,FFmpeg,SRT,cpp,576478,poller,event,MediaServer
From: https://www.cnblogs.com/aqi00/p/18288642

相关文章

  • Win10 安装Bus Hound 后重启失败,启动修复 无法修复你的电脑 日志文件: E:\WINDOWS
    工作中用到了串口通讯,找到了BusHound,当安装完后提示重启,重启后直接启动失败。怀疑主要原因是安装了不支持Win10的BusHound版本,因为安装BusHound后会在系统中添加一个驱动: bhound7.sys,当Windows启动时加载bhound7.sys驱动失败导致Windows启动失败. 尝试了很多方法,包括进......
  • FFmpeg开发笔记(四十一)结合OBS与MediaMTX实现SRT直播推流
    ​《FFmpeg开发实战:从零基础到短视频上线》一书的“10.2 FFmpeg推流和拉流”提到直播行业存在RTSP和RTMP两种常见的流媒体协议。除此以外,还有于2017年推出的SRT协议,相比常见的RTMP协议,SRT协议具有更低的延迟,并且消除了卡帧、抖动等花屏现象。腾讯视频云已经引入了SRT协议,在实践......
  • Windosw下Visual Studio2022编译FFmpeg(支持x264、x265、fdk-acc)
            FFmpeg 7.0版本移除了6.0之前已弃用的API,无法向下兼容。所以编译的版本选择FFmpeg6.1.1。一、安装VisualStudio2022可参考另外一篇文章:Windows安装VisualStudio2022+QT5.15开发环境_qt5.15.2vs2022-CSDN博客 二、安装MSYS2下载地址:https://www......
  • 基于LVGL9.0、FFmpeg、OpenCV的Linux智能家居监控安防系统(含演示视频)
    文章目录介绍硬件层面软件层面技术栈驱动程序应用程序项目设计可优化项演示视频介绍智能家居监控安防系统是一个集成监控、安防、人脸识别、环境监测、家居控制的一体化系统。它包含5大模块,分别是:视频监控:支持查看摄像头、拍照、录像、直播和检测到人体时自动拍......
  • Ubuntu构建ZLMediaKit流媒体服务框架(含webrtc)
    参照:https://segmentfault.com/a/11900000417378481.获取代码代码从git获取,如果没安装git,需要执行sudoapt-getinstallgitcd/opt#拉取项目代码gitclonehttps://github.com/ZLMediaKit/ZLMediaKit.git#国内用户推荐从同步镜像网站gitee下载gitclone--depth1https:......
  • nvenc 用于 ffmpeg 硬件加速,使用 moviepy 生成损坏的 mp4
    我一直在尝试创建一个Python应用程序,它需要一个mp4文件、一个mp3文件和一个字幕字典来生成一个输出mp4文件。我让它工作得很好,但我发现libx264编解码器调用write_videofile()时会非常慢,尤其是使用CompositeVideoClip对象时。我想使用我的GPU来......
  • FFmpeg 常用功能
    1.无损快速分割视频1.1:从01:45秒开始截取,一直到结束。备注:这个执行过程非常快。cdC:\MyFiles\FFmpeg\ffmpeg-v2022-03-09\ffmpeg\binffmpeg-i"D:\周星驰《功夫》.mp4"-ss00:01:45-codeccopy"D:\周星驰《功夫》_裁剪后.mp4"  1.1:从01:45秒开始截取,持续一分......
  • 【CentOS】CentOS7上安装使用ffmpeg
    安装CentOS7核心存储库中不提供FFmpeg:方案一、源码编译安装FFmpeg,方案二、使用NuxDextop存储库中的yum安装它。本文采用方案二 步骤一:启用EPEL仓库Nux存储库依赖于Epel软件存储库sudoyuminstallepel-release 步骤二:启用NuxDextop仓库sudorpm--importht......
  • ffmpeg内存模型
    FFmpeg内存模型在FFmpeg中,当从现有的Packet拷贝一个新Packet时,有两种情况:数据共享:两个Packet的buf引用的是同一数据缓存空间。这种情况下,需要注意数据缓存空间的释放问题。一个数据块同时被两个AVPacket(avpacket1和avpacket2)引用。此时,两者持有的是同一数据。数据独立:两个P......
  • ffmpeg解码基本流程
    1.分配解码器上下文AVCodecContext*avcodec_alloc_context3(constAVCodec*codec);首先,需要为解码器分配一个上下文,这一步通过avcodec_alloc_context3函数完成。这个函数会返回一个指向AVCodecContext结构的指针,它将保存解码器的相关信息。2.将码流中的编解码器信息拷贝到......