FFmpeg 4.2 音频解码

2020-03-10  本文已影响0人  woo_5857

static void decode(AVCodecContext *dec_ctx, AVPacket *pkt, AVFrame *frame,

                   FILE*outfile)

{

    inti, ch;

    intret, data_size;

    /* send the packet with the compressed data to the decoder */

    ret =avcodec_send_packet(dec_ctx, pkt);

    if(ret <0) {

        fprintf(stderr, "Error submitting the packet to the decoder\n");

        //exit(1);

    }

    /* read all the output frames (in general there may be any number of them */

    while(ret >=0) {

        ret =avcodec_receive_frame(dec_ctx, frame);

        if(ret ==AVERROR(EAGAIN) || ret ==AVERROR_EOF)

            return;

        elseif(ret <0) {

            fprintf(stderr, "Error during decoding\n");

            //exit(1);

        }

        data_size =av_get_bytes_per_sample(dec_ctx->sample_fmt);

        if(data_size <0) {

            /* This should not occur, checking just for paranoia */

            fprintf(stderr, "Failed to calculate data size\n");

            //exit(1);

        }

        for(i =0; i < frame->nb_samples; i++)

            for(ch =0; ch < dec_ctx->channels; ch++)

                fwrite(frame->data[ch] + data_size*i,1, data_size, outfile);

    }

}

//音频解码

int ffmpegVideoToAudio1(const char *src_fileName, const char *dst_fileName) {

    constchar*outfilename, *filename;

    constAVCodec*codec;

    AVCodecContext *c= NULL;

    AVCodecParserContext *parser = NULL;

    intlen, ret;

    FILE*f, *outfile;

    uint8_t inbuf[AUDIO_INBUF_SIZE + AV_INPUT_BUFFER_PADDING_SIZE];

    uint8_t*data;

    size_t  data_size;

    AVPacket*pkt;

    AVFrame*decoded_frame =NULL;

    filename    = src_fileName;

    outfilename = dst_fileName;

    pkt =av_packet_alloc();

    /* find the MPEG audio decoder */

    codec =avcodec_find_decoder(AV_CODEC_ID_MP2);

    if(!codec) {

        fprintf(stderr, "Codec not found\n");

        //exit(1);

    }

    parser =av_parser_init(codec->id);

    if(!parser) {

        fprintf(stderr, "Parser not found\n");

        //exit(1);

    }

    c =avcodec_alloc_context3(codec);

    if(!c) {

        fprintf(stderr, "Could not allocate audio codec context\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 */

    data      = inbuf;

    data_size =fread(inbuf,1,AUDIO_INBUF_SIZE, f);

    while(data_size >0) {

        if(!decoded_frame) {

            if(!(decoded_frame =av_frame_alloc())) {

                fprintf(stderr, "Could not allocate audio frame\n");

                //exit(1);

            }

        }

        ret =av_parser_parse2(parser, c, &pkt->data, &pkt->size,

                               data, data_size,

                               AV_NOPTS_VALUE,AV_NOPTS_VALUE,0);

        if(ret <0) {

            fprintf(stderr, "Error while parsing\n");

            exit(1);

        }

        data      += ret;

        data_size -= ret;

        if(pkt->size)

            decode(c, pkt, decoded_frame, outfile);

        if(data_size

            memmove(inbuf, data, data_size);

            data = inbuf;

            len =fread(data + data_size,1,

                        AUDIO_INBUF_SIZE- data_size, f);

            if(len >0)

                data_size += len;

        }

    }

    /* flush the decoder */

    pkt->data=NULL;

    pkt->size=0;

    decode(c, pkt, decoded_frame, outfile);

    fclose(outfile);

    fclose(f);

    avcodec_free_context(&c);

    av_parser_close(parser);

    av_frame_free(&decoded_frame);

    av_packet_free(&pkt);

    return 0;

}

上一篇 下一篇

猜你喜欢

热点阅读