花了一段时间把mcodec前辈 (www.cnblogs.com/mcodec)简化的ffplay大致看完,那个工程不记得在什么地方
下载的了,自己重新上传下。下载地址https://files.cnblogs.com/hacqing/ffmepg_avi.rar
1. 红色字体的first_protocol first_iformat first_avcodec, 这三个不同的头指针,分别为ffmpeg支持
不同的数据源、不同格式以及不同编码的音视频数据提供了处理的可能。
2. ffplay主要划分为四大部分: 数据源, 解复用, 解码, 显示播放. ffplay使用SDL库进行视频显示和声音播放,
至于同步在ffplay中自个做的.
首先, 谈谈数据源相应的数据结构: URLContext, ByteIOContext. 这两个与音视频数据相关, URLProtocol
体现在功能函数上. 上图中, URLContext的 void *priv_data 指向了FILE结构体, 其实这是作者的一点点失误,
ffmpeg使用的是c的底层io, 没有使用stdio. c底层io是不带缓存的, 所以加上了ByteIOContext为无缓冲io提供缓
存, 避免频繁的进行i/o操作.
其次, 解复用对应的数据结构: AVFormatContext中的void *priv_data字段, AVStream, AVStream中void *
priv_data结合AVInputeFormat的使用, 从下一层的ByteIOContext的buffer中将音视频数据分离. (我对这部分理解
的不好, 特别是那个xxx_read_packet(...)很是不懂)
最后, 解码对应的数据结构: AVCodecContext, AVCodec体现在功能函数上, 其中AVCodecContext的void *
priv_data字段是特定的decodec.
数据源 --> char *buffer --> 解复用 --> AVPacket(音频包, 视频包) --> 解码 --> AVFrame(video) / audio_buffer(audio).
3. 搞忘记了, 还有比较重要的没有说, 就发表了...真尴尬. 三个指针first_protocol, first_iformat, first_avcodec.
first_protocol将file, tcp, udp, rtp...数据当成协议看待, 各自均提供URLProtocol结构体实例以功能函数的形式进行
体现. first_iformat将ffmpeg所支持的所有格式串连到一起, first_avcodec将ffmpeg支持的所有编码器串连到一起.
三个指针链表是如何, 确定相应实例的呢?
a. (first_protocol, argv[1]参数) 参数例如: file://pathname/filename 协议: file, 默认也为file; rtsp://ip_address/filename 协议:rtsp
b. (first_iformat, is->iformat->read_probe())
c. (first_avcodec, is->iformat->read_head())