ExoPlayer รองรับรูปแบบรูปภาพต่อไปนี้ ดูวิธีผสานรวมกับไลบรารีภายนอกที่อาจรองรับรูปแบบอื่นๆ ได้ที่ ไลบรารีการโหลดรูปภาพ
| รูปแบบรูปภาพ | รองรับ | หมายเหตุ |
|---|---|---|
| BMP | ใช่ | |
| GIF | ไม่ | ไม่รองรับ Extractor |
| JPEG | ใช่ | |
| รูปภาพเคลื่อนไหว JPEG | ใช่ | รองรับรูปภาพนิ่งและวิดีโอ |
| JPEG Ultra HDR | ใช่ | กลับไปใช้ SDR ก่อน Android 14 หรือในจอแสดงผลที่ไม่ใช่ HDR |
| PNG | ใช่ | |
| WebP | ใช่ | |
| HEIF/HEIC | ใช่ | |
| รูปภาพเคลื่อนไหว HEIC | ใช่ | |
| AVIF (เกณฑ์พื้นฐาน) | ใช่ | ถอดรหัสใน Android 14 ขึ้นไปเท่านั้น |
เล่นรูปภาพในเพลย์ลิสต์
หากต้องการเล่นรูปภาพเป็นส่วนหนึ่งของเพลย์ลิสต์ ให้สร้าง MediaItem ด้วย URI ของรูปภาพ แล้วส่งไปยังเพลเยอร์ 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()
Java
// 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
Kotlin
// Create a data source factory. val dataSourceFactory: DataSource.Factory = 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()
Java
// 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 ขั้นตอนดังนี้
- กำหนด
MediaItemด้วยประเภท MIMEAPPLICATION_EXTERNALLY_LOADED_IMAGE - ระบุตัวถอดรหัสรูปภาพเพื่อดึง
Bitmapจากไลบรารีการโหลดรูปภาพ - ระบุตัวโหลดภายนอกเพื่อทริกเกอร์การแคชและการโหลดล่วงหน้า
กำหนดค่ารายการสื่อสำหรับการโหลดภายนอก
MediaItem ที่เพิ่มลงใน Player ต้องกำหนดประเภท MIME APPLICATION_EXTERNALLY_LOADED_IMAGE อย่างชัดเจนเพื่อใช้เส้นทางโค้ดของไลบรารีการโหลดรูปภาพ
Kotlin
val mediaItem = MediaItem.Builder() .setUri(imageUri) .setMimeType(MimeTypes.APPLICATION_EXTERNALLY_LOADED_IMAGE) .build()
Java
MediaItem mediaItem = new MediaItem.Builder() .setUri(imageUri) .setMimeType(MimeTypes.APPLICATION_EXTERNALLY_LOADED_IMAGE) .build();
ถอดรหัสรูปภาพโดยใช้ไลบรารีภายนอก
ตัวแสดงผลรูปภาพต้องใช้ ExternallyLoadedImageDecoder เพื่อดึง Bitmap จาก Uri คุณระบุตัวถอดรหัสนี้ได้โดยการลบล้าง DefaultRenderersFactory.getImageDecoderFactory
ตัวอย่างต่อไปนี้ใช้ Glide เพื่อโหลดรูปภาพ โดยจำกัดเอาต์พุตให้มีขนาดการแสดงผลเพื่อหลีกเลี่ยงการสร้างออบเจ็กต์ Bitmap ขนาดใหญ่มาก
Kotlin
val glideImageDecoderFactory: ImageDecoder.Factory = ExternallyLoadedImageDecoder.Factory { request: ExternalImageRequest -> val displaySize = Util.getCurrentDisplayModeSize(context) GlideFutures.submit( Glide.with(context) .asBitmap() .load(request.uri) .override(max(displaySize.x, displaySize.y)) ) } val player: Player = ExoPlayer.Builder(context) .setRenderersFactory( object : DefaultRenderersFactory(context) { override fun getImageDecoderFactory(context: Context): ImageDecoder.Factory { return glideImageDecoderFactory } } ) .build()
Java
ImageDecoder.Factory glideImageDecoderFactory = new ExternallyLoadedImageDecoder.Factory( request -> { Point displaySize = Util.getCurrentDisplayModeSize(context); return GlideFutures.submit( Glide.with(context) .asBitmap() .load(request.uri) .override(max(displaySize.x, displaySize.y))); }); Player player = new ExoPlayer.Builder(context) .setRenderersFactory( new DefaultRenderersFactory(context) { @Override protected ImageDecoder.Factory getImageDecoderFactory(Context context) { 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) ) } val player: Player = ExoPlayer.Builder(context) .setMediaSourceFactory( DefaultMediaSourceFactory(context).setExternalImageLoader(glidePreloader) ) .build()
Java
ExternalLoader glidePreloader = request -> GlideFutures.submit( Glide.with(context) .asFile() .apply( diskCacheStrategyOf(DiskCacheStrategy.DATA) .priority(Priority.HIGH) .skipMemoryCache(true)) .load(request.uri)); Player player = new ExoPlayer.Builder(context) .setMediaSourceFactory( new DefaultMediaSourceFactory(context).setExternalImageLoader(glidePreloader)) .build();