如何以mp4视频文件格式编程转换(提取音频通道)? 因为使用c ++,我在网上找不到任何东西 我动态链接外部引擎,我可以通过c ++获取mp4文件并将其转换为mp3文件 并且不将命令行参数传递给LAME或MPLAYER或FFMPEG?
答案 0 :(得分:8)
您可以尝试使用ffmpeg在c或c ++中执行此操作。这是正常的步骤流程。
使用av_register_all();
使用avformat_open_input(& informat,sourcefile,0,0)打开输入文件。
使用avformat_find_stream_info(informat,0)查找流信息。
通过迭代流并将codec_type与AVMEDIA_TYPE_AUDIO进行比较来查找音频流。
输入音频流后,您可以找到音频解码器并打开解码器。使用avcodec_find_decoder(in_aud_strm-> codec-> codec_id)和avcodec_open2(in_aud_codec_ctx,in_aud_codec,NULL)。
现在输出文件使用av_guess_format猜测outformat(NULL,(const char *)outfile,NULL)。
为格式化分配上下文。
使用avcodec_find_encoder(outfmt-> audio_codec)查找输出音频编码器。
添加新流音频流avformat_new_stream(outformat,out_aud_codec)。
使用所需的采样率,样本fmt,通道等填充输出编解码器上下文。
使用avio_open()打开输出文件。
使用avformat_write_header(outformat,NULL)编写输出标题。
现在在while循环开始读取数据包时,只解码音频数据包对它们进行编码并将它们写入打开的输出文件中。您可以使用av_read_frame(informat,& pkt),avcodec_decode_audio4(in_aud_codec_ctx,pframeT,& got_vid_pkt,& pkt),avcodec_encode_audio2()和av_write_frame()。
最后使用av_write_trailer编写预告片。
您可以查看ffmpeg示例中提供的demuxing.c和muxing.c。
答案 1 :(得分:1)
从transcode_aac官方示例开始。我们需要的更改很少:
在文件范围内添加全局变量:
/* The index of audio stream that will be transcoded */
static int audio_stream_idx = -1;
在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;
}
在行181上,用
替换硬编码的编解码器IDAV_CODEC_ID_AAC
。
(*output_format_context)->oformat->audio_codec
在行182上,替换错误消息:
fprintf(stderr, "Could not find audio encoder for %s(%d).\n", (*output_format_context)->oformat->long_name, (*output_format_context)->oformat->audio_codec);
在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。