本系列 以 ffmpeg4.4 源码为准,主要讲解 ffplay 的 RTMP 协议解析,播放。本文使用的命令如下:
ffplay -i rtmp://192.168.0.122/live/livestream
前两篇文章 《FFplay源码分析-rtmp入口》 《FFplay源码分析-rtmp_open》 其实已经讲解了 avformat_open_input()
函数内部的一部分的逻辑,就是已经知道 RTMP 链接建立,然后读取到第一个 音视频包的逻辑。但是还有一部分逻辑没讲,就是探测 av_probe_input_buffer2()
函数,如下图:
av_probe_input_buffer2()
主要是读一部分 RTMP 数据,判断出来 AVInputFormat
是 flv
。
至此, init_input()
函数的逻辑就讲完了。avformat_open_input()
函数后续的代码没有太多的需要分析的地方,比较简单。
结合之前两篇文章,画一个 avformat_open_input()
函数整体的流程图:
本文重点:
ffplay 播放 RTMP 流的时候,解复用器使用的是 flv 的解复用器。这个其实 跟 ffplay 播放本地 flv 文件非常相似,只是 ffplay 会把 RTMP 音视频包转成 flv 的tag 模式的包,然后再丢给 flv 解复用器。
由于笔者的水平有限, 加之编写的同时还要参与开发工作,文中难免会出现一些错误或者不准确的地方,恳请读者批评指正。如果读者有任何宝贵意见,或者希望交流音视频技术的,可以加我微信 Loken1。