对于 h264 流,SDP 中 sprop-parameter-sets 中 Base64 解码字节的含义是什么?我如何从这个例子中知道视频大小?
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
对于 h264 流,SDP 中 sprop-parameter-sets 中 Base64 解码字节的含义是什么?我如何从这个例子中知道视频大小?
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
您需要的规范可从此处的 ITU 网站免费下载:- H.264 (03/10)
选择可免费下载的 PDF,您将在第 7.3.2.1.1 节中找到详细的格式。
抱歉,我之前的回答并不迟钝,只是不知道该信息可在公共领域获得。
当然,规范总是最好的,但 SDP 中的 sprop-parameter-sets 通常由您的序列参数和图片参数集组成,采用 base-64 编码并用逗号分隔。序列参数和图片参数集基本上告诉解码器如何正确解码传入的H264流;没有它,您将无法正确解码。
为 SPS/PPS 编写解析器并不难,但要做到这一点,您绝对需要规范。您还需要具备良好的位阅读器课程以及指数哥伦布编码如何适用于有符号和无符号值的知识。见这里和这里。
最后,在 Doom9 上的这个线程中找到的代码对我来说非常宝贵——它基本上是基本 H264 流的完整解析器。它包括一个位阅读器类、解析 NALU、sps、pps、VUI 参数、序列缩放矩阵等的例程。对于任何视频工程师来说,这都是一段非常方便的代码。
事实证明,我的问题的答案写在这份文件中:ISO/IEC 14496-10:2005,在第7.3.2.1 节下。为了得到它,我需要付费。所以... =)
视频大小在 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