Создайте MDAT из фрагментов I-frame/P-frame

Я создаю файл MPEG-4 из потока H.264. Поток H.264 поставляется в формате NAL (например: 0,0,0,1,67,...,0,0,1,68,...). Каждый видеокадр передается как несколько фрагментов I-кадра/P-кадра. Например: кадр 1 содержит приблизительно 80 фрагментов I-кадра, а кадр 2 содержит около 10 фрагментов P-кадра.

Я понимаю, что атом MDAT файла MPEG-4 должен содержать потоки H.264 в формате NAL.

Я хотел бы знать, как эти фрагменты могут быть преобразованы в один I-кадр, прежде чем я смогу поместить его в атом MDAT MPEG-4.

Я не хочу использовать никакие библиотеки.

Спасибо за вашу помощь.


person user1954429    schedule 07.01.2013    source источник


Ответы (1)


Вы собираетесь преобразовать поток H.264 Annex B NAL в пакеты файлов MP4. Для этого вам необходимо:

  • Разделите исходный файл на единицы NAL (00 00 00 01 yy xx xx ...);
  • Найдите границы кадра: каждый кадр H.264 обычно содержит несколько секторов и, возможно, один из следующих: SPS, PPS, SEI. Вам нужно будет проанализировать октет «yy» выше, чтобы определить, какой тип модуля NAL вы ищете. Теперь, чтобы узнать границу кадра, вам нужно проанализировать первую часть каждого фрагмента, называемого «SliceHeader», и сравнить «frame_number» последовательных фрагментов.
  • Как только вы узнаете границы кадра, вы можете формировать пакеты MP4. Каждый пакет будет содержать ровно один кадр и единицы NAL в следующем формате:

    l1 l1 l1 l1 yy xx xx ...
    l2 l2 l2 l2 yy xx xx ...

так что в основном вы заменяете каждый разделитель «00 00 00 01» целым числом, содержащим длину этого блока NAL.

  • Затем, чтобы получить правильный заголовок MP4, вам нужно будет использовать мультиплексор MP4 и заполнить правильный атом «AvcC» внутри образца записи вашей видеодорожки.

Это довольно утомительный процесс, но если вы хотите углубиться в детали, вы можете изучить исходный код JCodec ( http://jcodec.org ): org.jcodec.samples.transcode.TranscodeMain , org.jcodec.containers.mp4.MP4Muxer

person Stanislav Vitvitskyy    schedule 13.05.2013