Android的流媒体协议支持不太好,标准只支持RTSP和MP4overHTTP。因为MP4头部大,启动会比较慢,另外MP4也不适合做直播。当然基于Android的开放性,完全可以自己做一个播放器,难点是要做解码和显示的适配,Android机型太多,这个适配工作量比较大。Android升级到4.0版本应该支持HLS,目前也有一些设备厂商在2.x版本上支持的HLS。但是要做统一的产品,还是只能用RTSP,毕竟2.x的设备仍然是市场的主流。
1、不能播放
现象:播放器打开后,缓冲一段时间,弹出播放失败
范围:所有Android设备,但是vlcplayer可以播放
原因:H.264视频的SPS、PPS没有发送。虽然在DESCRIBE的sdp应答里面已经通过config字段返回了SPS、PPS,但是Android上的播放器忽略了这个,还是需要在RTP流中增加冗余数据。
方案:RTP流中增加冗余的SPS、PPS数据
备注:实现完RTSP服务端后,在VLC上测试可以播放,但是在所有Android设备都不能播,寻找各种原因都没有结果,一度都觉得干脆放弃算了。这件事告诉了我们:永不放弃,在一次次失败后,你离成功就只有一步了。
2、无图像
现象:播放器打开后,有声音无图像
范围:部分影片,部分设备
原因:通过分析影片,发现不能播放的都是H.264HighProfile,设备硬件不支持。
方案:改成H.264Baseline压缩
备注:有一个设备能够播放H.264HighProfile(Mp4文件),都是通过RTSP就不能播放H.264HighProfile,可能是播放器做的有问题。
3、音视频不同步
现象:播放一段时间后音视频不同步
范围:部分设备
原因:时间上比较长,难定位
方案:
4、不能播放
现象:播放器打开后,直接显示失败
范围:一款三星手机
原因:在RTSPDESCRIBE请求后,直接失败,怀疑与SDP有关。后来通过与Live555对比,发现SDP中的各行顺序不一样,调整t和c的顺序,可以播放,但是原因不明。
方案:调整SDP中t和c的顺序,t在前,c在后
备注:在适配中,遇到不能播放的设备时,我们经常用Live555作对比,发现Live555确实不播放设备都能播放,也许是它实现得更符合协议标准。
5、画面卡顿
现象:播放时,画面会很慢,滞后于声音,声音正常。
范围:三星的手机
原因:H.264中,帧的时间戳有DTS和PTS两个,RTP的时间戳一般采用PTS,是不连续的。但是三星的播放器好像利用RTP的时间戳在做播放控制,时间戳不连续导致问题。更具体原因不明。
方案:修改RTP时间戳为DTS,只针对三星播放器
6、鸟语
现象:播放时,声音不正常,说话声音像鸟叫一样,很快。
范围:HTC的一款手机
原因:在将FLV文件通过RTP发送时,因为FLV的time_scale是1000,所以RTP的time_scale也设置为1000,但是按照RFC文档,音频的time_scale应该用采样率。
方案:修改time_scale,时间戳根据采样率重新计算。
备注:因为每个音频sample一般是1024个采样点,所以新的时间戳只要每帧增加1024即可。
7、一直加载
现象:播放一直处于加载过程中
范围:采用小米UI的手机
原因:RTSP服务端没有发送RTCPSenderReport
方案:发送RTCPSenderReport
8、一直加载2
现象:播放一直处于加载过程中
范围:三星的一款手机
原因:如果只发送音频,或者只发送视频,都能够播放。达尔文服务器能播,区别是音频帧合并了,一个RTP报文中有多个音频帧。没有进一步排查原因。
方案:
备注: