VLC播放器所需的SPS,PPS获取方法

来源:互联网 发布:大数据怎么用 编辑:程序博客网 时间:2024/05/22 02:06

通过直接观察VLC访问的sdp文件可以发现

[plain] view plain copy
  1. v=0  
  2. o=- 0 0 IN IP4 192.168.1.112  
  3. s=Stream-0  
  4. i=N/A  
  5. c=IN IP4 192.168.1.104  
  6. t=0 0  
  7. a=recvonly  
  8. m=video 5006 RTP/AVP 96  
  9. a=rtpmap:96 H264/90000  
  10. a=fmtp:96 packetization-mode=1;profile-level-id=42c016;sprop-parameter-sets=Z0LAFqtAUB7QgAAAAwCAAAAPR4sXUA==,aM48gA==;  
  11. a=control:trackID=1  
其中主要的3个参数即为 profile-level-id sprop-parameter-sets 

其中sprop-parameter-sets 包含sps和pps的信息,以逗号隔开。

那么这3个数值从哪里获取?有什么含义?

可以参考http://www.cnblogs.com/skyseraph/archive/2012/04/01/2429384.html

通过这段时间的研究发现,sprop-parameter-sets 后面的数值为码流中sps和pps获取的值经过base64编码以后的数值,

profile-level-id为sps数值67以后的3个字节对应的16进制字符串

那么获取了sps和pps的数值以后就可以获取sdp文件的关键信息了


关于获取sps和pps,我在网上找了这样一段代码,经实测,可以得到正确的结果,代码可以在上一篇博客中找到

http://blog.csdn.net/devillee11123213/article/details/9452261

通过代码获取以后可以得到结果

SPS长度为:22
SPS的内容为:67 42 c0 16 ab 40 50 1e d0 80 00 00 03 00 80 00 00 0f 47 8b 17 50 
----------
PPS长度为:4
PPS的内容为:68 ce 3c 80 
----------


即我们得到的sps为67 42 c0 16 ab 40 50 1e d0 80 00 00 03 00 80 00 00 0f 47 8b 17 50

pps为68 ce 3c 80 

这其中通过winhex 和MP4info等工具对比了下sps和pps 发现通过程序获取的sps和pps与正确结果是一样的,说明获取的sps和pps数值没有问题。

接下来就是将sps pps变成sdp中所需的字符串,通过查阅相关资料发现,sdp中的sps和pps数值是经过base64编码以后转换的。

直接将此字符串进行base64编码,结果肯定是错误的。

经过测试 我将sps的数值转化为byte数组

[java] view plain copy
  1. byte a[] = { 0x670x42, (byte0xc00x16, (byte0xab0x40, (byte0x50,  
  2.             (byte0x1e, (byte0xd0, (byte0x800x000x000x030x00, (byte0x800x00,  
  3.             0x000x0f, (byte0x47, (byte0x8b, (byte0x170x50 };  

再调用Android中的base64编码方法

[java] view plain copy
  1. Base64.encodeToString(a, 022, Base64.NO_WRAP);  
得到结果为:

SPS:Z0LAFqtAUB7QgAAAAwCAAAAPR4sXUA==

PPS:aM48gA==

至此,就得到了关于sdp中的关键内容,经测试,VLC可以通过访问该sdp实现播放。


0 0
原创粉丝点击