2015-03-10 3 views
0

Я хотел бы сделать кое-что с данными h.264, записанными с телефона Android.Zero-padded h264 in mdat

Мой коллега сказал мне, что должно быть 4 байта сразу после mdat, где задается размер NALU, затем один байт с метаданными NALU, а затем необработанные данные, а затем (после размера NALU) еще 4 байта с другим размером NALU и так далее на.

Но у меня есть много нулей сразу после mdat:

0000000000000000000000000000000000000000000000000000000000000000 
0000000000000000000000000000000000000000000000000000000000000000 
0e00000000000000000000000000000000000000000000000000000000000000 
8100000000000000000000000000000000000000000000000000000000000000 
65b84f0f87fa890001022e7fcc9feef3e7fabb8e0007a34000f2bbefffd07c3c 
bfffff08fbfefff04355f8c47bdfd05fd57b1c67c4003e89fe1fe839705a699d 
c6532fb7ecacbfffe82d3fefc718d15ffffbc141499731e666f1e4c5cce8732f 
bf7eb0a8bd49cd02637007d07d938fd767cae34249773bf4418e893969b8eb2c 

Перед mdat атом только ftypmp42, isommp42 и free атомов. Все остальные атомы (moov, ...) находятся в конце файла (это то, что делает Android, когда он записывает в сокет, а не в файл). Но в случае необходимости у меня есть PPS и SPS из другого файла с теми же настройками камеры и кодировщика, которые были записаны только в этом случае до этого, чтобы получить данные PPS и SPS.

Так как же я могу получить NALU от этого?

ответ

1

Вы не можете. Атом moov содержит информацию, необходимую для разбора mdat. Без него mdat имеет мало значения. Например, первый NALU не нужно начинать с начала mdat, он может начинаться где угодно внутри mdat. Байт, с которого он начинается, записывается в (я считаю) коробке stco. Если у файла есть звук, вы найдете аудио и видео, смешанные внутри mdat, без возможности определить, что есть без смещения куска. Кроме того, если у видео есть B-кадры, нет способа определить порядок визуализации без cts, снова доступен только в moov. И технически размер nalu не должен быть 4 байта, и вы не можете знать, что без moov. Я рекомендую не использовать mp4. Используйте потоковый контейнер, такой как ts или flv. Теперь, если вы можете сделать некоторые предположения о коде, который производит файл; Как и смещение куска, всегда одно и то же, и нет b кадров, вы можете жестко закодировать эти значения. Но не гарантируется работа после обновления программного обеспечения.

+0

Ну, мой код работает (много NALU типа 1, иногда типа 5) 80% времени. Но когда-то, в начале есть эти нули, и он идет полным бананом. К сожалению, я не могу легко использовать другие контейнеры, а затем mpeg4 и 3gpp в Android. И я знаю, что есть только видео в 'mdat'. – Pitel

+0

Тогда я думаю, вам нужно полностью пропустить контейнер и использовать исходные буферы вывода из MediaCodec. – szatmary

+0

Я бы, если бы мог. Но мы хотим поддерживать Android 2.3, поэтому я должен использовать 'MediaRecorder', создать' ParcelFileDescriptor.createPipe() 'и передать один файловый дескриптор в' MediaRecorder', а другой - обрабатывать поток и читать из канала. И этот нулевой заполненный двоичный код - это то, что я иногда получаю. – Pitel

Смежные вопросы