H.264 через RTP — Определение кадров SPS и PPS

У меня есть необработанный поток H.264 с IP-камеры, упакованный в кадры RTP. Я хочу получить необработанные данные H.264 в файл, чтобы я мог преобразовать их с помощью ffmpeg.

Итак, когда я хочу записать данные в необработанный файл H.264, я обнаружил, что он должен выглядеть так:

00 00 01 [SPS] 
00 00 01 [PPS]
00 00 01 [NALByte]
[PAYLOAD RTP Frame 1]     // Payload always without the first 2 Bytes -> NAL
[PAYLOAD RTP Frame 2]
[... until PAYLOAD Frame with Mark Bit received]  // From here its a new Video Frame
00 00 01 [NAL BYTE]
[PAYLOAD RTP Frame 1]
....

Итак, я получаю SPSи PPS. ] из Протокола описания сеансаиз моего предыдущего сообщения RTSP. Кроме того, камера отправляет SPSи PPSв двух отдельных сообщениях, прежде чем начать с самого видеопотока.

Итак, я перехватываю сообщения в следующем порядке:

1. Preceding RTSP Communication here ( including SDP with SPS and PPS )
2. RTP Frame with Payload: 67 42 80 28 DA 01 40 16 C4    // This is the SPS 
3. RTP Frame with Payload: 68 CE 3C 80                   // This is the PPS
4. RTP Frame with Payload: ...  // Video Data

Затем идут кадры с полезной нагрузкой и в какой-то момент кадр RTP с битом маркера = 1. Это означает (если я правильно понял), что у меня есть полный видеокадр. После этого я снова записываю префиксную последовательность (00 00 01) и NALиз полезной нагрузки и продолжаю ту же процедуру.

Теперь моя камера отправляет мне после каждых 8 полных видеокадров SPSи снова PPS. (Снова в двух кадрах RTP, как показано в примере выше). Я знаю, что особенно PPSможет меняться между потоками, но это не проблема.

Теперь мои вопросы:

1.Нужно ли мне записывать SPS/PPS каждый 8-й видеокадр?

Если мои SPSи мои PPSне меняются, должно быть достаточно, чтобы они были записаны в самом начале моего файла и ничего более?

2. Как отличить кадры SPS/PPS от обычных кадров RTP?

В моем коде C++, который анализирует передаваемые данные, мне нужно сделать различие между кадрами RTP с нормальной полезной нагрузкой и кадрами, содержащими SPS/PPS. Как я могу их отличить? Хорошо, кадры SPS/PPSобычно намного меньше, но это не спасительный вызов, на который можно положиться. Потому что, если я их игнорирую, мне нужно знать, какие данные я могу выбросить, или, если мне нужно их записать, мне нужно поставить перед ними префикс 00 00 01. ? Или это фиксированное правило, что они появляются каждый 8-й видеокадр?

13
задан Toby 8 March 2012 в 13:26
поделиться