首页 > 其他分享 >FFmpeg开发笔记(三十二)利用RTMP协议构建电脑与手机的直播Demo

FFmpeg开发笔记(三十二)利用RTMP协议构建电脑与手机的直播Demo

时间:2024-06-23 12:20:41浏览次数:3  
标签:__ 流媒体 FFmpeg Demo xxx 直播 rtmp RTMP

不管是传统互联网还是移动互联网,实时数据传输都是刚需,比如以QQ、微信为代表的即时通信工具,能够实时传输文本和图片。其中一对一的图文通信叫做私聊,多对多的图文通信叫做群聊。

除了常见的图文即时通信,还有实时音视频通信,比如一对一的音频通话、一对一的视频通话等等,此时可采用WebRTC技术,有关WebRTC的编程开发及其项目实战参见《Android Studio开发实战:从零基础到App上线(第3版)》一书的第20章“20.2  给App集成WebRTC”。

但是一对多的在线直播采用WebRTC技术就不太合适了,因为WebRTC只管打洞把双方的网络打通,不考虑综合负载。一旦连接WebRTC的设备多起来,整个WebRTC网络就会瘫痪。那么一对多的在线直播就要考虑部署独立的流媒体服务器,通过专门的流媒体传输协议,处理媒体源的音视频格式转换,以及音频流和视频流的数据分发工作。更多详细的FFmpeg开发知识参见《FFmpeg开发实战:从零基础到短视频上线》一书。

一、常见的四种流媒体传输协议对比

常见的流媒体传输协议主要有下面几类:

  1. RTSP协议:网络延迟很低,且支持倍速播放功能。但客户端的对该协议支持很弱,不仅ios不支持播放rtsp流,连大多数浏览器也不能直接播放rtsp流。而且RTSP对服务端的复杂度要求比较高,以至流媒体服务器SRS干脆放弃支持RTSP协议,直播录制软件OBS Studio也没支持该协议。目前RTSP主要应用于对实时性要求高的安防监控领域。
  2. RTMP协议:网络延迟较低,稳定性很高,即使网络连接质量欠佳,该协议也能很好地传输数据。但RTMP原本因FLV格式而生,客户端要用Flash播放器播放rtmp链接。而FLV格式后来没落了,以至HTML5规范干脆移除了Flash插件,导致如今浏览器都不支持rtmp链接,连FFmpeg也迟至6.1版才给rtmp协议支持hevc格式。不过好在RTMP的稳定性高,服务端的实现相对容易,因此被大量应用于网络直播领域。
  3. SRT协议:拥有固定延迟特性,可以抹平网络的抖动,大大降低视频画面的卡顿现象。该协议引入了AES加密算法,无需像RTSP和RTMP那样引入专门的SSL证书。作为较新的流媒体协议,SRT支持更多的音视频封装格式。只是该协议的支持库libsrt在2017年才开源,因此未能在移动互联网时代大量铺开,目前主要应用于大型电视直播领域。
  4. RIST协议:该协议同样于2017年提出,与SRT协议是竞争关系。RIST和SRT具有相同的加密级别,都支持大容量流媒体和前向纠错功能。该协议的制定时间比SRT还晚,虽然晚制定会多考虑新功能,比如RIST支持点到多点广播,而SRT不支持;但是晚制定拖累了各开源软件对RIST的支持力度,比如OBS Studio早在25.0开始支持SRT,迟至27.0才开始支持RIST,另一个直播录制软件RootEncoder已支持SRT尚未支持RIST,流媒体服务器MediaMTX已支持SRT尚未支持RIST。目前RIST在国内的应用还很少。

综上所述,虽然RTMP协议不够完善,但胜在出现早,赶上了好时代,现为国内直播领域主流的流媒体协议。下面就以RTMP为例,介绍如何通过OBS Studio和RTMP Streamer向流媒体服务器做RTMP推流。

二、电脑端通过OBS Studio进行RTMP直播推流

首先启动电脑上的流媒体服务器MediaMTX,具体的操作步骤详见《FFmpeg开发实战:从零基础到短视频上线》一书的“10.2  FFmpeg推流和拉流”,也可参考之前的文章《详解MediaMTX的推拉流》。
接着启动电脑上的直播录制软件OBS Studio,具体的操作步骤详见之前的文章《使用OBS Studio开启RTMP直播推流》。之后让OBS Studio对MediaMTX的rtmp地址“rtmp://127.0.0.1:1935/stream”推流,推流过程的OBS Studio录制界面如下图所示。

