流媒体,H.264,RTP,FU-A,解码播放

ioly001 2010-10-26 05:51:26
开发某实时视频浏览程序,使用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: 1

D -> 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: 1

v=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: 2

D -> 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-6971

P -> 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: 3

D -> 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后不知道应当如何进行播放,盼高手赐教。
...全文
1686 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
chentank 2012-08-17
  • 打赏
  • 举报
回复
高手~ 小弟借宝地问些很小白的问题:
我也在做实时视频浏览,我能从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 。。。。

请问:
一、这样的裸码流发送给播放器能播放吗? 如果不能播放需要如何修改?
二、通过什么方案能让用户通过电脑和手机等客户端来实时浏览视频?
ioly002 2010-11-10
  • 打赏
  • 举报
回复
sps和pps在rtsp的describe回复中:sprop-parameter-sets=Z0KAMukCgSyA,aM48gA==,base64解码后获得参数数组
ioly001 2010-11-10
  • 打赏
  • 举报
回复
自己摸索解决了,关键点如下:
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函数进行合适转码

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