Android应用中怎么实现一个视频点播功能

  介绍

这篇文章给大家介绍Android应用中怎么实现一个视频点播功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

采用了本地代理服务的方式,通过原始url给播放器返回一个本地代理的一个url,代理url类似:http://127.0.0.1:57430 xxxx,然后播放器播放的时候请求到了你本地的代理上了。

    <李>本地代理采用ServerSocket监听127.0.0.1的有效端口,这个时候手机就是一个服务器了,客户端就是套接字,也就是播放器。 <李>读取客户端就是套接字来读取数据(http协议请求)解析http协议。 <李>根据url检查视频文件是否存在,读取文件数据给播放器,也就是往窝里写入数据。同时如果没有下载完成会进行断点下载,当然弱网的话数据需要生产消费同步处理。

<>强优化点

1。文件的缓存超过限制后没有按照lru算法删除。

文件类。

由于在移动设备上文件。setLastModified()方法不支持毫秒级的时间处理,导致超出限制大小后本应该删除老的,却没有删除抛出了异常。注释掉主动抛出的异常即可。因为文件的修改时间就是对的。

静态孔隙setLastModifiedNow(文件文件)抛出IOException {
  如果(file.exists ()) {
  现在长=System.currentTimeMillis ();
  布尔修改=file.setLastModified(现在/1000 * 1000);//>私人空fetchContentInfo()抛出ProxyCacheException {
  VideoCacheLog.debug(标签,“从“阅读内容信息;+ sourceInfo.url);
  HttpURLConnection urlConnection=零;
  InputStream InputStream=零;
  尝试{
  urlConnection=openConnectionForHeader (20000);
  长度=getContentLength (urlConnection);
  字符串mime=urlConnection.getContentType ();
  inputStream=urlConnection.getInputStream ();
  这一点。sourceInfo=new sourceInfo (sourceInfo。url、长度、mime);
  this.sourceInfoStorage.put (sourceInfo。url, sourceInfo);
  VideoCacheLog.debug(标签,“信息获取来源:“+ sourceInfo);
  }捕捉(IOException e) {
  VideoCacheLog.error(标签,“错误从“获取信息;+ sourceInfo。url, e);
  最后}{
  ProxyCacheUtils.close (inputStream);
  如果(urlConnection !=null) {
  urlConnection.disconnect ();
  }
  }
  }//头
  私人HttpURLConnection openConnectionForHeader (int超时)抛出IOException ProxyCacheException {
  HttpURLConnection连接;
  布尔重定向;
  int redirectCount=0;
  字符串url=this.sourceInfo.url;
  {做
  VideoCacheLog.debug(标签,“开放连接头“;+ url);
  连接=(HttpURLConnection)新网址(URL) .openConnection ();
  如果超时祝辞0){
  connection.setConnectTimeout(超时);
  connection.setReadTimeout(超时);
  }//只返回头部,不需要身体,既可以提高响应速度也可以减少网络流量
  connection.setRequestMethod (“HEAD");
  int代码=connection.getResponseCode ();
  重定向代码===HTTP_MOVED_PERM | |代码==HTTP_MOVED_TEMP | |代码==HTTP_SEE_OTHER;
  如果(重定向){
  url=connection.getHeaderField (“Location");
  VideoCacheLog.debug(标签,“重定向到:“+ url);
  redirectCount + +;
  connection.disconnect ();
  VideoCacheLog.debug(标签,“定向关闭:“+ url);
  }
  如果(redirectCount比;MAX_REDIRECTS) {
  把新的ProxyCacheException(“太多的重定向:“+ redirectCount);
  }
  },(重定向);
  返回连接;
  }

3。替换网络库为okhttp(因为大部分的项目都是以okhttp为网络请求库的)

为什么我们要换呢? !一是okhttp是一款高效的HTTP客户端,支持连接同一地址的链接共享同一个插座,通过连接池来减小响应延迟,还有透明的GZIP压缩,请求缓存等优势,其核心主要有路由,连接协议,拦截器,代理、安全性认证,连接池以及网络适配,拦截器主要是指添加,移除或者转换请求或者回应的头部信息。得到了android开发的认可。二是大部分的应用都是采用okhttp,而且谷歌会将其纳入android源码中。三是该作者代码中用的httpurlconnet在HttpUrlSource有这么一段:

 @Override
  公共空间close()抛出ProxyCacheException {
  如果(连接!=null) {
  尝试{
  connection.disconnect ();
  }捕捉(NullPointerException | IllegalArgumentException e) {
  字符串消息=暗却玾hy& # 63;WTF !, # 63;“;+
  “真的应该# 39;t修复后发生了https://github.com/danikula/AndroidVideoCache/issues/43。“;+
  “如果你读它>/* *
  *================================================*作者:顾修忠
  
  *版本:
  *创建日期:2017/4/13 -上午12:03
  *描述:在一些安卓手机上HttpURLConnection.disconnect()方法仍然耗时太久,
  *进行导致媒体播放器要等待很久才会开始播放,因此决定使用okhttp替换HttpURLConnection
  */公共类OkHttpUrlSource实现源{
  
  私有静态最终字符串标签=OkHttpUrlSource.class.getSimpleName ();
  私有静态最终int MAX_REDIRECTS=5;
  私人最终SourceInfoStorage SourceInfoStorage;
  私人SourceInfo SourceInfo;
  私人OkHttpClient OkHttpClient=new OkHttpClient ();
  私人电话requestCall=零;
  私人InputStream InputStream;
  
  公共OkHttpUrlSource(字符串url) {
  这(url, SourceInfoStorageFactory.newEmptySourceInfoStorage ());
  }
  
  公共OkHttpUrlSource(字符串url, SourceInfoStorage SourceInfoStorage) {
  这一点。sourceInfoStorage=checkNotNull (sourceInfoStorage);
  SourceInfo SourceInfo=sourceInfoStorage.get (url);
  这一点。sourceInfo=sourceInfo !=零,# 63;sourceInfo:
  新SourceInfo (url,整数。MIN_VALUE ProxyCacheUtils.getSupposablyMime (url));
  }
  
  公共OkHttpUrlSource (OkHttpUrlSource源){
  这一点。sourceInfo=source.sourceInfo;
  这一点。sourceInfoStorage=source.sourceInfoStorage;
  }
  
  @Override
  公共同步长度()抛出ProxyCacheException {
  如果(sourceInfo。长度==Integer.MIN_VALUE) {
  fetchContentInfo ();
  }
  返回sourceInfo.length;
  }
  
  @Override
  公共空间开放(长抵消)抛出ProxyCacheException {
  尝试{
  响应响应=openConnection(抵消,1);
  字符串mime=response.header (“Content-Type");
  这一点。inputStream=new BufferedInputStream (response.body () .byteStream (), DEFAULT_BUFFER_SIZE);
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null

Android应用中怎么实现一个视频点播功能