然后启动电脑上的流媒体播放器VLC media player,打开网络串流“rtmp://127.0.0.1:1935/stream”,此时VLC media player的视频播放界面如下图所示。

结合OBS Studio的直播录制画面和VLC media player的直播观看界面,可知通过OBS Studio成功实现了RTMP协议的直播功能。

三、手机端通过RTMP Streamer进行RTMP直播推流

首先启动云服务上的流媒体服务器SRS或者ZLMediaKit,在云服务器上部署和启动SRS或者ZLMediaKit比较麻烦,三言两语说不清楚。如果大家想弄明白如何在云服务器上操作SRS或者ZLMediaKit,可在京东自营购买《FFmpeg开发实战:从零基础到短视频上线》一书,联系作者咨询这两个流媒体服务器在云服务器上的详细运行过程。
接着启动手机上的直播录制软件RTMP Streamer,具体的操作步骤详见之前的文章《使用RTMP Streamer开启APP直播推流》。之后让RTMP Streamer对SRS或者ZLMediaKit的rtmp地址“rtmp://124.xxx.xxx.xxx/live/test”推流,推流过程的RTMP Streamer录制界面如下图所示。

观察华为云上的ZLMediaKit日志如下,可见RTMP Streamer正在向后端的流媒体服务器推送直播流:

[MediaServer] [412449-event poller 0] RtmpProtocol.cpp:442 check_C1_Diges | check rtmp complex handshark success!
[MediaServer] [412449-event poller 0] RtmpSession.cpp:128 operator() | 1-11(223.xxx.xxx.xxx:61202) publish 回复时间:0ms
[MediaServer] [412449-event poller 0] MediaSource.cpp:517 emitEvent | 媒体注册:rtmp://__defaultVhost__/live/test
[MediaServer] [412449-event poller 0] MediaSink.cpp:161 emitAllTrackReady | All track ready use 215ms
[MediaServer] [412449-event poller 0] MediaSource.cpp:517 emitEvent | 媒体注册:fmp4://__defaultVhost__/live/test
[MediaServer] [412449-event poller 0] MultiMediaSourceMuxer.cpp:551 onAllTrackReady | stream: rtmp://__defaultVhost__/live/test , codec info: mpeg4-generic[32000/2/16] H264[480/640/0] 
[MediaServer] [412449-event poller 0] MediaSource.cpp:517 emitEvent | 媒体注册:rtsp://__defaultVhost__/live/test
[MediaServer] [412449-event poller 0] MediaSource.cpp:517 emitEvent | 媒体注册:ts://__defaultVhost__/live/test
[MediaServer] [412449-event poller 0] MediaSource.cpp:517 emitEvent | 媒体注册:hls://__defaultVhost__/live/test

然后启动电脑上的流媒体播放器VLC media player,打开网络串流“rtmp://xxx.xxx.xxx/live/test”,此时VLC media player的视频播放界面如下图所示。

观察华为云上的ZLMediaKit日志如下,可见VLC media player正在从后端的流媒体服务器拉取直播流:

[MediaServer] [412449-event poller 0] RtmpProtocol.cpp:442 check_C1_Digest | check rtmp complex handshark success!
[MediaServer] [412449-event poller 0] RtmpSession.cpp:367 operator() | 2-16(112.xxx.xxx.xxx:51055) play 回复时间:1ms

结合RTMP Streamer直播录制画面和VLC media player的直播观看界面,可知通过RTMP Streamer成功实现了RTMP协议的直播功能。
更多详细的FFmpeg开发知识参见《FFmpeg开发实战:从零基础到短视频上线》一书。

 

标签:__,流媒体,FFmpeg,Demo,xxx,直播,rtmp,RTMP
From: https://www.cnblogs.com/aqi00/p/18239882

