ffmpeg代码学习计划(持续更新)

来源:互联网 发布:制作电子相册软件 编辑:程序博客网 时间:2024/05/17 02:05

最近学习FFmpeg代码,好记性不如烂笔头,代码较复杂,入坑要小心,为了避免不小心沉浸在代码的海洋里,在此列个代码学习计划,学习习惯因人而异,这里仅供参考:

注:部分分析其他大神(如雷神等)已经做过,所以就不再重新写,直接加个传送门过去。

一、概览

FFmpeg代码比较复杂,在没熟悉之前建议先不要急着看代码,再说,这么多代码你也不知道从哪里看起。不防泡杯热茶,看看代码的整体结构,先在脑海里勾勒一幅草图:

《FFmpeg源代码结构》


二、找入口

FFmpeg源码提供4个工程:ffmpeg、ffplay、ffprobe和ffserver。由于最近在研究播放器,所以直接从ffplay代码入手研究。

ffmpeg:一个快速的音视频转换工具。比如各种音视频格式转换,音频采样率转换,视频码率、质量转换等。
ffplay:一个简单的使用FFmpeg库和SDL库的播放器。
ffprobe:收集多媒体流的信息并以易读的方式输出。比如检查多媒体流的容器封装格式以及媒体流内部的格式和类型。
ffserver:一个音视频流服务器。


学习ffplay:《ffplay.c函数结构简单分析》

三、从点到线

解码

avformat_open_input():打开媒体。
avformat_find_stream_info():获得媒体信息。
av_read_frame():获取一帧压缩编码数据(即一个AVPacket)。
avcodec_decode_video2():解码一个AVPacket的第一个视频帧,若一个AVPacket包含多个视频帧,则需要多次调用此方法。

avcodec_decode_audio4():解码一个AVPacket的第一个音频帧,若一个AVPacket包含多个音频帧,则需要多次调用此方法。

avformat_close_input():关闭和释放一个AVFormatContext,与avformat_open_input相对应。


注:上面几个函数可以理解成一些点,熟悉这些点之后再回头review一遍《FFmpeg源代码结构》的解码流程和《ffplay.c函数结构简单分析》,把这些点串成一条解码线路,以加深对代码的理解。


编码

avformat_write_header():写流媒体封装格式头。
avcodec_encode_video2():编码一帧视频。

avcodec_encode_audio2():编码一帧音频。
av_write_frame():封装输出一个音视频包。
av_write_trailer():写流媒体封装格式尾。


四、扩展

TBD

1 0