Как декодировать наборы параметров 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

ответ: получение размеров потока H264Video

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