相关文章

  • Linux平台I2C多字节数据、按页连续读写E2PROM Demo(AT24C16)
    1)Linux平台I2C多字节数据按页连续读写E2PROM之AT24C16小知识,分享给将要学习或者正在学习Linux平台I2C多字节按页连续读写E2PROM开发的同学。2)内容属于原创,若转载,请说明出处。3)提供相关问题有偿答疑和支持。我测试使用的是 E2PROM(AT24C16)芯片,其中内部地址是1010 外部的地......
  • SqlserverCDCcrudSourceSink mssql数据实时同步demo
    packageorg.hu.fk.datastream_connector;importcom.alibaba.fastjson.JSON;importcom.alibaba.fastjson.JSONObject;importcom.ververica.cdc.connectors.base.options.StartupOptions;importcom.ververica.cdc.connectors.shaded.org.apache.kafka.connect.data.Fie......
  • FFmpeg开发笔记(三十一)使用RTMP Streamer开启APP直播推流
    ​RTMPStreamer是一个安卓手机端的开源RTMP直播推流框架,可用于RTMP直播和RTSP直播,其升级版还支持SRT直播(腾讯视频云就采用SRT协议)。RTMPStreamer支持的视频编码包括H264、H265、AV1等等,支持的音频编码包括AAC、G711、OPUS等等,可谓功能强大的APP直播框架。由于升级版的RTMPStre......
  • 米尔全志T527系列加推工控板和工控机,更多工业场景DEMO
    自米尔首发基于全志T527系列核心板以来,这款基于八核CPU的高性能国产核心板得到广大客户的好评。这款产品支持Android13、Linux5.15操作系统,还将适配Ubuntu系统,满足开发者们更灵活地开发各种创新应用。米尔为满足不同的客户需求,推出基于全志T527的全系列的产品:米粉派T527、MYD-LT5......
  • ffmpeg安装
    静态安装(推荐)https://johnvansickle.com/ffmpeg/上传到/usr/localtar-xvfffmpeg-release-amd64-static.tar.xz重命名mvffmpeg-7.0-amd64-static/ffmpegvi/etc/profile在exportPATH之后添加:#SetffmpegenvironmentPATH=$PATH:/usr/local/ffmpeg/binsource/e......
  • WPF绘制3D小demo
    试过了WPF原生3D和HelixToolkit.Wpf,感觉还是SharpDX的效果比较好,所以使用了HelixToolkit.Wpf.SharpDX初学,仅供参考,没搞懂怎么双面渲染,所以每个面用了2个三角形分别显示正面和反面 <Grid><hx:Viewport3DXEnableSwapChainRendering="True"FXAALevel="Low"Backg......
  • DEMO_02:随机数获取;数组集合遍历;整型与字符串转换;字符串字符遍历;数组/集合排序
    /***考核点:随机数获取;数组集合遍历;整型与字符串转换;字符串字符遍历;数组/集合排序*<p>*题目:*1.使用while循环获取20个五位数随机数并打印;*2.遍历20个数,筛选出随机数中3的倍数,并统计个数;*3.符合2的数中,找出五位数中3的倍数和位置*4.符合2的数中,把这五位数......
  • H5移动端加载预览pdf文件——demo
    前言:正常情况下需要在HTML中嵌入本地docx或pdf文件时,我们会有以下解决办法:1.使用<iframe>标签2.使用<embed>标签3.使用<object>标签4.使用第三方库(如PDF.js)当实际操作时,会发现前三种方式在pc端支持,但在移动端不支持,因为这些标签在移动端浏览器中的支持并不统一。为了兼容移......
  • 基于哔哩哔哩视频库的音频提取播放器,实现下载B站音频到本地,方便把鬼畜下载到手机上,项
    importreimportjsonimportthreadingimporttimeimportosimportshutilimportsubprocessimportrequestsimportPySimpleGUIassgos.environ['PYGAME_HIDE_SUPPORT_PROMPT']="hide"frompygameimportmixersg.theme('SystemDef......
  • DEMO_01:List数据存储,回调函数,集合转字符串,元素去重
    *题目:*1.构建属性结构List<DemoNode>data,根据本包的data.png中数据结构图将数据存入data中(字就是nodeName)*2.将树形结构List<DemoNode>里面的元素全部遍历出来存放到List<String>list中,输出结果转换成字符串:粉粉碎机被粉碎机粉碎了怎么办*3.将list里元素去重后......