ExoPlayer는 다음 이미지 형식을 지원합니다. 다른 형식을 지원할 수 있는 외부 라이브러리와 통합하는 방법은 이미지 로드 라이브러리를 참고하세요.
이미지 형식 | 지원됨 | 참고 |
---|---|---|
BMP | 예 | |
GIF | 아니요 | 추출기 지원 없음 |
JPEG | 예 | |
JPEG 모션 포토 | 예 | 정지 이미지 및 동영상 지원 |
JPEG 울트라 HDR | 예 | Android 14 이전 또는 HDR이 아닌 디스플레이에서는 SDR로 대체됩니다. |
PNG | 예 | |
WebP | 예 | |
HEIF/HEIC | 예 | |
HEIC 모션 사진 | 일부만 | 정지 이미지만 지원됨* |
AVIF (기준) | 예 | Android 14 이상에서만 디코딩됨 |
* HEIC 모션 포토의 동영상 부분은 MetadataRetriever로 가져와 독립형 파일로 재생할 수 있습니다.
MediaItem 사용
이미지를 재생목록의 일부로 재생하려면 이미지 URI로 MediaItem
를 만들고 이를 플레이어에 전달합니다. MediaItem
에는 이미지가 표시되는 시간을 지정하는 imageDurationMs
가 있어야 합니다.
Kotlin
// Create a player instance. val player = ExoPlayer.Builder(context).build() // Set the media item to be played with the desired duration. player.setMediaItem( MediaItem.Builder().setUri(imageUri).setImageDurationMs(2000).build()) // Prepare the player. player.prepare()
자바
// Create a player instance. ExoPlayer player = new ExoPlayer.Builder(context).build(); // Set the media item to be played with the desired duration. player.setMediaItem( new MediaItem.Builder().setUri(imageUri).setImageDurationMs(2000).build()); // Prepare the player. player.prepare();
모션 사진
모션 사진은 스틸 이미지와 짧은 동영상을 결합한 파일입니다.
- 이미지 기간이
setImageDuration
로 정의된 경우 모션 사진이 선언된 기간 동안 스틸 이미지로 표시됩니다. - 이미지 길이가 정의되지 않으면 모션 사진이 동영상으로 재생됩니다.
ProgressiveMediaSource 사용
더 많은 맞춤설정 옵션을 사용하려면 MediaItem
대신 ProgressiveMediaSource
를 만들어 플레이어에 직접 전달하면 됩니다.
Kotlin
// Create a data source factory. val dataSourceFactory = DefaultHttpDataSource.Factory() // Create a media item with the image URI and the desired duration. val mediaItem = MediaItem.Builder().setUri(imageUri).setImageDurationMs(2000).build() // Create a progressive media source for this media item. val mediaSource = ProgressiveMediaSource.Factory(dataSourceFactory) .createMediaSource(mediaItem) // Create a player instance. val player = ExoPlayer.Builder(context).build() // Set the media source to be played. player.setMediaSource(mediaSource) // Prepare the player. player.prepare()
자바
// Create a data source factory. DataSource.Factory dataSourceFactory = new DefaultHttpDataSource.Factory(); // Create a media item with the image URI and the desired duration. MediaItem mediaItem = new MediaItem.Builder().setUri(imageUri).setImageDurationMs(2000).build(); // Create a progressive media source for this media item. MediaSource mediaSource = new ProgressiveMediaSource.Factory(dataSourceFactory) .createMediaSource(mediaItem); // Create a player instance. ExoPlayer player = new ExoPlayer.Builder(context).build(); // Set the media source to be played. player.setMediaSource(mediaSource); // Prepare the player. player.prepare();
재생 맞춤설정
ExoPlayer는 앱의 요구사항에 맞게 재생 환경을 조정할 수 있는 여러 가지 방법을 제공합니다. 예시는 맞춤설정 페이지를 참고하세요.
이미지 로드 라이브러리
이미지는 종종 외부 이미지 로드 라이브러리(예: Glide 또는 Coil)에서 관리합니다.
이러한 라이브러리를 재생 파이프라인에 통합하려면 다음 3단계가 필요합니다.
APPLICATION_EXTERNALLY_LOADED_IMAGE
MIME 유형으로MediaItem
를 정의합니다.- 이미지 로드 라이브러리에서
Bitmap
를 검색하는 이미지 디코더를 제공합니다. - 캐싱 및 미리 로드를 트리거하는 외부 로더를 제공합니다.
외부에서 로드된 이미지 MIME 유형이 있는 MediaItem
Player
에 추가된 MediaItem
는 이미지 로드 라이브러리 코드 경로를 사용하려면 APPLICATION_EXTERNALLY_LOADED_IMAGE
MIME 유형을 명시적으로 정의해야 합니다.
Kotlin
val mediaItem = MediaItem.Builder() .setUri(imageUri) .setMimeType(MimeTypes.APPLICATION_EXTERNALLY_LOADED_IMAGE) .build()
자바
MediaItem mediaItem = new MediaItem.Builder() .setUri(imageUri) .setMimeType(MimeTypes.APPLICATION_EXTERNALLY_LOADED_IMAGE) .build();
이미지 로드 라이브러리를 사용하는 이미지 디코더
이미지 렌더러는 Uri
에서 Bitmap
를 가져오기 위해 ExternallyLoadedImageDecoder
가 필요합니다. 이 디코더는 DefaultRenderersFactory.getImageDecoderFactory
를 재정의하여 제공할 수 있습니다.
다음 예에서는 Glide를 사용하여 이미지를 로드합니다.
Kotlin
val glideImageDecoderFactory: ImageDecoder.Factory = ExternallyLoadedImageDecoder.Factory { request: ExternalImageRequest -> GlideFutures.submit(Glide.with(context).asBitmap().load(request.uri)) } val player: Player = ExoPlayer.Builder(context) .setRenderersFactory( object : DefaultRenderersFactory(context) { override fun getImageDecoderFactory(): ImageDecoder.Factory { return glideImageDecoderFactory } } ) .build()
자바
ImageDecoder.Factory glideImageDecoderFactory = new ExternallyLoadedImageDecoder.Factory( request -> GlideFutures.submit( Glide.with(context).asBitmap().load(request.uri))); Player player = new ExoPlayer.Builder(context) .setRenderersFactory( new DefaultRenderersFactory(context) { @Override protected ImageDecoder.Factory getImageDecoderFactory() { return glideImageDecoderFactory; } }) .build();
이미지 로드 라이브러리를 사용한 이미지 미리 로드
재생 중에 플레이어는 재생목록의 이전 항목이 완전히 로드되면 다음 이미지를 미리 로드하도록 요청합니다. 외부 이미지 로드 라이브러리를 사용하는 경우 이 미리 로드를 트리거할 ExternalLoader
를 지정해야 합니다. 미리 로드할 수 없거나 필요하지 않은 경우에도 이 로더는 제공해야 하지만 아무것도 할 수 없습니다.
다음 예에서는 Glide를 사용하여 요청된 이미지가 디스크에 미리 로드되도록 합니다.
Kotlin
val glidePreloader = ExternalLoader { request: LoadRequest -> GlideFutures.submit( Glide.with(context) .asFile() .apply( RequestOptions.diskCacheStrategyOf(DiskCacheStrategy.DATA) .priority(Priority.HIGH) .skipMemoryCache(true) ) .load(request.uri) ) }
Java
ExternalLoader glidePreloader = request -> GlideFutures.submit( Glide.with(context) .asFile() .apply( diskCacheStrategyOf(DiskCacheStrategy.DATA) .priority(Priority.HIGH) .skipMemoryCache(true)) .load(request.uri));