ffmpeg rtmp 不清晰_SRS流媒体服务器之RTMP协议分析(2)
0.引言
阅读本文前,可以先阅读前面文章,能够帮助你更好理解本篇文章。文章列表如下:
SRS流媒体框架分析(1)
SRS流媒体之RTMP推流框架分析(2)
SRS流媒体之RTMP拉流框架分析(3)
SRS流媒体服务器之RTMP协议分析(1)
简述SRS流媒体服务器相关技术
流媒体推拉流实战之RTMP协议分析(BAT面试官推荐)
流媒体服务器架构与应用分析
手把手搭建流媒体服务器详细步骤
手把手搭建FFmpeg的Windows环境
超详细手把手搭建在ubuntu系统的FFmpeg环境
HTTP实战之Wireshark抓包分析
上篇文章主要是通过推流分析来讲解RTMP协议传输的过程,本篇文章通过拉流来讲解RTMP协议传输的过程。由于要使用WireShark抓包来分析,这时候推流就不能在win上使用ffmpeg(如果这样使用,在拉流时,会影响WireShark抓包),而是在ubuntu上使用ffmpeg推流。
讲解本篇文章前,补充下上篇文章的内容,关于推流客户端和SRS流媒体服务器的函数对应关系。
ffmpeg推流客户端 SRS流媒体服务器
gen_connect()--------发送--------------------------->SrsRtmpServer::connect_app(SrsRequest* req)
handle_invoke_result
gen_release_stream 和gen_fcpublish_stream----------发送------->SrsFMLStartPacket
handle_invoke_result
gen_create_stream-------------------发送------------------->SrsCreateStreamPacket
handle_invoke_result
1.拉流抓包分析
无论是拉流还是推流,交互协议都是固定流程,要是深入研究,需要按照spec去分析。
在ubuntu上使用ffmpeg推流命令:
ffmpeg -re -i source.200kbps.768x320.flv -vcodec copy -acodec copy -f flv -y rtmp://xxx.xxx.xxx.xxx/live/livestream
推流界面如下:
在win上使用ffmpeg去拉流,输入命令:
ffplay rtmp://xxx.xxx.xxx.xxx/live/livestream -loglevel 56
拉流界面如下:
WireShark抓包分析,
客户端拉流时与推流,大部分情况类似(如应答,设置窗口等),有些不一样。
拉流客户端给SRS流媒体服务器发送:window Acknowledgement Size 2500000|createStream()|_checkbw。拉流端ffmpeg源码如下:
其中gen_release_stream(s, rt)和gen_fcpublish_stream(s, rt)主要是在推流时用作输出使用,发送给SRS流媒体服务器,而gen_window_ack_size(s, rt)主要是在拉流时用作输入使用,拉流客户端发送给SRS流媒体服务器。
static int handle_invoke_result(URLContext *s, RTMPPacket *pkt){ RTMPContext *rt = s->priv_data; char *tracked_method = NULL; int ret = 0; if ((ret = find_tracked_method(s, pkt, 10, &tracked_method)) < 0) return ret; if (!tracked_method) { /* Ignore this reply when the current method is not tracked. */ return ret; } if (!strcmp(tracked_method, "connect")) { if (!rt->is_input) { if ((ret = gen_release_stream(s, rt)) < 0) goto fail; if ((ret = gen_fcpublish_stream(s, rt)) < 0) goto fail; } else { if ((ret = gen_window_ack_size(s, rt)) < 0) goto fail; } if ((ret = gen_create_stream(s, rt)) < 0) goto fail; if (rt->is_input) { /* Send the FCSubscribe command when the name of live * stream is defined by the user or if it's a live stream. */ if (rt->subscribe) { if ((ret = gen_fcsubscribe_stream(s, rt, rt->subscribe)) < 0) goto fail; } else if (rt->live == -1) { if ((ret = gen_fcsubscribe_stream(s, rt, rt->playpath)) < 0) goto fail; } } } else if (!strcmp(tracked_method, "createStream")) { double stream_id; if (read_number_result(pkt, &stream_id)) { av_log(s, AV_LOG_WARNING, "Unexpected reply on connect()"); } else { rt->stream_id = stream_id; } if (!rt->is_input) { if ((ret = gen_publish(s, rt)) < 0) goto fail; } else { if (rt->live != -1) { if ((ret = gen_get_stream_length(s, rt)) < 0) goto fail; } if ((ret = gen_play(s, rt)) < 0) goto fail; if ((ret = gen_buffer_time(s, rt)) < 0) goto fail; } } else if (!strcmp(tracked_method, "getStreamLength")) { if (read_number_result(pkt, &rt->duration)) { av_log(s, AV_LOG_WARNING, "Unexpected reply on getStreamLength()"); } }fail: av_free(tracked_method); return ret;}
注意:根据实际情况的抓包分析,WireShark有时候会漏掉一些包。只能当做参考使用。
确定服务器发送过来的字节,拉流客户端需要回应服务器ACK。源码如下:
static int handle_window_ack_size(URLContext *s, RTMPPacket *pkt){ RTMPContext *rt = s->priv_data; if (pkt->size < 4) { av_log(s, AV_LOG_ERROR, "Too short window acknowledgement size packet (%d)", pkt->size); return AVERROR_INVALIDDATA; } rt->receive_report_size = AV_RB32(pkt->data); if (rt->receive_report_size <= 0) { av_log(s, AV_LOG_ERROR, "Incorrect window acknowledgement size %d", rt->receive_report_size); return AVERROR_INVALIDDATA; } av_log(s, AV_LOG_DEBUG, "Window acknowledgement size = %d", rt->receive_report_size); // Send an Acknowledgement packet after receiving half the maximum // size, to make sure the peer can keep on sending without waiting // for acknowledgements. rt->receive_report_size >>= 1; return 0;}
2.重点要分析的内容
(1)metadata只发一次,流媒体会缓存metadata。
(2)SRS流媒体服务器会cache缓存I帧。
(3)协议转换,如rtmp->hls,rtmp->http-flv,这个是需要深入研究。
(4)超时退出
(5)码率统计
3.总结
本篇文章主要是对上篇文章补充及对拉流抓包分析。需要结合前面文章仔细查看。迎关注,转发,点赞,收藏,分享,评论区讨论。
后期关于项目的知识,会在微信公众号上更新,如果想要学习项目,可以关注微信公众号“记录世界 from antonio”
ffmpeg rtmp 不清晰_SRS流媒体服务器之RTMP协议分析(2)相关推荐
- 流媒体服务器之rtp协议,rtcp协议,rtsp协议,sdp协议,sip协议简析
0.前言 流媒体服务器做音视频媒体传输主要就两件事:媒体回话协商,媒体数据传输:下面这几种协议就围绕着这两个需求而产生. 1.rtp协议 rtp的全称是实时传输协议RTP(Real-time Tran ...
- 邮件服务器之POP3协议分析
第1章. POP3概述 POP3全称为Post Office Protocol version3,即邮局协议第3版.它被用户代理用来邮件服务器取得邮件.POP3采用的也是C/S通信 模型,对应的RFC ...
- 邮件服务器之SMTP协议分析
第1章. SMTP概述 1.1. SMTP在邮件通信过程中的位置 SMTP,即简单邮件传送协议,所对应RFC文档为RFC821.同http等多数应用层协议一样,它工作在C/S模式下,用来实现因特网上的 ...
- android全平台基于ffmpeg解码本地MP4视频推流到RTMP服务器
音视频实践学习 android全平台编译ffmpeg以及x264与fdk-aac实践 ubuntu下使用nginx和nginx-rtmp-module配置直播推流服务器 android全平台编译ffm ...
- QT软件开发-基于FFMPEG设计录屏与rtsp、rtmp推流软件(支持桌面与摄像头)(一)
QT软件开发-基于FFMPEG设计录屏与rtsp.rtmp推流软件(支持桌面与摄像头)(一) https://xiaolong.blog.csdn.net/article/details/126954 ...
- QT软件开发-基于FFMPEG设计录屏与rtsp、rtmp推流软件(支持桌面与摄像头)(四)
QT软件开发-基于FFMPEG设计录屏与rtsp.rtmp推流软件(支持桌面与摄像头)(一) https://xiaolong.blog.csdn.net/article/details/126954 ...
- 音视频方案,音视频扩展内容(RTMP,FFMpeg/H.26*/mpeg*/AVC等标准与协议)(笔记)1,视频格式
视频方案,雷霄骅的专栏- http://blog.csdn.net/leixiaohua1020 > SI, TI ITU-R BT.1788建议使用时间信息(TI,Temporal pe ...
- 音视频 RTMP协议分析
理解字节序 大小端模式 理解字节序 Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端:Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的 ...
- rtmp协议分析(三次握手)
RTMP详细分析(Message 消息,Chunk分块) librtmp分析(发送数据包处理) librtmp分析(接收数据包处理) RTMP协议是Real Time Message Protocol ...
- RTMP/RTSP推送端和RTMP/RTSP播放端录像设计探讨
好多开发者认为,无论是RTSP/RTMP推送端还是RTSP/RTMP播放端,涉及到录像,只要2个接口足矣:开始录像.停止录像. 实际场景下,一个好的录像模块,2个接口远远不够, 本文以大牛直播SDK( ...
最新文章
- C#和SqlServer中处理时间格式问题
- asp.net的资料
- Vue计算属性、方法、侦听器
- 物联网大数据平台有哪些功能特点
- JVM的4种垃圾回收算法、垃圾回收机制与总结
- 【工作手札】日常工作笔记
- SpringBoot +spring security 与CSRF有关的几个 问题
- 卖地方特色才产品,类似湖南味道那样的网上专卖店
- 《麦肯锡方法》第9章 头脑风暴-思维导图
- CMMI 4高级别过程改进案例介绍
- CentOS 7 部署开源sip信令服务器 —— 筑梦之路
- 收藏 | 电子元器件图片、名称、符号图形对照
- 苹果id退不出来显示连接服务器,退出苹果id显示尚未连接互联网
- 2022 火狐插件 Tamper Data 下载安装使用教程
- 简单A/BTest验证图片懒加载效果
- win7(64位)+vs2010+orge1.8.1
- 施工现场资料员15个常见问题处理流程!
- python在大数据分析中的应用
- 两台计算机互联方案,如何让两台电脑直接用网线互联.docx
- ubuntu14.04安装搜狗输入法