Android 사 이 드 캐 시 구현(MP4 암호 화 되 지 않 은 m3u 8)
빨간색 상자 의 프 록 시 서버 는 실행 해 야 할 프 록 시 서버 입 니 다.클 라 이언 트 가 동 영상 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)에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 안 드 로 이 드 사 이 드 사 이 드 캐 시 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부탁드립니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.