最近学习FFmpeg代码,好记性不如烂笔头,代码较复杂,入坑要小心,为了避免不小心沉浸在代码的海洋里,在此列个代码学习计划,学习习惯因人而异,这里仅供参考:
注:部分分析其他大神(如雷神等)已经做过,所以就不再重新写,直接加个传送门过去。
一、概览
FFmpeg代码比较复杂,在没熟悉之前建议先不要急着看代码,再说,这么多代码你也不知道从哪里看起。不防泡杯热茶,看看代码的整体结构,先在脑海里勾勒一幅草图:
二、找入口
三、从点到线
解码
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