LINUX.ORG.RU

Парсинг RAW AAC

 


0

1

Есть поток с сырым AAC, без ADTS/ADIF, стоит задача научиться понимать, где находятся отдельные фреймы. Возможно ли это? Пока в спеки не углублялся, хочу для начала узнать может кто знает.


я на машине не умею ездить, но хочу, но прежде чем буду учиться, хочу узнать, вообще можно ездить на машине?

anonymous ()

Ты хочешь сказать, что в аас можно жать секретную инфу и никто не распарсит?

anonymous ()
Ответ на: комментарий от anonymous

Из 10 килобайт информации могут получится разные наборы фреймов, а мне нужна практически 100% точность. Вот я и хочу узнать, будут ли там такие коллизии.

JN ()
Ответ на: комментарий от JN

я думаю, что шанс есть.

Посмотри, как ffmpeg распаковывает фреймы aac для правильной детекции частоты в HE-AAC: libavcodec/aacdec.c decode_extension_payload

Возможно там что полезное найдешь.

max_lapshin ★★★ ()
Ответ на: комментарий от max_lapshin

Ага, спасибо.
Я уже нашел avcodec_decode_audio4, который по идее должен с этой задачей справиться.
AAC без границ выдает мне энкодер камеры в виде mp4 помеси h264 с заголовками юнитов и aac без них.

JN ()
Ответ на: комментарий от JN

автор энкодера видать тухлой лапши объелся.

У тебя совсем сырой байтстрим или всё таки какие-то пакеты есть? Таймстемпы то где идут?

max_lapshin ★★★ ()
Ответ на: комментарий от max_lapshin

Ну, поскольку все данные смещения, длительности содержаться в moov контейнера, добавление лишних заголовков это пустая трата байт.

Насколько мне удалось выяснить, поток состоит из nalu и raw aac (или там что-то еще должно/может быть? что и в каком месте почитать?), но это не окончательное утверждение.
Где должны встречаться таймстемпы и к чему они должны относится MP4/H264/AAC (и в какой части спецификации это описано)?
Энкодер Made in China by Liao.

JN ()
Ответ на: комментарий от JN

если nalu без annexb, то это ваще беда.

Где-то должны быть метки границы.

Но почему ты говоришь про mp4/moov? У тебя же вроде поток?

max_lapshin ★★★ ()

Тред не читал, возможно уже сказали.

Если нету ADIF/ADTS/LOAS и никакого контейнера, декодинг невозможен.

Однако, если известен формат потока (profile/sample rate/channels, может что-то забыл), и известны начало-конец AAC фреймов, то тогда возможно.

elijah_sd ()
Ответ на: комментарий от JN

moov? 3gp (mp4) контейнер?

Если да, то вся необходимая информация должна быть в контейнере,
я не особо знаком с аудио в 3gp, но по аналогии с видео, у вас если информация о начале-конце каждого фрейма, и adif должен быть в отдельном атоме.

BTW: avcodec_decode_audio4 из ffmpeg будет искать adts в потоке, и как только (случайно) встретится FFF? примет это за adts и распарсит неправильно.

elijah_sd ()
Последнее исправление: elijah_sd (всего исправлений: 2)
Ответ на: комментарий от max_lapshin

Поток из камеры.
Я позже буду в hex-редакторе подробно изучать что там мне выдает.

JN ()
Ответ на: комментарий от elijah_sd

Контейнер mp4. Проблема в том, что мне видео из камеры нужно стримить риал-тайм, а нужные атомы пишутся после окончания записи.

Если нету ADIF/ADTS/LOAS и никакого контейнера, декодинг невозможен

Пока мельком глянул код aacdec libav, там есть

enum RawDataBlockType {
    TYPE_SCE,
    TYPE_CPE,
    TYPE_CCE,
    TYPE_LFE,
    TYPE_DSE,
    TYPE_PCE,
    TYPE_FIL,
    TYPE_END,
};
Вроде есть от чего отталкиваться.

avcodec_decode_audio4 из ffmpeg будет искать adts в потоке

Точно? Я пока еще не пробовал, но нагуглил, что оно используется в утилите untrunc для восстановления файлов, и по отзывам справляется с задачей и без adts.

JN ()
Последнее исправление: JN (всего исправлений: 2)

test test test test test test

anonymous ()
Ответ на: комментарий от JN

Контейнер mp4. Проблема в том, что мне видео из камеры нужно стримить риал-тайм, а нужные атомы пишутся после окончания записи.

Все верно, mp4 для стриминга не предназначен, но я ни разу не видел, чтобы в реальности mdat не был последним атомом, так что обычно все нужное идет до данных.

avcodec_decode_audio4 из ffmpeg будет искать adts в потоке

это из личного опыта, я не знаю, можно ли угадать начало aac фрейма (я считал, что нельзя), но даже если угадывать, как узнать, это HE-AAC, AAC LC или ELD?

Если не получится декодировать, можете расшарить весь поток, включая контейнер, можем посмотреть, что с ним можно сделать. )

elijah_sd ()
Ответ на: комментарий от elijah_sd

Камера пишет видео сразу в mp4 файл, поэтому метаданные дописываются в конец после окончания записи.
Профиль известен до начала записи.

JN ()
Ответ на: комментарий от JN

так ты хочешь на лету попарсить тот mp4, который тебе нальет камера в процессе наливания?

Так она его уже записала не в реальном времени, ведь там идет длина этого mdat.

Чего за камера то?

max_lapshin ★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.