Ответ 1
Итак, я понял это для потока h264.
Как определить I-Frame:
- удалить заголовок RTP
- проверить значение первого байта в полезной нагрузке h264
- если значение равно 124 (0x7C), это I-Frame
Я не могу понять, для потока MPEG4-ES... любые предложения?
РЕДАКТИРОВАТЬ: H264 IDR
Этот работает для моего потока h264 (fmtp:96 packetization-mode=1; profile-level-id=420029;
). Вы просто передаете массив байтов, который представляет фрагмент h264, полученный через RTP. Если вы хотите передать весь RTP, просто скорректируйте значение RTPHeaderBytes
, чтобы пропустить заголовок RTP. Я всегда получаю I-Frame, потому что это единственный фрейм, который может быть фрагментирован, см. здесь. Я использую этот (упрощенный) код на моем сервере, и он работает как шарм!!!! Если I-Frame (IDR) не фрагментирован, fragment_type
будет равен 5, поэтому этот код вернет true
для фрагментированных и не фрагментированных IDR.
public static bool isH264iFrame(byte[] paket)
{
int RTPHeaderBytes = 0;
int fragment_type = paket[RTPHeaderBytes + 0] & 0x1F;
int nal_type = paket[RTPHeaderBytes + 1] & 0x1F;
int start_bit = paket[RTPHeaderBytes + 1] & 0x80;
if (((fragment_type == 28 || fragment_type == 29) && nal_type == 5 && start_bit == 128) || fragment_type == 5)
{
return true;
}
return false;
}
Здесь таблица типов единиц NAL:
Type Name
0 [unspecified]
1 Coded slice
2 Data Partition A
3 Data Partition B
4 Data Partition C
5 IDR (Instantaneous Decoding Refresh) Picture
6 SEI (Supplemental Enhancement Information)
7 SPS (Sequence Parameter Set)
8 PPS (Picture Parameter Set)
9 Access Unit Delimiter
10 EoS (End of Sequence)
11 EoS (End of Stream)
12 Filter Data
13-23 [extended]
24-31 [unspecified]
EDIT 2: MPEG-4 I-VOP
Я забыл обновить этот... Thanx to Che и документ ISO IEC 14496-2, мне это удалось! Че был обрядом, но не очень точным в его ответе... так вот, как кратко найти I, P и B кадров (I-VOP, P-VOP, B-VOP):
- VOP (Video Object Plane - frame) начинается с кода
000001B6
(hex). Это то же самое для всех кадров MPEG4 (I, P, B) -
Далее следует много больше информации, которую я не буду описывать здесь (см. документ IEC), но мы только (как сказал che) нуждаемся в более высоких 2 битах из следующего байта (следующие два бита после байт со значением
B6
). Эти 2 бита сообщают вам VOP_CODING_TYPE, см. Таблицу:VOP_CODING_TYPE (binary) Coding method 00 intra-coded (I) 01 predictive-coded (P) 10 bidirectionally-predictive-coded (B) 11 sprite (S)
Итак, чтобы найти I-Frame, найдите пакет, начинающийся с четырех байтов 000001B6
и имеющий более высокие два бита следующего байта 00
. Это обнаружит, что я кадр в потоке MPEG4 с простым типом видеообъектов (не уверен, что для простейшего простого).
Для любых других проблем вы можете проверить предоставленный документ (ISO IEC 14496-2), есть все, что вы хотите знать о MPEG4,:)