美文网首页
FFmpeg 4.2 音频解码

FFmpeg 4.2 音频解码

作者: woo_5857 | 来源:发表于2020-03-10 15:40 被阅读0次

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;

}

相关文章

  • FFMpeg 解码流程

    1. FFMpeg 解码流程 1.1 FFMpeg解码流程图解 1.2 FFMpeg解码代码流程 以下的音频解码的...

  • 音视频同步

    上两篇文章单独写了FFmpeg解码视频与播放《FFmpeg音频解码播放》《FFmpeg视频解码播放》在项目中不可能...

  • FFmpeg视频解码播放

    在上篇文章中讲到了FFmpeg解码音频,对于FFmpeg解码视频与音频解码流程大致相同。其区别在于播放的方式与逻辑...

  • 音视频开发之旅(35) -FFmpeg + AudioTrack

    目录 音频解码流程 解码音频为pcm 使用AudioTrack播放音频 资料 收获 上一篇我们了解了FFmpeg解...

  • FFmpeg C++多线程解码音频数据

    1. C++多线程解码音频数据 之前总结过一篇 FFMpeg 解码流程的博客FFMpeg 解码流程 接下来,对照着...

  • FFmpeg音频解码

    //第一步:组册组件 av_register_all(); //第二步:打开封装格式->打开文件 //...

  • FFmpeg 音频解码

    基础知识预备 物体震动引起空气震动,震动波形在空气中传播到耳朵的时候,造成耳膜的震动,从而接受到声音信号,自然界中...

  • FFmpeg音频解码

    FFmpeg音频解码和上一章的视频解码流程差不多。区别在视频有像素格(YUV RGB)式而音频有采样格式(PCM ...

  • FFmpeg4Android:音频解码

    6 FFmpeg4Android:音频解码 音频解码,就是将视频文件中的音频部分抽离出来,生成PCM文件,并使用A...

  • Android NDK开发之旅30--NDK-FFmpeg音频解

    音频解码实现 音频解码也是直接使用FFmpeg的API来做。 其中,JNI实现如下: 最终会输出pcm格式的文件。...

网友评论

      本文标题:FFmpeg 4.2 音频解码

      本文链接:https://www.haomeiwen.com/subject/wsbcjhtx.html