代码之家  ›  专栏  ›  技术社区  ›  Yuri Schimke

如何序列化/存储ExoPlayer MediaItem

  •  0
  • Yuri Schimke  · 技术社区  · 4 年前

    是否有关于如何序列化/存储ExoPlayer MediaItem的指南?有两个原因,

    1. 在两台设备之间传递以共享播放列表,以及

    2. 用于存储在本地数据库中以缓存播放列表。

    或者MediaItem在与ExoPlayer实例交互时是一个纯粹短暂的对象吗?我应该使用自己的域模型对象吗?我目前没有自己的域对象,因为我正在尝试使用ExoPlayer类型作为此功能的API。

    首先,通过网络共享,我最终使用Parcelable和Bundle来存储它们,但对象是巨大的。

            val count = map.getInt("count")
    
            val parcel = Parcel.obtain()
            return try {
                (0 until count).mapNotNull {
                    val feedItemBytes = map.getByteArray("feed.$it")
    
                    feedItemBytes?.let {
                        parcel.setDataPosition(0)
                        parcel.unmarshall(feedItemBytes, 0, feedItemBytes.size)
                        parcel.setDataPosition(0)
    
                        val bundle = Bundle.CREATOR.createFromParcel(parcel)
    
                        val fromBundle = MediaItem.CREATOR.fromBundle(bundle)
    
                        fromBundle.buildUpon()
                            .setUri(fromBundle.mediaMetadata.mediaUri)
                            .build()
                    }
                }
            } finally {
                parcel.recycle()
            }
    

    第二种方法是存储到数据库中,最后我将自己的数据对象存储在Room和转换器中。

        fun toMediaItem(): MediaItem {
            val metadataBuilder = MediaMetadata.Builder()
                .setTitle(title)
                .setDisplayTitle(title)
                .setArtist(artist)
                .setMediaUri(Uri.parse(mediaUrl))
            if (artworkUrl != null) {
                metadataBuilder.setArtworkUri(Uri.parse(artworkUrl))
            }
            return MediaItem.fromUri(mediaUrl)
                .buildUpon()
                .setMediaId(mediaId!!.toString())
                .setMediaMetadata(metadataBuilder.build())
                .build()
        }
    
        companion object {
            fun MediaItem.toMediaAppItem(): MediaAppItem {
                val mediaId = this.mediaId.toIntOrNull()
                val mediaUrl = this.mediaMetadata.mediaUri?.toString()!!
                val artworkUrl = this.mediaMetadata.artworkUri?.toString()
                val title = this.mediaMetadata.title?.toString()
                val artist = this.mediaMetadata.albumArtist?.toString()
                val album = this.mediaMetadata.albumTitle?.toString()
                return MediaAppItem(mediaId = mediaId, mediaUrl = mediaUrl, artworkUrl = artworkUrl, title = title, artist = artist, album = album)
            }
        }
    
    0 回复  |  直到 4 年前
    推荐文章