C ++ ffmpeg将音频提取到mp3(demuxing)

时间:2014-06-21 11:54:31

标签: c++ audio ffmpeg mp3

我正在尝试编写一个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()函数来完成它。但是对于如何使用它的一些额外帮助更受欢迎!

0 个答案:

没有答案