使用c ++从mp4中提取音频到mp3(不使用args执行ffmpeg)

时间:2013-04-21 13:46:38

标签: c++ mp3 converter mp4

如何以mp4视频文件格式编程转换(提取音频通道)? 因为使用c ++,我在网上找不到任何东西 我动态链接外部引擎,我可以通过c ++获取mp4文件并将其转换为mp3文件 并且不将命令行参数传递给LAME或MPLAYER或FFMPEG?

2 个答案:

答案 0 :(得分:8)

您可以尝试使用ffmpeg在c或c ++中执行此操作。这是正常的步骤流程。

  1. 使用av_register_all();

  2. 初始化ffmpeg
  3. 使用avformat_open_input(& informat,sourcefile,0,0)打开输入文件。

  4. 使用avformat_find_stream_info(informat,0)查找流信息。

  5. 通过迭代流并将codec_type与AVMEDIA_TYPE_AUDIO进行比较来查找音频流。

  6. 输入音频流后,您可以找到音频解码器并打开解码器。使用avcodec_find_decoder(in_aud_strm-> codec-> codec_id)和avcodec_open2(in_aud_codec_ctx,in_aud_codec,NULL)。

  7. 现在输出文件使用av_guess_format猜测outformat(NULL,(const char *)outfile,NULL)。

  8. 为格式化分配上下文。

  9. 使用avcodec_find_encoder(outfmt-> audio_codec)查找输出音频编码器。

  10. 添加新流音频流avformat_new_stream(outformat,out_aud_codec)。

  11. 使用所需的采样率,样本fmt,通道等填充输出编解码器上下文。

  12. 使用avio_open()打开输出文件。

  13. 使用avformat_write_header(outformat,NULL)编写输出标题。

  14. 现在在while循环开始读取数据包时,只解码音频数据包对它们进行编码并将它们写入打开的输出文件中。您可以使用av_read_frame(informat,& pkt),avcodec_decode_audio4(in_aud_codec_ctx,pframeT,& got_vid_pkt,& pkt),avcodec_encode_audio2()和av_write_frame()。

  15. 最后使用av_write_trailer编写预告片。

  16. 您可以查看ffmpeg示例中提供的demuxing.c和muxing.c。

答案 1 :(得分:1)

transcode_aac官方示例开始。我们需要的更改很少:

  1. 在文件范围内添加全局变量:

    /* The index of audio stream that will be transcoded */
    static int audio_stream_idx = -1;
    
  2. open_input_file()中,将行83-88替换为

    for (audio_stream_idx = 0; audio_stream_idx < (*input_format_context)->nb_streams; audio_stream_idx++) {
    if ((*input_format_context)->streams[audio_stream_idx]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO)
        break;
    }
    
    if (audio_stream_idx >= (*input_format_context)->nb_streams) {
        fprintf(stderr, "Could not find an audio stream\n");
        avformat_close_input(input_format_context);
        return AVERROR_EXIT;
    }
    
  3. 92107行上,将streams[0]替换为streams[audio_stream_idx]

  4. 在行181上,用

    替换硬编码的编解码器ID AV_CODEC_ID_AAC
    (*output_format_context)->oformat->audio_codec
    
  5. 在行182上,替换错误消息:

    fprintf(stderr, "Could not find audio encoder for %s(%d).\n", (*output_format_context)->oformat->long_name, (*output_format_context)->oformat->audio_codec);
    
  6. decode_audio_frame()中,我们跳过非音频帧:在行389上,写

    if (error != AVERROR_EOF && input_packet.stream_index != audio_stream_idx) goto cleanup;
    

PS 请注意,当音频流does not require transcoding时,此解决方案无法最佳地处理。大多数 mp4 文件将具有AAC或AC3音轨,因此请确保使用相关的解码器和MP3编码器(例如shine)来构建ffmpeg。

PPS here是文件,适用于Adnroid。