FFmpeg音频的编码流程详解及demo

        本文主要讲解FFmpeg的音频编码具体流程,API使用。最后再以一个非常简单的demo演示将一个音频原始数据pcm文件编码为AAC格式的音频文件。 本文主要基于FFmpeg音频编码新接口。

一、FFmpeg音频编码API调用流程图

        音频编码的API调用流程图如下:

          API接口简单大体讲解如下:

av_register_all():注册FFmpeg所有编解码器。
 
avformat_alloc_context():初始化输出码流的AVFormatContext。
 
avio_open():打开输出文件。
 
av_new_stream():创建输出码流的AVStream。
 
avcodec_find_encoder():查找编码器。
 
avcodec_open2():打开编码器。
 
avformat_write_header():写文件头(对于某些没有文件头的封装格式,不需要此函数。比如说MPEG2TS)。
 
avcodec_send_frame():编码核心接口新接口,发送一帧音频给编码器。即是AVFrame(存储PCM数据)。
 
avcodec_receive_packet():编码核心接口新接口,接收编码器编码后的一帧音频,AVPacket(存储AAC等格式的数据)。
 
av_write_frame():将编码后的音频数据写入文件。
 
flush_encoder():输入的像素数据读取完成后调用此函数。用于输出编码器中剩余的AVPacket。
 
av_write_trailer():写文件尾(对于某些没有文件头的封装格式,不需要此函数。比如说MPEG2TS)。

        从上面可以看到,其实音频的编码流程基本与视频的编码流程一致。

二、音频编码过程API调用流程

1、注册各大组件

        这一步是ffmpeg的任何程序的第一步都是需要先注册ffmpeg相关的各大组件的:

    //注册各大组件
    av_register_all();

2、打开pcm原始数据文件

        这里除了打开pcm原始数据文件外,还定义了一个framenum变量,这个是为了简单验证需要,我们只编码framenum帧,不然若pcm太大,编码太久,可以指定自己想要的多少帧来做验证即可,赋值framenum。

    FILE *in_file=NULL;	                        //Raw PCM data
    in_file= fopen(inputPath, "rb");

    int framenum=10000;                          //Audio frame number

3、初始化输出码流的AVFormatContext

        与视频一样,有两种方式,这里我们用的方式一。

        方式一:

    //方式1
    pFormatCtx = avformat_alloc_context();
    //Guess Format
    fmt = av_guess_format(NULL, outputPath, NULL);
    pFormatCtx->oformat = fmt;

        方式二:

    //方式2
    avformat_alloc_output_context2(&pFormatCtx, NULL, NULL, out_file);
    fmt = pFormatCtx->oformat;

4、打开输出文件

    //Open output
    i
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值