FFMPEG - 如何将未分配视频的音频流保存到文件而不进行转码

时间:2015-09-14 11:44:41

标签: audio video ffmpeg

我尝试使用fwrite()来保存音频流。但是,生成的文件无法打开。 同时,我也尝试使用av​​_frame_write()来编写数据包。但是,它不能写。 请帮我解决这个问题。如何在没有转码的情况下编写音频流....

/* open the input file with generic avformat function */
err = avformat_open_input(input_format_context, filename, NULL, NULL);
if (err < 0) {
    return err;
}

/* If not enough info to get the stream parameters, we decode the
   first frames to get it. (used in mpeg case for example) */
ret = avformat_find_stream_info(*input_format_context, 0);
if (ret < 0) {
    av_log(NULL, AV_LOG_FATAL, "%s: could not find codec parameters\n", filename);
    return ret;
}

/* dump the file content */
av_dump_format(*input_format_context, 0, filename, 0);

for (size_t i = 0; i < (*input_format_context)->nb_streams; i++) {
    AVStream *st = (*input_format_context)->streams[i];
    if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
        FILE *file = NULL;
        file = fopen("C:\\Users\\MyPC\\Downloads\\test.aac", "wb");
        AVPacket reading_packet;
        av_init_packet(&reading_packet);
        while (av_read_frame(*input_format_context, &reading_packet) == 0) {
            if (reading_packet.stream_index == (int) i) {
            fwrite(reading_packet.data, 1, reading_packet.size, file);
            }
            av_free_packet(&reading_packet);   
        }
        fclose(file);

        return 0;
    }
}

1 个答案:

答案 0 :(得分:1)

aac文件要求框架具有ADTS标头。如果您正在读取的文件不使用ADTS帧(例如mp4),则需要手动创建这些标头,或使用比特流过滤器。此外,您的代码不会检查编解码器是否为AAC。