FFmpeg开发笔记(八十二)使用国产直播服务器smart_rtmpd执行推流操作
<span data-cke-copybin-start="1"><span data-cke-copybin-start="1"></span></span><span id="cke_bm_2820S">《FFmpeg开发实战:从零基础到短视频上线》一书的“10.2.2 FFmpeg向网络推流”介绍了轻量级流媒体服务器MediaMTX,通过该工具可以测试RTSP/RTMP等流媒体协议的推拉流。不过MediaMTX的功能比较简单,也不方便个性化定制,如今出现了国产的直播服务器smart_rtpmd,更适合日常开发调试使用。</span><p><span id="cke_bm_2820S"> smart_rtpmd是一款用于直播且录播性能卓越的流媒体服务器,相当于nginx+rtmp,或者是简化版的SRS和ZLMediaKit。smart_rtpmd开源且跨平台,支持Windows、Linux(含Ubuntu、CentOS等)、FreeBSD、ARM64等操作系统。smart_rtpmd支持的视频格式包括H.264、H.265、VP8等,支持的音频格式包括AAC、OPUS等。<br>
smart_rtpmd的源码托管地址为https://github.com/superconvert/smart_rtmpd(星星数0.6k),国内的镜像地址为https://gitee.com/superconvert/smart_rtmpd,最新版本是2025年3月发布的smart_rtpmd_v2025.03.10,可见该框架的源码更新十分及时。<br>
smart_rtpmd不依赖其他第三方库,下载后的压缩包文件解压即可运行。以Windows系统的smart_rtpmd程序为例,它的解压步骤说明如下:<br>
1、下载smart_rtpmd的源码得到压缩包smart-rtmpd-master.zip。<br>
2、解压smart-rtmpd-master.zip包,找到smart-rtmpd-master目录下的压缩包rtmpd.zip。<br>
3、解压rtmpd.zip包,找到rtmpd目录下的压缩包smart-rtmpd-win.zip。<br>
4、解压smart-rtmpd-win.zip包,得到smart_rtmpd_win目录,,里面的smart_rtmpd.exe便是可运行于Windows系统的smart_rtpmd服务器程序。<br>
双击smart_rtmpd.exe弹出smart_rtpmd管理界面,单击右下角的启动按钮如下图所示,即可开启smart_rtpmd的直播推流服务。</span></p>
<p><span class="cke_widget_wrapper cke_widget_inline cke_widget_image cke_image_nocaption cke_widget_selected" data-cke-display-name="图像" data-cke-filter="off" data-cke-widget-id="19" data-cke-widget-wrapper="1"><span class="cke_reset cke_widget_drag_handler_container"><span class="cke_image_resizer" title="点击并拖拽以改变尺寸"><span class="cke_widget_edit_container" title="编辑图片"><img src="https://img2024.cnblogs.com/blog/729938/202510/729938-20251005161056234-1725242266.png"></span></span></span></span></p>
<p>由日志可见,smart_rtpmd开启了下列五项流媒体服务:<br>
1、侦听1935端口的RTMP服务,对应的流媒体播放地址是rtmp://127.0.0.1:1935/live/stream;<br>
2、侦听8554端口的RTSP服务,对应的流媒体播放地址是rtsp://127.0.0.1:8554/live/stream;<br>
3、侦听8080端口的HTTP(HLS)服务,对应的流媒体播放地址是http://127.0.0.1:8080/live/stream.m3u8;<br>
4、侦听8888端口的TURN.TCP(WebRTC)服务;<br>
5、侦听9000端口的SRT服务;<br>
接下来验证smart_rtpmd的实际推拉流情况。打开MSYS窗口,进入《FFmpeg开发实战:从零基础到短视频上线》一书第十章的源码目录,执行下面的编译命令。</p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected" data-cke-display-name="代码段" data-cke-filter="off" data-cke-widget-id="18" data-cke-widget-wrapper="1">
<pre class="cke_widget_element" data-cke-widget-data="%7B%22code%22%3A%22gcc%20pushvideo.c%20-o%20pushvideo%20-I%2Fusr%2Flocal%2Fffmpeg%2Finclude%20-L%2Fusr%2Flocal%2Fffmpeg%2Flib%20-lavformat%20-lavdevice%20-lavfilter%20-lavcodec%20-lavutil%20-lswscale%20-lswresample%20-lpostproc%20-lm%22%2C%22classes%22%3Anull%7D" data-cke-widget-keep-attr="0" data-cke-widget-upcasted="1" data-widget="codeSnippet"><code class="hljs">gcc pushvideo.c -o pushvideo -I/usr/local/ffmpeg/include -L/usr/local/ffmpeg/lib -lavformat -lavdevice -lavfilter -lavcodec -lavutil -lswscale -lswresample -lpostproc -lm</code></pre>
</div>
<p>编译完成后执行以下命令启动测试程序,期望把2018.mp4推给smart_rtpmd的RTSP推流地址rtsp://127.0.0.1:8554/live/stream。</p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected" data-cke-display-name="代码段" data-cke-filter="off" data-cke-widget-id="17" data-cke-widget-wrapper="1">
<pre class="cke_widget_element" data-cke-widget-data="%7B%22code%22%3A%22.%2Fpushvideo%20..%2Ffile%2F2018.mp4%20rtsp%3A%2F%2F127.0.0.1%3A8554%2Flive%2Fstream%22%2C%22classes%22%3Anull%7D" data-cke-widget-keep-attr="0" data-cke-widget-upcasted="1" data-widget="codeSnippet"><code class="hljs">./pushvideo ../file/2018.mp4 rtsp://127.0.0.1:8554/live/stream</code></pre>
</div>
<p>打开另一个MSYS窗口,同样进入《FFmpeg开发实战:从零基础到短视频上线》一书第十章的源码目录,执行下面的编译命令。</p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected" data-cke-display-name="代码段" data-cke-filter="off" data-cke-widget-id="16" data-cke-widget-wrapper="1">
<pre class="cke_widget_element" data-cke-widget-data="%7B%22code%22%3A%22gcc%20pullvideo.c%20-o%20pullvideo%20-I%2Fusr%2Flocal%2Fffmpeg%2Finclude%20-L%2Fusr%2Flocal%2Fffmpeg%2Flib%20-I%2Fusr%2Flocal%2Fsdl2%2Finclude%20-L%2Fusr%2Flocal%2Fsdl2%2Flib%20-lsdl2%20-lavformat%20-lavdevice%20-lavfilter%20-lavcodec%20-lavutil%20-lswscale%20-lswresample%20-lpostproc%20-lm%22%2C%22classes%22%3Anull%7D" data-cke-widget-keep-attr="0" data-cke-widget-upcasted="1" data-widget="codeSnippet"><code class="hljs">gcc pullvideo.c -o pullvideo -I/usr/local/ffmpeg/include -L/usr/local/ffmpeg/lib -I/usr/local/sdl2/include -L/usr/local/sdl2/lib -lsdl2 -lavformat -lavdevice -lavfilter -lavcodec -lavutil -lswscale -lswresample -lpostproc -lm</code></pre>
</div>
<p>编译完成后执行以下命令启动测试程序,期望从rtsp://127.0.0.1:8554/live/stream拉取视频流并弹窗播放。</p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected" data-cke-display-name="代码段" data-cke-filter="off" data-cke-widget-id="15" data-cke-widget-wrapper="1">
<pre class="cke_widget_element" data-cke-widget-data="%7B%22code%22%3A%22.%2Fpullvideo%20rtsp%3A%2F%2F127.0.0.1%3A8554%2Flive%2Fstream%22%2C%22classes%22%3Anull%7D" data-cke-widget-keep-attr="0" data-cke-widget-upcasted="1" data-widget="codeSnippet"><code class="hljs">./pullvideo rtsp://127.0.0.1:8554/live/stream</code></pre>
</div>
<p>然后果真弹出一个SDL窗口,正在播放从RTSP服务拉取的视频画面如下图所示,说明smart_rtpmd正确实现了RTSP协议的流媒体转发功能。</p>
<p><span class="cke_widget_wrapper cke_widget_inline cke_widget_image cke_image_nocaption cke_widget_selected" data-cke-display-name="图像" data-cke-filter="off" data-cke-widget-id="14" data-cke-widget-wrapper="1"><span class="cke_reset cke_widget_drag_handler_container"><span class="cke_image_resizer" title="点击并拖拽以改变尺寸"><span class="cke_widget_edit_container" title="编辑图片"><img src="https://img2024.cnblogs.com/blog/729938/202510/729938-20251005161122204-1579451953.png"></span></span></span></span></p>
<p>如果改成RTMP协议实现推拉流的话,需要把推流命令改成下面这样,表示向RTMP地址推流:</p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected" data-cke-display-name="代码段" data-cke-filter="off" data-cke-widget-id="13" data-cke-widget-wrapper="1">
<pre class="cke_widget_element" data-cke-widget-data="%7B%22code%22%3A%22.%2Fpushvideo%20..%2Ffile%2F2018.mp4%20rtmp%3A%2F%2F127.0.0.1%3A1935%2Flive%2Fstream%22%2C%22classes%22%3Anull%7D" data-cke-widget-keep-attr="0" data-cke-widget-upcasted="1" data-widget="codeSnippet"><code class="hljs">./pushvideo ../file/2018.mp4 rtmp://127.0.0.1:1935/live/stream</code></pre>
</div>
<p>注意pushvideo.c的代码需要按照前一篇文章《FFmpeg代码对RTSP和RTMP的推流区别》的说明加以修改,才能支持RTMP协议的视频推流。<br>
对应的拉流命令要改成下面这样,表示从RTMP地址拉流:</p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected" data-cke-display-name="代码段" data-cke-filter="off" data-cke-widget-id="12" data-cke-widget-wrapper="1">
<pre class="cke_widget_element" data-cke-widget-data="%7B%22code%22%3A%22.%2Fpullvideo%20rtmp%3A%2F%2F127.0.0.1%3A1935%2Flive%2Fstream%22%2C%22classes%22%3Anull%7D" data-cke-widget-keep-attr="0" data-cke-widget-upcasted="1" data-widget="codeSnippet"><code class="hljs">./pullvideo rtmp://127.0.0.1:1935/live/stream</code></pre>
</div>
<p>更多详细的FFmpeg开发知识参见<span class="cke_widget_wrapper cke_widget_inline cke_widget_csdnlink cke_widget_selected" data-cke-display-name="a" data-cke-filter="off" data-cke-widget-id="11" data-cke-widget-wrapper="1">《FFmpeg开发实战:从零基础到短视频上线》一书。</span></p><br><br>
来源:https://www.cnblogs.com/aqi00/p/19126675
頁:
[1]