们使用ffmpeg进行音频解码 音频解码主要使用的函数是avcodec_decode_audio4。 可以参考下面的页面 [1]
int avcodec_decode_audio4 ( AVCodecContext * avctx, AVFrame * frame, int * got_frame_ptr, const AVPacket * avpkt )
几个参数的 [in] avctx 指的是解码器的参数 (下面会讲如何获取) [out] frame 解码之后的frame [out] got_frame_ptr 如果这个值是0,表示没有解析出来frame,但是不一定代表没有有错误,因为有些delay的情况是也是设置为0,后面再去解析的。 [in] 我们的数据源,其中 avpkt->data是解析的数据,avpkt->size是包的大小。 返回值 如果是负数,则表示错误,其他的数表示的解码出来的数据大小。 这个函数的主要作用是将指向avpkt-data地址的,avpkt->size的数据解码成raw的音频数据。 这里raw的音频数据我们主要用PCM编码的数据,就是之前讲的去掉wav头的数据。
整体流程如下:
1.1 使用avformat_open_input(&inFmt,filename,NULL,NULL)函数获取infmt, 记得infmt要初始化为NULL。 这个函数的作用是打开一个流,同时获取头文件。 1.2 查找音频流 /* Find audio stream */ audioStreamNum=-1; for(i=0; i<inFmt->nb_streams; i++) { if(inFmt->streams[i]->codec->codec_type==AVMEDIA_TYPE_AUDIO && audioStreamNum < 0) { audioStreamNum=i; } } if(audioStreamNum==-1) return -1; inCodecCtx=inFmt->streams[audioStreamNum]->codec; 1.3 找到解码器 /* find the audio decoder */ codec = avcodec_find_decoder(inCodecCtx->codec_id); if (!codec) { fprintf(stderr, "Codec not found\n"); exit(1); } 1.4 打开文件 /* open the input file or stream */ if (avcodec_open2(inCodecCtx, codec, NULL) < 0) { fprintf(stderr, "Could not open codec\n"); exit(1); } 1.5 获取packet av_read_frame(inFmt, &avpkt) 1.6 解码 avcodec_decode_audio4(inCodecCtx, decoded_frame, &got_frame, &avpkt);