FFMpeg--音频解码初识

之前成功将FFmpeg集成进了iOS工程,现在借助前辈的一个小的解码项目来看看如何使用FFmpeg的API来解码一个音频文件。

FFmpeg的解码的总体过程如下:

1、创建一个AVFormatContext对象,这个结构可以理解为一个解码的上下文,从打开文件信息,文件中音频流信息,包括解码器信息等都将保存在这个结构中;

2、打开音频文件,分析音频流信息,包括分析编码格式,创建、打开编码器等;

3、前面的准备工作完毕之后,通过avcoder_decode_audio相关的接口来进行解码,最终就是将aac/mp3等等编码格式解码为原始的PCM格式的数据;解码结果正确的话,通过FFplay是可以播放的;

解码主要过程:

1、第一个阶段:创建AVFormatContext对象,FFmpeg上一个非常完善的库,对于内存的管理也是仔细,在创建AVFormatContext这类关键对象的时候,都提供了相应的接口,以保证对内存和数据的正确管理,所以AVFormat创建方式如下:

avFormatContext = avformat_alloc_context();

这个方法里面没有太多的东西,主要就是分配空间,个人认为,FFmpeg里面对对象的内存管理,抽空可以研究下,里面应该可以有很多收获;

还有一点,之前使用FFmpeg的时候,需要调用av_register_all()这个方法来注册各个组件,不过我现在使用的版本中,这个方法已经标记为废弃了,所以都是直接去初识化组件对象

2、打开音频文件,查找流信息,方法如下:

int result = avformat_open_input(&avFormatContext, filePath, NULL, NULL);
if (result != 0) {
    // 打开文件出错;
} else {
    // 打开文件成功;
}
 
avFormatContext->max_analyze_duration = 50000;
 
result = avformat_find_stream_info(avFormatContext, NULL);

在打开文件中,设置了avFormatContext的max_analyze_duration,这个变量是在后面的avformat_find_stream_info中使用,就是告诉FFmpeg读取多长的数据来分析当前流的信息, 理论上来说,这个值越大,分析到的信息就越多,具体过大有什么影响,目前我也不清楚,以后的学习中遇到再分析吧。

avformat_find_stream_info这个方法顾名思义,就是查询流的信息,查询的依据就是从文件中读出的packet数据,根据API的解释说,这个方法最有用就是查询那些数据头的文件格式,比如MPEG之类的,当然我现在也还不了解MPEG(咱再一步一步来)。同时,这个方法里面读到的数据都会被存入buffer中,解码的时候不会再重复读取;

然后接下来这个方法,让作为新手的我实在有点不太能理解

int stream_index = av_find_best_stream(avFormatContext, AVMEDIA_TYPE_AUDIO, -1, -1, NULL, 0);
if (stream_index == -1) {
    // 标识没有音频流;
}
 
AVStream *audioStream = avFormatContext->streams[stream_index];
if (audioStream->time_base.den && audioStream->time_base.num) {
     timeBase = av_q2d(audioStream->time_base);
} else if (audioStream->codec->time_base.den && audioStream->codec->time_ba
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值