Я хочу знать, что такое начальный код и как найти кадр i в кодеке H 264. В основном я пытаюсь зашифровать видеофайлы с помощью Java; как я могу разобрать видеофайл, чтобы получить i-кадр с помощью Java?
Какой начальный код для i-го кадра в кодеке H 264?
Ответы (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)
Основываясь на комментариях выше, вот простой фрагмент кода, который вы можете использовать:
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.
Если поток имеет формат Приложения-B, вы можете искать «префикс начального кода», равный 0x000001, за которым следует блок NAL. Информация о типе NALU предоставляется в первом байте.