热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

Android边播边缓存的实现(MP4未加密m3u8)

这篇文章主要介绍了Android边播边缓存的实现(MP4未加密m3u8),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

实现思路

红色框的 ProxyServer就是需要实现的一个代理服务器。 当客户端拿到一个视频的url(mp4或者m3u8)时,通过proxyServer转化为一个代理的url,然后请求代理服务器;代理服务器接收到客户端的请求后,先查看本地是否存在缓存,如果不存在则向真实服务器发送请求,拿到结果后再存到本地。

实现重点

缓存是一个代理服务器的主要部分,所以这部分是一个重点。本设计的缓存是一个分片的LRU缓存。分片的好处是灵活方便做LRU。当真实服务器返回一个大文件时,我们在进行切割后缓存在本地,并返回给客户端,不用等待所有数据返回后再返回给客户端。

使用方式

在app初始化的时候 创建代理服务器

public class APP extends Application {
  private static VideoCacheServer videoCacheServer;

  @Override
  public void onCreate() {
    super.onCreate();

    if (videoCacheServer == null) {
      // 缓存路径
      String cachePath = getCacheDir().getAbsolutePath();
      // 缓存大小 1024 * 1024 * 500
      videoCacheServer = new VideoCacheServer(cachePath, 1024 * 1024 * 500);
    }
  }

  public static VideoCacheServer getVideoProxyServer() {
    return videoCacheServer;
  }

}

代理服务建立好了 ,使用的时候只需要将真实url转换为代理url就好了

String proxyUrl = APP.getVideoProxyServer().getLocalProxyUrl("https://sina.com-h-sina.com/20181024/21342_8f737b71/1000k/hls/index.m3u8");
 videoView.setVideoPath(proxyUrl);

转换的规则即讲https的请求转换为http的请求 ,并且替换域名为代理服务器的地址,将真实服务器的地址作为参数添加到代理url的后面。
例如 sina.com-h-sina.com/20181024/21… 地址转换后变成了 https://127.0.0.1:3260/20181024/21342_8f737b71/1000k/hls/index.m3u8?RealHostParam=sina.com-h-sina.com  3260是VideoCacheServer监听的端口

实现细节

代理服务器的建立

public class VideoCacheServer{

 private ExecutorService pool = Executors.newFixedThreadPool(20);
 
 public int start() {
    if (isRunning) {
      return curPort;
    }
    curPort = new Random().nextInt(65535);
    try {
      final ServerSocket server = new ServerSocket(curPort);
      isRunning = true;
      singleService.submit(new Runnable() {
        @Override
        public void run() {
          while (isRunning) {
            try {
              Socket cOnnection= server.accept();
              connection.setKeepAlive(true);
              pool.submit(new ProxyHandler(connection));
            } catch (IOException ex) {
              if (Constant.enableLog) {
                logger.log(Level.WARNING, "Exception accepting connection", ex);
              }
            } catch (Exception ex) {
              if (Constant.enableLog) {
                logger.log(Level.SEVERE, "Unexpected error", ex);
              }
            }
          }
        }
      });
      return curPort;
    } catch (IOException e) {
      e.printStackTrace();
      return start();
    }
  }
}

通过socket实现端口的监听,当请求到来时,使用ProxyHandler来处理。

 public class ProxyHandler implements Runnable {

    private Socket realClientSocket;

    ProxyHandler(Socket realClientSocket) {
      this.realClientSocket = realClientSocket;
    }

    @Override
    public void run() {
      try {
        BufferedOutputStream outputStream = new BufferedOutputStream(realClientSocket.getOutputStream());
        BufferedInputStream inputStream = new BufferedInputStream(realClientSocket.getInputStream());
        HttpRequest realRequest = HttpRequest.parse(inputStream);
        HttpResponse respOnse= getResponseWithInterceptorChain(realRequest);
        writeResponseAndClose(response, outputStream);

      } catch (Exception e) {
        if (Constant.enableLog) {
          logger.log(Level.SEVERE, "error proxy ", e);
        }
      } finally {
        CloseUtil.close(realClientSocket);
      }
    }

    private HttpResponse getResponseWithInterceptorChain(HttpRequest realRequest) {
      List interceptors = new ArrayList<>();
      interceptors.add(new VideoTypeInterceptor());
      interceptors.add(new HostFilterInterceptor(curPort));
      interceptors.add(new CacheInterceptor(diskCache));
      interceptors.add(new ConnectInterceptor());
      InterceptorChain interceptorChain = new InterceptorChain(interceptors, realRequest, 0);
      return interceptorChain.proceed(realRequest);
    }
}

ProxyHandler中使用拦截器的模式,将请求分部处理

VideoTypeInterceptor 将代理的url 还原为真实的url
CacheInterceptor 用于缓存
ConnectInterceptor 建立代理服务器与真实服务器的连接
VideoTypeInterceptor 主要是针对m3u8类型,因为m3u8会先返回一个m3u8的文件,文件里面记录了每个ts的地址,VideoTypeInterceptor就是将返回的文件中的ts地址转换为代理服务器的地址

项目地址 https://github.com/ZhangHao555/VideoCacheServerDemo

到此这篇关于Android 边播边缓存的实现(MP4 未加密m3u8)的文章就介绍到这了,更多相关Android 边播边缓存内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!


推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 学习笔记(34):第三阶段4.2.6:SpringCloud Config配置中心的应用与原理第三阶段4.2.6SpringCloud Config配置中心的应用与原理
    立即学习:https:edu.csdn.netcourseplay29983432482?utm_sourceblogtoedu配置中心得核心逻辑springcloudconfi ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
author-avatar
天涯老许_137
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有