音频文件的FFMPEG-持续时间不准确 [英] FFMPEG- Duration of audio file is inaccurate

查看:1858
本文介绍了音频文件的FFMPEG-持续时间不准确的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有视频文件(MP4)。我要分离从该文件中的音频流(AAC格式),并保存PC。
低于code,现在KM播放器生成的AAC文件中canplay,但不能在VLC播放器上播放。时间显示在播放器的信息是错误的。
请帮我解决这个问题。

I have video file (mp4). I want to detach audio stream (AAC format) from that file and save in PC. With below code, Generated aac file canplay now on KM player, but can not play on VLC player. Information of duration displays on player is wrong. Please help me with this problem.

 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) {
        *input_codec_context = st->codec;
        *input_audio_stream = st;

        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) {

                uint8_t adts_header[7];
                unsigned int obj_type = 0;
                unsigned int num_data_block = (reading_packet.size)/1024;
                int rate_idx = st->codec->sample_rate, channels = st->codec->channels;

                 uint16_t frame_length;

                // include the header length also
                 frame_length = reading_packet.size + 7;

                /* We want the same metadata */
                /* Generate ADTS header */
                if(adts_header == NULL) return -1;
                /* Sync point over a full byte */
                adts_header[0] = 0xFF;
                /* Sync point continued over first 4 bits + static 4 bits
                * (ID, layer, protection)*/
                adts_header[1] = 0xF1;
                /* Object type over first 2 bits */
                adts_header[2] = obj_type << 6;
                /* rate index over next 4 bits */
                adts_header[2] |= (rate_idx << 2);
                /* channels over last 2 bits */
                adts_header[2] |= (channels & 0x4) >> 2;
                /* channels continued over next 2 bits + 4 bits at zero */
                adts_header[3] = (channels & 0x3) << 6;
                /* frame size over last 2 bits */
                adts_header[3] |= (frame_length & 0x1800) >> 11;
                /* frame size continued over full byte */
                adts_header[4] = (frame_length & 0x1FF8) >> 3;
                /* frame size continued first 3 bits */
                adts_header[5] = (frame_length & 0x7) << 5;
                /* buffer fullness (0x7FF for VBR) over 5 last bits*/
                adts_header[5] |= 0x1F;
                /* buffer fullness (0x7FF for VBR) continued over 6 first bits + 2 zeros
                * number of raw data blocks */
                adts_header[6] = 0xFA;
                adts_header[6] |= num_data_block & 0x03; // Set raw Data blocks.

                fwrite(adts_header, 1, 7, file);
                fwrite(reading_packet.data, 1, reading_packet.size, file);
            }
            av_free_packet(&reading_packet);   
        }
        fclose(file);

        return 0;
    }
}


推荐答案

对象类型和采样率指标必须被设置为真实,正确的值。这两个值可以在$ C $立方厘米上下文extradata字段被解析出的音频的特定配置的。你需要的所有信息是在这里: http://wiki.multimedia.cx/index的.php?标题= MPEG-4_Audio

Object type and sample rate index must be set to the real, correct values. Both values can be parsed out of the audio specific config in the extradata field in the codec context. All the information you need is here: http://wiki.multimedia.cx/index.php?title=MPEG-4_Audio

这篇关于音频文件的FFMPEG-持续时间不准确的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