我正在尝试编写一个C ++程序,它允许我将视频文件中的音频提取到mp3文件中。我搜索了互联网和stackoverflow,但无法让它工作。
我选择的库是 ffmpeg ,我必须在C / C ++中完成。这是我到目前为止所做的。
// Step 1 - Register all formats and codecs
avcodec_register_all();
av_register_all();
AVFormatContext* fmtCtx = avformat_alloc_context();
// Step 2 - Open input file, and allocate format context
if(avformat_open_input(&fmtCtx, filePath.toLocal8Bit().data(), NULL, NULL) < 0)
qDebug() << "Error while opening " << filePath;
// Step 3 - Retrieve stream information
if(avformat_find_stream_info(fmtCtx, NULL) < 0)
qDebug() << "Error while finding stream info";
// Step 4 - Find the audiostream
audioStreamIdx = -1;
for(uint i=0; i<fmtCtx->nb_streams; i++) {
if(fmtCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
audioStreamIdx = i;
break;
}
}
if(audioStreamIdx != -1) {
// Step 5
AVCodec *aCodec = avcodec_find_decoder(AV_CODEC_ID_MP3);
AVCodecContext *audioDecCtx = avcodec_alloc_context3(aCodec);
avcodec_open2(audioDecCtx, aCodec, NULL);
// Step 6
AVPacket pkt;
AVFrame *frame = av_frame_alloc();
av_init_packet(&pkt);
pkt.data = NULL;
pkt.size = 0;
int got_packet = 0;
while(av_read_frame(fmtCtx, &pkt) == 0) {
int got_frame = 0;
int ret = avcodec_decode_audio4(audioDecCtx, frame, &got_frame, &pkt);
if(got_frame) {
qDebug() << "got frame";
}
}
av_free_packet(&pkt);
}
avformat_close_input(&fmtCtx);
但执行avcodec_decode_audio4()时出现的错误是“[mp3 @ 825fc30] Header missing”。
提前致谢!
[编辑] 我发现视频的音频不是MP3而是AAC。所以我将第5步更改为以下代码行
// Step 5
AVCodecContext *audioDecCtx = fmtCtx->streams[audioStreamIdx]->codec;
AVCodec *aCodec = avcodec_find_decoder(audioDecCtx->codec_id);
avcodec_open2(audioDecCtx, aCodec, NULL);
现在输出“got frame”,avcodec_decode_audio4()返回它解码的字节数。
现在我必须将音频写入文件,最好是MP3文件。我发现我必须使用avcodec_encode_audio2()函数来完成它。但是对于如何使用它的一些额外帮助更受欢迎!