⾳频解码过程如下图所示:
FFmpeg流程
关键函数
关键函数说明:
- avcodec_find_decoder:根据指定的AVCodecID查找注册的解码器。
- av_parser_init:初始化AVCodecParserContext。
- avcodec_alloc_context3:为AVCodecContext分配内存。
- avcodec_open2:打开解码器。
- av_parser_parse2:解析获得⼀个Packet。
- avcodec_send_packet:将AVPacket压缩数据给解码器。
- avcodec_receive_frame:获取到解码后的AVFrame数据。
- av_get_bytes_per_sample: 获取每个sample中的字节数。
关键数据结构
关键数据结构说明:
AVCodecParser:⽤于解析输⼊的数据流并把它分成⼀帧⼀帧的压缩编码数据。⽐较形象
的说法就是把⻓⻓的⼀段连续的数据“切割”成⼀段段的数据。⽐如AAC aac_parser
AVCodecParser ff_aac_parser = {
codec_ids = { AV_CODEC_ID_AAC },
priv_data_size = sizeof(AACAC3ParseContext),
parser_init = aac_parse_init,
parser_parse = ff_aac_ac3_parse,
parser_close = ff_parse_close,
};
从AVCodecParser结构的实例化我们可以看出来,不同编码类型的parser是和CODE_ID进⾏绑定的。可以通过CODE_ID查找到对应的码流 parser。
avcodec编解码API介绍
avcodec_send_packet、avcodec_receive_frame的API是FFmpeg3版本加⼊的。为了正确
的使⽤它们,有必要阅读FFmpeg的⽂档说明 ffmpeg官方文档。
FFmpeg提供了两组函数,分别⽤于编码和解码:
解码:avcodec_send_packet()、avcodec_receive_frame()。
解码:avcodec_send_frame()、avcodec_receive_packet()。
API的设计与编解码的流程⾮常贴切。
建议的使⽤流程如下:
1. 设置并打开AVCodecContext。
2. 输⼊有效的数据:
- 解码:调⽤avcodec_send_packet()给解码器传⼊包含原始的压缩数据的AVPacket对象。
- 编码:调⽤ avcodec_send_frame()给编码器传⼊包含解压数据的AVFrame对象。
两种情况下推荐AVPacket和AVFrame都使⽤refcounted(引⽤计数)的模式,否则libavcodec可能不得不对输⼊的数据进⾏拷⻉。
3. 在⼀个循环体内去接收codec的输出,即周期性地调⽤av