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)相关推荐

  1. 流媒体服务器之rtp协议,rtcp协议,rtsp协议,sdp协议,sip协议简析

    0.前言 流媒体服务器做音视频媒体传输主要就两件事:媒体回话协商,媒体数据传输:下面这几种协议就围绕着这两个需求而产生. 1.rtp协议 rtp的全称是实时传输协议RTP(Real-time Tran ...

  2. 邮件服务器之POP3协议分析

    第1章. POP3概述 POP3全称为Post Office Protocol version3,即邮局协议第3版.它被用户代理用来邮件服务器取得邮件.POP3采用的也是C/S通信 模型,对应的RFC ...

  3. 邮件服务器之SMTP协议分析

    第1章. SMTP概述 1.1. SMTP在邮件通信过程中的位置 SMTP,即简单邮件传送协议,所对应RFC文档为RFC821.同http等多数应用层协议一样,它工作在C/S模式下,用来实现因特网上的 ...

  4. android全平台基于ffmpeg解码本地MP4视频推流到RTMP服务器

    音视频实践学习 android全平台编译ffmpeg以及x264与fdk-aac实践 ubuntu下使用nginx和nginx-rtmp-module配置直播推流服务器 android全平台编译ffm ...

  5. QT软件开发-基于FFMPEG设计录屏与rtsp、rtmp推流软件(支持桌面与摄像头)(一)

    QT软件开发-基于FFMPEG设计录屏与rtsp.rtmp推流软件(支持桌面与摄像头)(一) https://xiaolong.blog.csdn.net/article/details/126954 ...

  6. QT软件开发-基于FFMPEG设计录屏与rtsp、rtmp推流软件(支持桌面与摄像头)(四)

    QT软件开发-基于FFMPEG设计录屏与rtsp.rtmp推流软件(支持桌面与摄像头)(一) https://xiaolong.blog.csdn.net/article/details/126954 ...

  7. 音视频方案,音视频扩展内容(RTMP,FFMpeg/H.26*/mpeg*/AVC等标准与协议)(笔记)1,视频格式

    视频方案,雷霄骅的专栏- http://blog.csdn.net/leixiaohua1020  > SI, TI   ITU-R BT.1788建议使用时间信息(TI,Temporal pe ...

  8. 音视频 RTMP协议分析

    理解字节序 大小端模式 理解字节序 Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端:Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的 ...

  9. rtmp协议分析(三次握手)

    RTMP详细分析(Message 消息,Chunk分块) librtmp分析(发送数据包处理) librtmp分析(接收数据包处理) RTMP协议是Real Time Message Protocol ...

  10. RTMP/RTSP推送端和RTMP/RTSP播放端录像设计探讨

    好多开发者认为,无论是RTSP/RTMP推送端还是RTSP/RTMP播放端,涉及到录像,只要2个接口足矣:开始录像.停止录像. 实际场景下,一个好的录像模块,2个接口远远不够, 本文以大牛直播SDK( ...

最新文章

  1. C#和SqlServer中处理时间格式问题
  2. asp.net的资料
  3. Vue计算属性、方法、侦听器
  4. 物联网大数据平台有哪些功能特点
  5. JVM的4种垃圾回收算法、垃圾回收机制与总结
  6. 【工作手札】日常工作笔记
  7. SpringBoot +spring security 与CSRF有关的几个 问题
  8. 卖地方特色才产品,类似湖南味道那样的网上专卖店
  9. 《麦肯锡方法》第9章 头脑风暴-思维导图
  10. CMMI 4高级别过程改进案例介绍
  11. CentOS 7 部署开源sip信令服务器 —— 筑梦之路
  12. 收藏 | 电子元器件图片、名称、符号图形对照
  13. 苹果id退不出来显示连接服务器,退出苹果id显示尚未连接互联网
  14. 2022 火狐插件 Tamper Data 下载安装使用教程
  15. 简单A/BTest验证图片懒加载效果
  16. win7(64位)+vs2010+orge1.8.1
  17. 施工现场资料员15个常见问题处理流程!
  18. python在大数据分析中的应用
  19. 两台计算机互联方案,如何让两台电脑直接用网线互联.docx
  20. ubuntu14.04安装搜狗输入法

热门文章

  1. pragma预处理指令详解
  2. 动态规划(Dynamic Programming)理论篇
  3. 美团首次展现无人配送链条,发布末端配送机器人 | CES 2019...
  4. 高并发业务接口开发思路(实战)
  5. 探究requestDisallowInterceptTouchEvent失效的原因
  6. WebView 简单使用方法
  7. html中空格的编码
  8. 使用SESSION实现PHP会话的步骤
  9. 中国精英这才是真相:我们需要信仰,我们需要思想导师
  10. C#操作Win7/Win8的库、收藏夹