Какой начальный код для i-кадра в кодеке H 264? - PullRequest
2 голосов
/ 09 апреля 2011

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

Ответы [ 3 ]

3 голосов
/ 16 декабря 2011

предыдущий ответ ссылается на поле 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 закрытая GOP.

Возвращаясь к 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)

3 голосов
/ 17 мая 2013

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

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!!");

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

1 голос
/ 23 октября 2011

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

...