Как декодировать набор параметров sprop в H264 SDP?
В чем смысл декодированных байтов Base64 в наборах sprop-параметров в SDP для потока h264? Как узнать размер видео в этом примере?
Пример SDP:
sprop-parameter-sets=Z0IAKeNQFAe2AtwEBAaQeJEV,aM48gA==
Первая часть декодирована с Base64 на Base16:
67 42 00 29 E3 50 14 07 B6 02 DC 04 04 06 90 78 91 15
Вторая часть (разделенная запятой):
68 CE 3C 80
ОТВЕТ: Извлечение размеров потока H264Video
Ответы
Ответ 1
Необходимая вам спецификация доступна для бесплатной загрузки с веб-сайта МСЭ:
H.264 (03/10)
Выберите свободно загружаемый PDF файл, и вы найдете формат, подробно описанный в разделе 7.3.2.1.1.
Извините, не был тупым с моим предыдущим ответом, просто не знал, что информация доступна в общественном достоянии.
Ответ 2
Конечно, спецификация всегда лучшая, но параметры sprop-parameters в SDP обычно состоят из ваших параметров параметров и наборов параметров изображения, кодированных base-64 и разделенных запятой. Параметры параметров последовательности и изображения в основном говорят декодеру, как правильно декодировать входящий поток H264; без него вы не можете правильно декодировать.
Написание парсера для SPS/PPS не так уж и сложно, хотя для этого вам абсолютно нужна спецификация. Вам также понадобится хороший класс для чтения битов и знание того, как экспоненциальная кодировка golomb работает как для подписанных, так и для неподписанных значений. См. здесь и здесь.
Наконец, код, найденный в этот поток на Doom9, был для меня бесценным - это в основном полный парсер для элементарного потока H264. Он включает в себя класс бит-читателя, подпрограммы для анализа параметров NALU, sps, pps, VUI, матриц масштабирования последовательностей и т.д. Это довольно удобный фрагмент кода для любого видео-инженера.
Ответ 3
Как выясняется, ответ на мой вопрос написан в этом документе: ISO/IEC 14496-10: 2005, в разделе 7.3.2.1.. И Получите его, я должен заплатить. Итак... =)
Ответ 4
Размер видео находится в строке "framesize" SDP, не так ли?
00028 int av_strstart(const char *str, const char *pfx, const char **ptr)
00029 {
00030 while (*pfx && *pfx == *str) {
00031 pfx++;
00032 str++;
00033 }
00034 if (!*pfx && ptr)
00035 *ptr = str;
00036 return !*pfx;
00037 }
00038
p является указателем вашей строки SDP
if (av_strstart(p, "framesize:", &p)) {
00370 char buf1[50];
00371 char *dst = buf1;
00372
00373 // remove the protocol identifier..
00374 while (*p && *p == ' ') p++; // strip spaces.
00375 while (*p && *p != ' ') p++; // eat protocol identifier
00376 while (*p && *p == ' ') p++; // strip trailing spaces.
00377 while (*p && *p != '-' && (dst - buf1) < sizeof(buf1) - 1) {
00378 *dst++ = *p++;
00379 }
00380 *dst = '\0';
00381
00382 // a='framesize:96 320-240'
00383 // set our parameters..
00384 codec->width = atoi(buf1);
00385 codec->height = atoi(p + 1); // skip the -
00386 codec->pix_fmt = PIX_FMT_YUV420P;
}
ссылка: http://cekirdek.pardus.org.tr/~ismail/ffmpeg-docs/rtpdec__h264_8c-source.html#l00360