비디오 소비 및 데이터 요구가 증가함에 따라 오프라인에서 비디오를 시청할 필요성도 증가했습니다. 사용자는 비행기에 있는 동안이나 인터넷 연결이 낮은 장소와 같이 오프라인일 때도 다운로드한 동영상을 볼 수 있으며 안전한 액세스 방법을 제공하고 사용자의 스토리지에 직접 저장되는 것을 방지합니다.
그러면 어떻게 작동합니까?
Google ExoPlayer를 사용하면 오프라인 재생을 위해 미디어(m3u8)를 다운로드하는 기능을 쉽게 추가할 수 있습니다.
여기서는 전체 파일을 다운로드하지 않고 장치 캐시에 비디오 청크를 유지하고 청크의 모든 배열은 비디오 URL에 매핑됩니다.
URL 예 = [c1,c2,c3,c4…]
이제 Exoplayer가 이 비디오 URL에 액세스하려고 할 때마다 네트워크 호출을 통해 URL을 통해 직접 제공되거나 우리가 얻은 비디오 청크를 사용하여 버퍼 오버헤드 없이 해당 비디오를 직접 재생할 수 있습니다. 즉, 오프라인 재생
Netflix, Amazon Prime Video 및 YouTube를 포함한 많은 앱은 매우 유사한 기술을 사용하여 작동합니다.
다운로드 서비스: 이것은 DownloadManager에 대한 래퍼 역할을 하고 여기에 명령을 전달하는 Exoplayer와 함께 패키징된 기본 다운로드 서비스입니다. 또한 이 서비스는 앱이 백그라운드에 있을 때도 ExoPlayer 다운로드를 계속 실행하는 데 도움이 됩니다.
다운로드 관리자: 이름에서 알 수 있듯이 여러 다운로드 관리, 다운로드 상태 로드 및 저장, 다운로드 시작 및 중지를 돕는 관리자입니다.
HTTP 데이터 소스: HTTP 연결을 통해 제공된 URI(데이터 소스)에서 미디어 콘텐츠를 다운로드하는 데 도움이 되는 인터페이스입니다.
캐시: 위에 지정된 다운로드 관리자가 데이터 청크(예: 비디오 콘텐츠)를 다운로드하면 캐시 데이터 소스를 사용하여 장치 캐시 내부에 저장됩니다.
콘텐츠 조회 중(진행 중/이미 다운로드됨)
다운로드 대화 도우미: ExoPlayer의 내부 다운로드 도우미에 대한 래퍼입니다.
다운로드 초기화 및 제거.
미디어에서 트랙 정보 추출
미디어 트랙 다운로드를 위한 선택 메뉴 표시
선택한 트랙을 기반으로 다운로드 요청을 생성합니다.
트랙 선택 대화 상자: 다운로드할 비디오 및 오디오 트랙을 선택할 수 있는 옵션을 사용자에게 제공하는 다운로드 팝업 대화 상자입니다.
오프라인 다운로드 서비스: 모든 Exoplayer 다운로드 작업을 관리하는 데 도움이 되는 ExoPlayer 원본 DownloadService에 대한 래퍼입니다.
다운로드 시작/중지
다운로드 일시 중지/계속
다운로드 제거
진행 중인 다운로드의 상태(알림을 통해) 추적/표시
터미널 상태 알림 도우미: OfflineDownloadService의 도움으로 다운로드 진행 상황 알림을 통해 사용자에게 알리는 이 도움말과 함께 다운로드 상태가 변경될 때마다 알려주는 다운로드 상태 추적 도우미입니다.
Start/Stop a download
public void toggleDownload(
FragmentManager fragmentManager,
MediaItem mediaItem,
RenderersFactory renderersFactory
) {
Download download = downloads.get(checkNotNull(mediaItem.localConfiguration).uri);
if (download != null && download.state != Download.STATE_FAILED) {
DownloadService.sendRemoveDownload(
/* context= */ context,
/* DownloadService= */ OfflineVideoDownloadService.class,
/* id= */ download.request.id,
/* foreground= */ false
);
} else {
if (startDownloadDialogHelper != null) {
startDownloadDialogHelper.release();
}
DownloadHelper helper =
DownloadHelper.forMediaItem(
context,
mediaItem,
renderersFactory,
dataSourceFactory
);
startDownloadDialogHelper =
new StartDownloadDialogHelper(
/* fragmentManager= */fragmentManager,
/* downloadHelper= */ helper,
/* mediaItem= */mediaItem
);
}
}
이 방법은 다운로드를 시작/중지하는 데 도움이 되는 다운로드 추적기의 일부입니다.
내부적으로 이러한 방법은
다운로드 서비스: 이미 다운로드된 미디어 항목을 제거하려면
다운로드 대화 도우미: 위에서 언급한 대로 새로 다운로드를 시작하려면 이 도우미는 다운로드 초기화, 트랙 정보 추출 및 해당 정보를 사용자가 선택한 트랙을 다운로드할 수 있는 대화 게시물 형식으로 표시하는 데 도움이 됩니다.
Playing downloaded content offline
ExoPlayer player = ExoPlayer.Builder(this).build()
player?.playWhenReady = true
val mediaSource = downloadTracker?.getDownloadRequest(Uri.parse(VIDEO_URL))!!.let {
DownloadHelper.createMediaSource(
it,
DemoUtil.getDataSourceFactory(this)
)
}
player?.setMediaSource(mediaSource)
player?.prepare()
이 메서드는 앞서 다운로드한 미디어 콘텐츠를 재생하기 위해 ExoPlayer를 초기화하는 것입니다. 여기에서 Download Tracker는 비디오 URL을 사용하여 다운로드한 미디어에 대한 다운로드 요청을 받는 데 도움이 되며 다운로드 요청은 미디어 소스를 만드는 데 사용되며 캐시 데이터 소스를 사용하여 캐시에서 다운로드한 콘텐츠를 가져옵니다.
'android' 카테고리의 다른 글
Jetpack Compose에서 Activity가 뭐예요? (0) | 2025.05.05 |
---|---|
안드로이드 스튜디오 설치 (0) | 2025.04.30 |
안드로이드 리스트뷰에 버튼 넣기. (Android ListView with Button) (0) | 2024.10.10 |
Java에서는 문자열 목록에서 빈 요소를 제거 (0) | 2024.10.10 |
Kotlin의 목록에서 null 및 빈 값 제거 (1) | 2024.10.10 |