ffmpeg音频解码

这几天花了好多时间熟悉ffmpeg音视频处理。其实音频解码并不难,这里不多解释,贴出代码供参考。


/*
 * Audio decoding.
 */
static void audio_decode(const char *outfilename, const char *filename)
{
    AVCodec *codec;
    AVCodecContext *c= NULL;
    int len;
    FILE *f, *outfile;
    uint8_t inbuf[AUDIO_INBUF_SIZE + FF_INPUT_BUFFER_PADDING_SIZE];
    AVPacket avpkt;
    AVFrame *decoded_frame = NULL;
    AVFormatContext *avformatContext=NULL;
    
    av_register_all();
    av_init_packet(&avpkt);

    printf("Decode audio file %s to %s\n", filename, outfilename);
    //read header
    if(avformat_open_input(&avformatContext,filename,NULL,NULL)!=0){
    	fprintf(stderr,"avformat_open_input failed");
    	exit(1);
    }
    //get stream info
    if(avformat_find_stream_info(avformatContext,NULL)<0){

    	fprintf(stderr,"av_find_stream_info failed");
    	exit(1);
    }

    av_dump_format(avformatContext,-1,filename,0);

    int audioStream=-1;
    int i;
    for(i=0;i<avformatContext->nb_streams;i++){
    	if(avformatContext->streams[i]->codec->codec_type==AVMEDIA_TYPE_AUDIO){
    		audioStream=i;
    		break;

    	}
    	if(audioStream==-1){
    		fprintf(stderr,"not found audio stream");
    		exit(1);
    	}
    }
    c=avformatContext->streams[audioStream]->codec;
    codec=avcodec_find_decoder(c->codec_id);

    if (!codec) {
        fprintf(stderr, "Codec not found\n");
        exit(1);
    }

    /* open it */
    if (avcodec_open2(c, codec, NULL) < 0) {
        fprintf(stderr, "Could not open codec\n");
        exit(1);
    }

    f = fopen(filename, "rb");
    if (!f) {
        fprintf(stderr, "Could not open %s\n", filename);
        exit(1);
    }
    outfile = fopen(outfilename, "wb");
    if (!outfile) {
        av_free(c);
        exit(1);
    }

    /* decode until eof */
    avpkt.data = inbuf;
    avpkt.size = fread(inbuf, 1, AUDIO_INBUF_SIZE, f);

    while (avpkt.size > 0) {
        int got_frame = 0;

        if (!decoded_frame) {
            if (!(decoded_frame = avcodec_alloc_frame())) {
                fprintf(stderr, "Could not allocate audio frame\n");
                exit(1);
            }
        } else
            avcodec_get_frame_defaults(decoded_frame);

        len = avcodec_decode_audio4(c, decoded_frame, &got_frame, &avpkt);
        if (len < 0) {
            fprintf(stderr, "Error while decoding\n");
            exit(1);
        }
        if (got_frame) {
            /* if a frame has been decoded, output it */
            int data_size = av_samples_get_buffer_size(NULL, c->channels,
                                                       decoded_frame->nb_samples,
                                                       c->sample_fmt, 1);
            fwrite(decoded_frame->data[0], 1, data_size, outfile);
        }
        avpkt.size -= len;
        avpkt.data += len;
        avpkt.dts =
        avpkt.pts = AV_NOPTS_VALUE;
        if (avpkt.size < AUDIO_REFILL_THRESH) {
            /* Refill the input buffer, to avoid trying to decode
             * incomplete frames. Instead of this, one could also use
             * a parser, or use a proper container format through
             * libavformat. */
            memmove(inbuf, avpkt.data, avpkt.size);
            avpkt.data = inbuf;
            len = fread(avpkt.data + avpkt.size, 1,
                        AUDIO_INBUF_SIZE - avpkt.size, f);
            if (len > 0)
                avpkt.size += len;
        }
    }

    fclose(outfile);
    fclose(f);

    avcodec_close(c);
    av_free(c);
    avcodec_free_frame(&decoded_frame);
    printf("finish..");
}


PS:水平有限,如以上内容有误,欢迎指正!


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值