2015-10-15 10 views
4

Я работаю с примером ffmpeg transcoding.c. Когда я установил кодек кодека видео в AV_CODEC_ID_H264 и кодек аудиокодера на AV_CODEC_ID_AAC, я получил следующую ошибку.FFMPEG Исправлено обнаружение битового потока AAC: используйте звуковой бит-фильтр «aac_adtstoasc», чтобы исправить ошибку

enter image description here

Как я могу исправить эту проблему.

+0

Я бы поискал 'av_bitstream_filter_init' и' av_bitstream_filter_filter' в исходных файлах. – aergistal

+0

Каково название кодека AAC, выполняющего кодировку? это libfaac? – UmNyobe

+3

Почему пользователи WIndows имеют тенденцию делать скриншоты консольных выходов вместо копирования и вставки текста? – LordNeckbeard

ответ

4

Прежде всего, спасибо за ответы.

Решение моей проблемы - AVBitStreamFilterContext *. Я добавил следующие строки в метод «encode_write_frame», и это нормально.

if(ifmt_ctx->streams[stream_index]->codec->codec_type == AVMEDIA_TYPE_VIDEO && ifmt_ctx->streams[stream_index]->codec->codec_id == AV_CODEC_ID_H264){ 
    AVBitStreamFilterContext* h264BitstreamFilterContext = av_bitstream_filter_init("h264_mp4toannexb"); 
    av_bitstream_filter_filter(h264BitstreamFilterContext, ofmt_ctx->streams[stream_index]->codec, NULL, &enc_pkt.data, &enc_pkt.size, enc_pkt.data, enc_pkt.size, 0); 
} else if(ifmt_ctx->streams[stream_index]->codec->codec_id == AV_CODEC_ID_AAC) {   
    AVBitStreamFilterContext* aacBitstreamFilterContext = av_bitstream_filter_init("aac_adtstoasc"); 
    av_bitstream_filter_filter(aacBitstreamFilterContext, ofmt_ctx->streams[stream_index]->codec, NULL, &enc_pkt.data, &enc_pkt.size, enc_pkt.data, enc_pkt.size, 0); 
} 
+0

Не могли бы вы сказать, где в этой функции вы его добавили? Возможно, это файл патча. – Ryan

+1

Я устал от него перед методом 'av_packet_rescale_ts'. Код заканчивается, но полученный файл имеет только аудио ... – Setheron

4

В ваших аудиокадрах aac все еще есть заголовки заголовков, когда они предоставляются на единицу обработки, которая ожидает сырой aac. Заголовок Adts позволяет вам сбрасывать данные AAC непосредственно в файл, называть его foo.aac и открывать его другой программой.

В этом случае устройство представляет собой код контейнера MP4. Для контейнера MP4 требуется AV_CODEC_FLAG_GLOBAL_HEADER, что означает, что весь поток должен содержать только данные потока, а другие данные предоставляются установкой AVCodecContext.extradata. Поскольку MP4 имеет свой собственный способ переноса метаинформации (здесь информация о транспорте), запись этого префикса транспорта перед каждым фреймом сделает данные нечитаемыми.

У вас есть следующие строки и что установлен флаг CODEC_FLAG_GLOBAL_HEADER?

//ofmt_ctx is AVFormatContext 
//enc_ctx is the AVCodecContext of the current stream 
if (ofmt_ctx->oformat->flags & AVFMT_GLOBALHEADER) 
    enc_ctx->flags |= CODEC_FLAG_GLOBAL_HEADER; 

Без них кодировщик может добавлять метаданные в данные, которые отправляются в контейнер. Для AAC это заголовок ADTS, для H264 это SPS и PPS данные.