VLC媒体播放器接收UDP视频流的精确数据包格式咨询
VLC UDP视频接收的数据包格式细节
VLC通过udp://@:1234接收视频时,不能直接发送裸视频帧,必须用标准的RTP(实时传输协议)封装,否则VLC无法识别流格式。以下是具体格式要求和实现要点:
1. 核心封装:RTP协议
UDP只是传输层协议,VLC依赖RTP实现同步、帧识别和编码格式解析。每个UDP数据包对应一个RTP包,结构分为RTP头部和**负载(编码后的视频数据)**两部分。
RTP头部结构(固定12字节)
按字节顺序定义:
- 第1字节:
版本(2位) + 填充(1位) + 扩展(1位) + CSRC计数(4位),通常设为0x80(版本2,无填充、无扩展,CSRC计数0) - 第2字节:
标记位(1位) + 负载类型(7位),标记位在关键帧时设为1,负载类型根据编码选择:- MJPEG:固定负载类型
26,或动态类型96 - H.264:必须用动态负载类型
96(需通过SDP告知编码参数)
- MJPEG:固定负载类型
- 第3-4字节:序列号,从随机值开始,每发送一个RTP包递增1,VLC用它检测丢包
- 第5-8字节:时间戳,按视频帧率递增(比如30fps时,每次加
90000/30=3000,90000是RTP默认时钟频率),关键帧的时间戳要对应实际采样时间 - 第9-12字节:SSRC,随机生成的唯一标识,用于区分不同流
负载部分
负载是编码后的视频帧数据,需根据编码格式做对应处理:
- MJPEG:直接将单帧JPEG的完整数据(从
0xFFD8到0xFFD9)作为负载,VLC可直接识别 - H.264:需将NAL单元封装到RTP负载中:
- 单NAL单元:直接将NAL单元(起始码
0x00000001后的内容)放入负载 - 分片NAL(单帧大于MTU时):用FU-A格式封装,在负载前加1字节FU指示器、1字节FU头
- 单NAL单元:直接将NAL单元(起始码
2. 编码格式告知:SDP文件
如果使用动态负载类型(如H.264的96),VLC需要知道编码的具体参数,此时需创建SDP文件并加载:
示例SDP文件(H.264流):
v=0 o=- 0 0 IN IP4 127.0.0.1 s=EK-RA6M5 Video Stream c=IN IP4 <你的PC IP地址> t=0 0 m=video 1234 RTP/AVP 96 a=rtpmap:96 H264/90000 a=fmtp:96 packetization-mode=1;profile-level-id=42C01E;sprop-parameter-sets=Z0LAH9kBQBbsCAAADAAQAAADADPDgA==,aM48gA==
启动VLC时加载该文件:vlc udp://@:1234 --sdp-file=stream.sdp
3. 实战实现要点
- 序列号必须严格递增,即使丢包也要保持连续,VLC会通过序列号判断帧顺序
- 时间戳要与帧率同步,避免画面卡顿或跳帧
- UDP数据包大小不要超过MTU(通常1500字节),超过时需拆分视频帧为多个RTP包(如H.264的FU-A分片)
- 关键帧的标记位要设为1,帮助VLC快速恢复画面
内容的提问来源于stack exchange,提问作者siddharth taunk
相关产品推荐
相关产品推荐

