Какой начальный код для i-го кадра в кодеке H 264?

Я хочу знать, что такое начальный код и как найти кадр i в кодеке H 264. В основном я пытаюсь зашифровать видеофайлы с помощью Java; как я могу разобрать видеофайл, чтобы получить i-кадр с помощью Java?


person amruth    schedule 09.04.2011    source источник
comment
возможный дубликат Как декодировать видеокадр H.264 в Среда Java   -  person Stephen C    schedule 09.04.2011


Ответы (3)


предыдущий ответ относится к полю nal_unit_type в nal_unit(). Подробный синтаксис для nal_unit находится в разделе 7.3.1() стандарта ISO 14496-10.

Одна вещь, которая отличается между H.264 и MPEG 2, заключается в том, что H.264 различает I-срез и IDR. Слайс I сам по себе может быть декодирован в полное изображение, но слайсы, декодированные позже, могут ссылаться на слайсы до I. В разделе 3.62 говорится: «После декодирования изображения IDR все последующие закодированные изображения в порядке декодирования могут быть декодированы без интерпретация из любого изображения, декодированного до изображения IDR». Это похоже на закрытую группу изображений MPEG 2.

Возвращаясь к nal_unit_type, см. таблицу 7-1, в которой указано, что IDR имеет nal_unit_type 5, но если вы ищете срезы I, вы можете посмотреть на primary_pic_type (таблица 7-5) в access_unit_delimiter() (раздел 7.3.2.4). ), или вы можете проверить slice_type (таблица 7-6) slice_header() (раздел 7.3.3)

person Mutant Bob    schedule 15.12.2011

Основываясь на комментариях выше, вот простой фрагмент кода, который вы можете использовать:

ByteBuffer bb = ... // Byte buffer with your frame or h.264 NAL stream

int marker = 0xffffffff;
while (bb.hasRemaining()) {
    int b = bb.get() & 0xff;
    if (marker == 1) {
        if ((b & 0x1f) == 5)
            System.out.println("IDR slice!! " + (bb.position() - 1));
    }
    marker = (marker << 8) | b;
}

Если вы просто хотите узнать, является ли данный кадр фрагментом IDR (ключевым кадром) или нет, вы можете использовать H264Utils.idrSlice из JCodec ( http://jcodec.org):

ByteBuffer bb = ... // Byte buffer with your frame or h.264 NAL stream
if(H264Utils.idrSlice(bb))
    System.out.println("IDR slice!!");

Причина, по которой вы хотели бы использовать библиотеку, заключается в том, что фрагмент блока IDR NAL не является единственным фрагментом, переносимым в закодированном кадре, поэтому вам придется пройти через последовательность SPS, PPS и SEI, чтобы, наконец, добраться до вашего фрагмента IDR.

person Stanislav Vitvitskyy    schedule 16.05.2013

Если поток имеет формат Приложения-B, вы можете искать «префикс начального кода», равный 0x000001, за которым следует блок NAL. Информация о типе NALU предоставляется в первом байте.

person user665721    schedule 23.10.2011