Android使用Socket接收rtsp视频流的解码header问题
通过网络摄像机提供的ip地址和端口来建立一个tcp连接,然后通过该socket来发送一个http的请求,然后根据发送的请求得到响应。响应的内容包括http包和媒体数据包,主要的问题在于媒体数据包里,根据协议,媒体数据包的包头大小为20个字节,包括
RTSP数据包头+RTP数据包头,包头结构通过代码表示为为:
/*
* rtsp数据包头(占8个字节)
*/
typedef struct sRTSP_ITLEAVED_HDR_S {
unsigned char daollar; /*8, $:dollar sign(24 decimal)*/
unsigned char channelid; /*8, channel id*/
unsigned short resv; /*16, reseved*/
unsigned int payloadLen; /*32, payload length*/
RTP_HDR_S rtpHead; /*rtp head*/
} RTSP_ITLEAVED_HDR_S;
下面的时标准的rtp头的结构
/*
* rtp数据包头(占12个字节)
*/
typedef struct sRTP_HDR_S {
/* byte 0 */
unsigned short cc :4; /* CSRC count */
unsigned short x :1; /* header extension flag */
unsigned short p :1; /* padding flag */
unsigned short version :2; /* protocol version */
/* byte 1 */
unsigned short pt :7; /* payload type */
unsigned short marker :1; /* marker bit */
/* bytes 2, 3 */
unsigned short seqno :16; /* sequence number */
/* bytes 4-7 */
unsigned int ts; /* timestamp in ms */
/* bytes 8-11 */
unsigned int ssrc; /* synchronization source */
} RTP_HDR_S;
我根据协议里面的描述,使用了下面的方法来接收数据,解包和解码:
while(!stop)
byte headerBuf[] = readSockData(20);
if (headerBuf == null) {
continue;
}
int pt = (byte) ((headerBuf[9] & 0xff) & 0x7f); //这里得到视频编码类型(H264)
int payloadLen = (((headerBuf[4] & 0xff) << 24) |
((headerBuf[5] & 0xff) << 16) |
((headerBuf[6] & 0xff) << 8) |
(headerBuf[7] & 0xff)); //这里得到H264数据的长度
int pack_len = payloadLen - 12; //减去rtp header的长度(12)
if (pt == RtspPacket.PT_H264) { //当编码类型为H264时
byte packBuf[] = null;
//h264码流
try {
packBuf = readSockData(pack_len); //通过解码得到的帧数据长度,通过
} catch (OutOfMemoryError e) {
Log.d(TAG, "out of memory");
continue;
}
}
}
private byte[] readSockData(int dataBufLen) {
try {
int len = 0;
byte dataBuf[] = new byte[dataBufLen];
if (in != null) {
while (dataBufLen - len > 0) {
int ret = in.read(dataBuf); //DataInputStream in = mSocket.getInputStream();
if (ret < 0) {
return null;
}
len = len + ret;
}
return dataBuf;
}
} catch (Exception e) {
return null;
}
return null;
}然后通过以上的代码进行访问,得到的每一帧数据能够通过ffmpeg来解码并且在能在手机上播放。但是真正的问题来了,当手机网络不好时,视频就卡死在那不动了,我通过log发现原因是byte headerBuf[] = readSockData(20);接收到的rtsp头解析得到的payloadLen(也就是下面帧数据的长度)很大或者为负数,我看了下640*360分辨率码流正常大小是在2000~3000字节左右,而我在循环里面加了OutOfMemory异常处理,当payloadLen异常时,就continue,这显然不能解决问题。但是我想实现这样的效果:当某一个NALU包头接收异常时,就丢弃当前帧(如果有更好的办法来重新获取当前帧更好),然后接收下面的一个NALU包,从而不会因为一个媒体数据头接收解析数据长度错误而不能解码下面的数据。
我是刚刚入门视频播放这一块,碰到好多问题都感觉晦涩难懂,希望各位高手能够指点在下一二,可能问题写的很啰嗦,但是真心希望大家能够帮帮我。给的分不多,谢谢!
相关推荐
mongodb-linux-x86_64-ubuntu2004-8.0.13.tgz
mongodb-linux-x86_64-ubuntu2004-8.0.13
chromedriver-linux64-159.0.8135.0(Canary).zip
chromedriver-linux64-159.0.8135.0(Canary).zip
三相四桥臂电压不对称跌落补偿动态电压恢复器DVR(Simulink仿真实现)
内容概要:本文围绕三相四桥臂动态电压恢复器(DVR)在电压不对称跌落情况下的补偿能力展开,重点介绍了基于Simulink平台构建的仿真模型,用于研究和验证DVR对电网电压不平衡的动态补偿性能。系统采用三相四桥臂逆变器结构,利用其独立的中性线控制能力有效处理零序分量,结合多准PR(Proportional Resonant)控制策略实现对正负序电压分量的精确跟踪与快速响应,从而提升在不平衡负载或电网故障条件下DVR的补偿精度与系统稳定性。文中提供了完整的仿真模型及相关参考文献,涵盖控制算法设计、系统建模与参数整定等关键技术环节,适用于复杂电能质量问题的研究与教学演示。; 适合人群:电气工程、电力电子与电力系统相关专业的研究生、科研人员及从事电能质量治理的技术工程师;具备一定的电路理论、自动控制原理和Simulink仿真基础者更佳。; 使用场景及目标:①研究动态电压恢复器在三相电压不对称跌落工况下的补偿机制与控制策略;②掌握三相四桥臂逆变器在不平衡条件下的建模与控制方法;③深入理解多准PR控制器在正负序分离控制中的应用,提升对电能质量调节装置的设计与仿真能力; 阅读建议:建议结合提供的参考文献与说明文档,逐步搭建并调试Simulink仿真模型,重点关注控制器参数设计与系统动态响应特性,通过设置不同类型的电压跌落场景(如单相跌落、两相短路等)来验证控制策略的有效性与鲁棒性。
【MIMO无线编码】在瑞利衰落信道中比较2x2和4x4的BPSK调制系统(Matlab代码实现)
内容概要:本文通过Matlab代码实现,在瑞利衰落信道环境下对2x2和4x4 MIMO系统采用BPSK调制的性能进行仿真与比较,重点分析不同天线配置下的误码率(BER)表现,旨在探讨MIMO系统中天线数量增加对无线通信可靠性和传输性能的影响。研究涵盖了信道建模、信号调制解调、接收端检测算法等关键环节,并通过蒙特卡洛仿真获得统计结果,直观展示了MIMO技术在对抗多径衰落方面的优势。; 适合人群:具备通信原理基础知识和Matlab编程能力的高校学生、科研人员及从事无线通信系统设计的工程技术人员。; 使用场景及目标:①理解MIMO系统在瑞利衰落信道中的工作原理与性能评估方法;②掌握BPSK调制解调及典型MIMO检测技术的Matlab实现;③通过仿真对比不同规模MIMO系统的性能差异,为系统设计提供参考依据。; 阅读建议:建议读者结合Matlab代码逐段运行并观察仿真结果,深入理解各模块功能,同时可尝试修改参数(如信噪比范围、仿真次数、天线数目)以探究其对系统性能的影响,从而加深对MIMO无线编码技术的认知。
44-基于STC89C52粮库远程无线监测系统设计(设计说明书+全套资料).rar
项目44-基于STC89C52粮库远程无线监测系统设计 资料包括Proteus仿真+Keil程序+Altium Designer原理图+软件安装包+参考设计说明书+答辩PPT+设计流程图,保证资料完整性! 功能: (1)本设计以STC89C52单片机为控制核心,实现对粮库远程无线监测系统的稳定控制与高效管理。 (2)采用DHT11传感器检测温湿度,精准感知粮库内环境参数,为粮食储存状态监测提供关键数据。 (3)配备LCD1602显示屏实时显示温湿度信息,方便管理人员直观了解粮库环境,及时做出决策。 (4)设有无线模块实现远程数据传输,可远程监控粮库状态,提升管理效率,降低人工巡检成本。 (5)利用蜂鸣器与LED灯作为报警装置,当温湿度超出阈值时及时报警,资料助力学生掌握设计。


