开发某实时视频浏览程序,使用RTSP握手后,设备向PC指定UDP端口回传FU-A封包的H.264视频数据,不知道如何进行解码。
交互过程如下(P:PC, D:设备):
P -> D:
DESCRIBE rtsp://192.168.0.13:554/h264.sdp?res=full&x0=0&y0=0&x1=352&y1=288 RTSP/1.0
Accept: application/sdp
Authorization: Basic YWRtaW46ODg4ODg4ODg=
User-Agent: H264TestClient
CSeq: 1D -> P:
RTSP/1.0 200 OK
CSeq: 1
Cache-Control: no-cache
Content-Length: 234
Content-Type: application/sdp
x-Accept-Retransmit: our-retransmit
x-Accept-Dynamic-Rate: 1v=0
o=channel0 37541 33321 IN IP4 192.168.0.13
s=h264.sdp
t=0 0
m=video 0 RTP/AVP 96
a=rtpmap:96 H264/90000
a=control:trackID=1
a=fmtp:96 packetization-mode=1;profile-level-id=428032;sprop-parameter-sets=Z0KAMukCgSyA,aM48gA==P -> D:
SETUP rtsp://192.168.0.13:554/h264.sdp?res=full&x0=0&y0=0&x1=352&y1=288 RTSP/1.0
Transport: RTP/AVP/TCP;unicast;client_port=10000-10001;ssrc=0
User-Agent: H264TestClient
CSeq: 2D -> P:
RTSP/1.0 200 OK
CSeq: 2
Cache-Control: no-cache
Session: 135514808124572
Transport: RTP/AVP;unicast;client_port=10000-10001;server_port=6970-6971P -> D:
PLAY rtsp://192.168.0.13:554/h264.sdp?res=full&x0=0&y0=0&x1=352&y1=288 RTSP/1.0
Session: 135514808124572
Range: npt=0.000000-0.000000
User-Agent: H264TestClient
CSeq: 3D -> P:
RTSP/1.0 200 OK
CSeq: 3
Session: 135514808124572
Range: npt=now-
至此rtsp握手成功,设备开始用UDP回传数据,每一个UDP包都是一个FU-A包(首12字节是RTP包头),如:
packet 1, length = 1472:
80 60 00 01 7A FD 74 05 
4B 0B B9 BE 7C 85 88 80 
15 40 34 23 14 00 04 52 
F5 26 E4 E4 E4 E4 E4 E4 
........packet 2, length = 1472:
80 60 00 02 7A FD 74 05 
4B 0B B9 BE 7C 05 B2 A8 
3F 0B 0A 2F F4 FE DE 17 
C0 04 8A 1A 15 46 80 95
....
....packet 5, length = 500:
80 E0 00 05 7A FD 74 05 
4B 0B B9 BE 7C 45 F5 AF 
F4 47 EA C1 4E 80 8C 3B 
3C EE 93 08 94 81 EE 09 
....用VLC是可以直接连接并播放的。
目前问题是提取FU-A的payload后不知道应当如何进行播放,盼高手赐教。

解决方案 »

  1.   

    自己摸索解决了,关键点如下:
    1,将FU-A包根据rtp的包序号和FU-A的header字节,组成完整264帧;
    2,判断帧类型如果是idr帧,需要在帧头加上sps和pps,格式为:
      起始码(0x00000001)+sps+起始码+pps+起始码+完整帧数据
    3,帧末添加帧间分隔符“0x00, 0x00, 0x01, 0x09, 0x10”
    4,使用网上精简过的"ff_264_dec_vc"进行解码。该项目不支持imgconvert,可从最新ff源码查找
      并拷贝yuv420p_to_xxx函数进行合适转码
      

  2.   

    sps和pps在rtsp的describe回复中:sprop-parameter-sets=Z0KAMukCgSyA,aM48gA==,base64解码后获得参数数组
      

  3.   

    高手~ 小弟借宝地问些很小白的问题:
    我也在做实时视频浏览,我能从DVS上得到H.264的裸码流,如某帧开头如下:00 00 00 01  61 F0 0F 14 
    28 13 AB FA  52 F2 95 1A 
    33 22 A8 60  AE 84 71 5B 
    87 6F 2E BD  44 E2 7D 77 
    8A C4 C4 EA  3B E2 39 B7 
    2D 6E 。请问:
    一、这样的裸码流发送给播放器能播放吗? 如果不能播放需要如何修改?
    二、通过什么方案能让用户通过电脑和手机等客户端来实时浏览视频?