要将PCM数据编码为AAC的格式,首先了解一下什么是PCM数据,所谓PCM数据就是未被压缩的音频原始数据,而aac,mp3等都是被有损压缩后的数据。未被压缩的pcm数据所占用的储存空间比较大,而被压缩后的PCM数据所占用的空间会比较小,下面我们看一下所需要设置的压缩参数。
sample_rate : 采样率,也就是每秒采集多少次声音样本
channels : 声道的数目,有单通道和双通道
sample_fmt : 采样的格式
channel_layout: 声道布局
5.bit_rate : 比特率
需要将这些数据为AVCodecContext设置。
主要流程如下:
1.初始化输出环境:
1 | AVFormatContext *ofmt_ctx = avformat_alloc_context(); |
2.设置AAC编码格式:
1 | AVCodecContext *pCodecCtx = out_stream->codec; |
3.打开编码器并向输出文件中写入文件头信息
1 | AVCodec *pCodec = avcodec_find_encoder(pCodecCtx->codec_id); |
4.设置一些参数,需要将pcm raw data压缩为aac格式
1 | AVFrame *pframe = av_frame_alloc(); |
5.读取pcm raw data并压缩为aac格式的数据写入输出文件中
1 | int count = 1; |
- 刷新编码器,将编码器中的数据写入到文件中
1 | int flush_encoder(AVFormatContext *ofmt_ctx,int stream_index){ |
7.写入文件尾部信息
1 | av_write_trailer(ofmt_ctx); |
8.释放所有申请的资源
1 | av_packet_free(&pkt); |
完整代码实现如下:
1 |
|
当我使用此代码将pcm转换到mp3的时候会出错,可能是我自己编译的ffmpeg有问题,不支持mp3格式的压缩。