Android 在线视频播放总结

本文涉及的产品
对象存储 OSS,20GB 3个月
文件存储 NAS,50GB 3个月
云备份 Cloud Backup,100GB 3个月
简介: 协议选择 当前流媒体播放中常用到的协议有rtmp,rtsp和http等。各个协议适用于不同的场景。各有优点。具体的区别可参见: http://blog.csdn.net/aflyeaglenku/article/details/53929028 http://www.jianshu.com/p/5b0fa403b3ce rtsp和rtmp协议需要搭建专门的流媒体服务器。

协议选择

当前流媒体播放中常用到的协议有rtmp,rtsp和http等。各个协议适用于不同的场景。各有优点。具体的区别可参见:

播放器选择

Android 平台上支持在线播放的播放器种类繁多。有google大厂提供的开源框架Exoplayer,也有系统本身提供的在线播放控件VideoView。两种方式各有优点。大厂提供的开源框架对于使用场景中的可能会遇到特殊情况考虑比较丰富。系统本身的api使用简单,短短几行代码就能实现在线视频资源的播放。

系统播放器是如何实现在线播放

Android的VideoView是通过http协议实现边下边播的。设置VideoView远程在线资源的http url,调用start操作ViewView就可以直接边下载边播放。
具体代码参见如下:

VideoView mVv = (VideoView) findViewById(R.id.vv);
...
// 播放在线视频
mVideoUri = Uri.parse("http://****/abc.mp4");
mVv.setVideoPath(mVideoUri.toString());
...
mVv.start();

调用start操作后,通过http get请求下载文件。得到文件的metedata之后,解析出该文件的编码、帧率、时长等信息。然后边下载边送入软/硬解码器进行解码,最后通过SurfaceView将解码后的数据显示出来,比较复杂,相当于自己做流媒体播放器了。
看似简单的代码。其实系统帮我们实现了下载,解析,解码,播放等一系列操作。

遇到的坑

使用系统播放器简单,方便。看起来一切都是很完美的。直到客户发现一个问题。
用android 系统自带的 videoview 播放存储在oss的大视频(播放时长超过3分钟)。会提示java.net.ProtocolException: unexpected end of stream。但相同的视频存储在七牛云上播放却不会出现问题。

这个问题一开始很迷茫。丝毫没有查找思路。经过反复抓包测试后,发现VideoView下载到一定缓存后就不下载了。
具体表现如下:
经过1分半后服务器已断开和客户端连接

这时候我们一个同事猜测是不是服务器主动断开链接?
经过进一步大胆假设和验证。发现VideoView的缓存是有上限的。并且到达缓存上限后不会主动向服务器请求获取更多内容。此处输入图片的描述
如果视频文件播放帧率较底,缓存的文件播放时间比较长。那么这段时间内客户端都不会向服务器请求更多的数据。服务端因为长时间没收到客户端请求,从而主动断开和客户端的连接。此处输入图片的描述

找到问题的原因就好^_^。在CDN服务器上更改服务器和客户端连接超时时间。一切完美解决。等等,真的完美吗?刚刚说的,用VideoView播放存储在某友商云存储平台的视频一切正常。为什么?继续抓包。发现VideoView访问友商平台上的视频资源时因为速度的问题,缓存10m内容需要的时间是oss的5倍以上。这样客户端和存储平台服务器一直有数据交互。从而服务器不会主动断开和客户端的连接。另,VideoView在播放缓存内容完成后,没有主动去重新创建连接,从而无法播放完整的视频。这也是一个系统issue。

相关文章
|
编解码 Android开发 数据安全/隐私保护
如何在Android实现录屏直播
许多开发者在做智慧教室同屏亦或会议同屏时,基于Andriod平台采集屏幕并编码推送,往往遇到各种各样的问题,以下就我们开发过程中的一些技术考量做个分享,权当抛砖引玉:
241 2
|
测试技术 Android开发 开发者
使用 Android 在线录制|学习笔记
快速学习使用 Android 在线录制
使用 Android 在线录制|学习笔记
|
XML Android开发 数据格式
【安卓开发】Android实现录音并播放功能
【安卓开发】Android实现录音并播放功能
208 0
|
Android开发 Java
Android VideoView播放在线视频(2)
Android VideoView播放在线视频(2) 附录参考文章1简单介绍了如何使用Android VideoView播放本地视频,Android VideoView也可以直接播放在线视频资源,首先和文章1一样,需要...
1553 0
|
编解码 Android开发 开发者
Android音视频——系统播放器介绍(二)
Android音视频——系统播放器介绍(二)
171 0
Android音视频——系统播放器介绍(二)
|
Android开发
Android音视频——系统播放器介绍(一)
Android音视频——系统播放器介绍(一)
259 0
Android音视频——系统播放器介绍(一)
|
编解码 网络协议 Java
想学习Android音视频,这些你知道吗?
想学习Android音视频,这些你知道吗?
247 0
想学习Android音视频,这些你知道吗?
|
API Android开发 开发者
Android音视频——系统播放器介绍(三)
Android音视频——系统播放器介绍(三)
453 0
|
编解码 算法 Android开发
Android音视频——基础介绍
Android音视频——基础介绍
177 0