Android 在线视频播放总结

协议选择

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

rtsp和rtmp协议需要搭建专门的流媒体服务器。有一定的使用成本。如果通过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下载到一定缓存后就不下载了。
具体表现如下:

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

找到问题的原因就好^_^。在CDN服务器上更改服务器和客户端连接超时时间。一切完美解决。

时间: 2024-07-28 20:03:19

Android 在线视频播放总结的相关文章

android开发-Android 如何实现在线视频播放器并缓存本地,下次没有联网的情况,可离线播放缓存

问题描述 Android 如何实现在线视频播放器并缓存本地,下次没有联网的情况,可离线播放缓存 Android 如何实现在线视频播放器并缓存本地,下次没有联网的情况,可离线播放缓存 解决方案 android中如何实现离线缓存android中如何实现离线缓存android中如何实现离线缓存 解决方案二: http://www.cnblogs.com/doorsky/p/3218043.html 你可以参考一下

在Android本地视频播放器开发

  在Android本地视频播放器开发中的搜索本地视频章节中,我们能够搜索本地视频并且显示每个视频的图片.标题.时间长度,当然如果需要添加其他的例如视频的长度和宽度可以使用Video类中的方法,既然我们获取到视频后,那么接下来就是解码视频,解码视频我使用的是ffmpeg,所以这张就是使用NDK编译手机可以使用的FFmpeg库. NDK=/opt/android-ndk-r8d PLATFORM=$NDK/platforms/android-8/arch-arm/ PREBUILT=$NDK/to

jamendo_android 一个开源的Android在线音乐播放器实例

一个开源的Android在线音乐播放器实例.整套源码主要实现了专辑浏览,音乐在线播放,下载等等.虽说看起来功能不多,但是绝对十分具有参考价值,考虑的十分严谨.因为里面应用了网络通讯,json解析,全局mediaservice,自定义View组件,自定义 Adapter,application全局缓存,变量等等,所有要在项目中考虑到的优化问题. 项目主页:http://www.open-open.com/lib/view/home/1344734233116

图片分享不成功-微信开发:(Android)在线图片无法分享,发送按钮无法点击

问题描述 微信开发:(Android)在线图片无法分享,发送按钮无法点击 最近在做微信分享功能,可是无法分享在线图片,点击分享后,跳转到微信发状态界面,但是"发送按钮"不可点击,并且无预览图.分享本地图片可以正常分享.问题如图: 代码如下: new Thread() { @Override public void run() { try{ WXImageObject imgObj = new WXImageObject(); imgObj.imageUrl = imgUrl;//右侧是

springmvc做在线视频播放,像视频网站首页图片加链接那种应该怎么做

问题描述 springmvc做在线视频播放,像视频网站首页图片加链接那种应该怎么做 springmvc做在线视频播放,像视频网站首页图片加链接那种应该怎么做.我载了一个项目,但是不会用,求大神指点 解决方案 a标签href写上对应视频页面的链接就行了 还想做什么?

winform-C# Winform项目,在不关闭在线视频播放的App客户端前提下,如何实现频道切换。

问题描述 C# Winform项目,在不关闭在线视频播放的App客户端前提下,如何实现频道切换. 在C# Winform项目,有个form窗体以及三个button按钮(button1为打开"CCTV-5"体育频道,button2为打开"CCTV-2"财经频道,button3为打开"CCTV-13"新闻频道) 目前已经可以通过以下代码实现在button1按钮中将"CBOX央视影音"在线视频播放的App客户端的"CCTV

求asp.net在线视频播放的一个实例

问题描述 求asp.net在线视频播放的一个实例,希望能详细点, 解决方案 解决方案二:没接触过,帮你顶下解决方案三:自己顶解决方案四:不是有MEDIOplayer系统控件的嘛

android源代码视频播放器

问题描述 android源代码视频播放器 android源码视频播放器的起始类是哪一个?哪位大神能帮我分析一下视频播放器到源码呀? 解决方案 Android视频播放器Android视频播放器android视频播放器 解决方案二: 你找到AndroidManifest这个文件 找到这个标志 那么包含这个标志的Activity就是这个视频播放器APP的入口了

动易SF怎么实现在线视频播放啊?

问题描述 动易SF怎么实现在线视频播放啊? 动易SF怎么实现在线视频播放啊?怎么添加播放内容模型,我用的SF4.0? 解决方案 http://blog.sina.com.cn/s/blog_4050a5bc01011hqw.html 解决方案二: 在线视频播放方法