Как декодировать наборы параметров sprop в SDP H264?
каково значение декодированных байтов 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
4 ответов
требуемая спецификация доступна для бесплатной загрузки с веб-сайта МСЭ здесь:- H. 264 (03/10)
выберите свободно загружаемый PDF-файл, и вы найдете формат, подробно описанный в разделе 7.3.2.1.1.
извините, не был тупым с моим предыдущим ответом, просто не знал, что информация была доступна в общественном достоянии.
конечно, спецификация всегда лучше, но наборы параметров sprop в SDP обычно состоят из ваших наборов параметров последовательности и параметров изображения, base-64 закодированы и разделены запятой. Параметры последовательности и изображения в основном говорят декодеру, как правильно декодировать входящий поток H264; без него вы не можете правильно декодировать.
написание парсера для SPS / PPS не так сложно, хотя для этого вам обязательно понадобится спецификация. Вам также понадобится хороший класс чтения битов и знание того, как экспоненциальное кодирование golomb работает как для подписанных, так и для неподписанных значений. См.здесь и здесь.
наконец, код найден в этой теме на Doom9 был бесценен для меня-это в основном полный парсер для элементарного потока H264. Он включает в себя класс чтения битов, процедуры для анализа NALU, sps, pps, параметров VUI, матриц масштабирования последовательности и т. д. Это довольно удобная штука кода для любого видеоинженера.
Как оказалось, ответ на мой вопрос написано в этом документе: ISO / IEC 14496-10: 2005 раздела 7.3.2.1. и чтобы получить его, мне нужно заплатить. Так... =)
размер видео находится в строке "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 = '';
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