В ваших аудиокадрах 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
данные.
Я бы поискал 'av_bitstream_filter_init' и' av_bitstream_filter_filter' в исходных файлах. – aergistal
Каково название кодека AAC, выполняющего кодировку? это libfaac? – UmNyobe
Почему пользователи WIndows имеют тенденцию делать скриншоты консольных выходов вместо копирования и вставки текста? – LordNeckbeard