们使用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);
5806

被折叠的 条评论
为什么被折叠?



