音频解码详解

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

你可能感兴趣的:(音频解码详解)