Android 사 이 드 캐 시 구현(MP4 암호 화 되 지 않 은 m3u 8)

5474 단어 Android캐 시
사고의 방향 을 실현 하 다.

빨간색 상자 의 프 록 시 서버 는 실행 해 야 할 프 록 시 서버 입 니 다.클 라 이언 트 가 동 영상 url(mp4 또는 m3u 8)을 받 았 을 때 proxy Server 를 통 해 프 록 시 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 을 통 해 포트 감청 을 실현 하고 요청 이 왔 을 때 프 록 시 Handler 를 사용 합 니 다.

 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<Interceptor> 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);
    }
}
Proxy Handler 에서 차단 기 를 사용 하 는 모드,부분 처리 요청
VideoTypeInterceptor 는 에이전트 의 url 을 실제 url 로 복원 합 니 다.
캐 시 용 CacheInterceptor
ConnectInterceptor 프 록 시 서버 와 실제 서버 의 연결 구축
VideoTypeInterceptor 는 주로 m3u 8 형식 을 대상 으로 합 니 다.m3u 8 은 먼저 m3u 8 의 파일 을 되 돌려 주기 때문에 파일 에 모든 ts 의 주 소 를 기록 합 니 다.VideoTypeInterceptor 는 되 돌아 온 파일 의 ts 주 소 를 프 록 시 서버 의 주소 로 변환 합 니 다.
프로젝트 주소
안 드 로 이 드 사 이 드 캐 시 실현(MP4 암호 화 되 지 않 은 m3u 8)에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 안 드 로 이 드 사 이 드 사 이 드 캐 시 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부탁드립니다!

좋은 웹페이지 즐겨찾기