首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Android Exoplayer -用于不同视频质量和手动更改的不同URL

Android Exoplayer -用于不同视频质量和手动更改的不同URL
EN

Stack Overflow用户
提问于 2019-07-04 09:19:42
回答 1查看 3.8K关注 0票数 3

我在我的申请中使用了系外球员。我用它来播放一个网址上的视频。我试图做的是,我有三个不同的网址为高,中和低质量相同的视频,我想让用户能够改变视频质量手动。

代码语言:javascript
运行
复制
{
     "lowQualityUrl":"string url",
     "mediumQualityUrl":"string url",
     "highQualityUrl":"string url"
}

在JWplayer中,有一个选项可以为不同的质量添加不同的源/url。有什么类似的东西可以在外星球员.?

编辑:我不想一个接一个地播放视频,。我只想在上切换到同一段视频的不同质量的,就像youtube中的那样。但是我没有使用单一的url作为源,我所拥有的是3不同的url,用于相同视频的3个质量(低、中、高)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-05 09:04:48

我找到了解决这个问题的办法,或者更确切地说是一个解决办法。我使用的是外星球员在一个重新审视。这段代码可能需要一些优化。

是从另一个答案得到这个想法的,答案是在这个问题下,有这个github链接,但我想作者把它删除了。我所做的就是创建一个类来保存特定视频的所有urls。然后,在系外播放器上方显示一个旋转器,当用户选择特定的质量时,我将使用新的URL为系外播放器做准备,然后查找以前的播放位置。您可以忽略StringUtils方法。

VideoPlayerConfig.kt

代码语言:javascript
运行
复制
object VideoPlayerConfig {
//Minimum Video you want to buffer while Playing
val MIN_BUFFER_DURATION = 3000
//Max Video you want to buffer during PlayBack
val MAX_BUFFER_DURATION = 5000
//Min Video you want to buffer before start Playing it
val MIN_PLAYBACK_START_BUFFER = 1500
//Min video You want to buffer when user resumes video
val MIN_PLAYBACK_RESUME_BUFFER = 5000
} 

VideoQuality.kt

你可以根据你的需要改变这个类。我需要存储准确的3个网址为低,中和高质量的网址。我也需要在旋转器上按顺序展示它们。

代码语言:javascript
运行
复制
class VideoQuality {
private val videoQualityUrls = HashMap<String, String>()

companion object {
    val LOW = getStringResource(R.string.low)
    val MEDIUM = getStringResource(R.string.medium)
    val HIGH = getStringResource(R.string.high)
}

val qualityArray
    get() = arrayListOf<String>().apply {
        if (hasQuality(LOW)) add(LOW)
        if (hasQuality(MEDIUM)) add(MEDIUM)
        if (hasQuality(HIGH)) add(HIGH)
    }
var defaultVideoQuality: String? = HIGH

var lowQuality: String?
    set(value) {
        setVideoQualityUrl(LOW, value)
    }
    get() = videoQualityUrls[LOW] ?: ""
var mediumQuality: String?
    set(value) {
        setVideoQualityUrl(MEDIUM, value)
    }
    get() = videoQualityUrls[MEDIUM] ?: ""
var highQuality: String?
    set(value) {
        setVideoQualityUrl(HIGH, value)
    }
    get() = videoQualityUrls[HIGH] ?: ""

private fun setVideoQualityUrl(quality: String?, url: String?) {
    if (url != null && quality != null) {
        videoQualityUrls[quality] = url
    }
}

private fun hasQuality(quality: String?): Boolean {
    if (videoQualityUrls[quality] == null) {
        return false
    }
    return true
}

fun getVideoQualityUrl(quality: String?): String? {
    return videoQualityUrls[quality]
}
}

用于外部播放器实现的方法

代码语言:javascript
运行
复制
private fun initializePlayer() {
    if (exoPlayer == null) {

        val loadControl = DefaultLoadControl.Builder()
            .setBufferDurationsMs(2 * VideoPlayerConfig.MIN_BUFFER_DURATION, 2 * VideoPlayerConfig.MAX_BUFFER_DURATION, VideoPlayerConfig.MIN_PLAYBACK_START_BUFFER, VideoPlayerConfig.MIN_PLAYBACK_RESUME_BUFFER)
            .createDefaultLoadControl()
        //Create a default TrackSelector
        val videoTrackSelectionFactory = AdaptiveTrackSelection.Factory()
        val trackSelector = DefaultTrackSelector(videoTrackSelectionFactory)
        exoPlayer = ExoPlayerFactory.newSimpleInstance(itemView.context, DefaultRenderersFactory(itemView.context), trackSelector, loadControl)
        exoPlayer!!.addListener(PlayEventListener())
        val videoQualityInfo:VideoQuality = videoListVideoDataHolderData!!.videoQualityUrls //Just an object that i created and stored in a dataHolder for this view.
        val url = videoQualityInfo.getVideoQualityUrl(videoQualityInfo.defaultVideoQuality) ?: ""
        preparePlayer(url)
    }
}

private fun preparePlayer(url: String) {

    if (url.isNotEmpty()) {
        val mediaSource = buildMediaSource(StringUtils.makeHttpUrl(url))
        exoPlayer?.prepare(mediaSource)
        videoView.player = exoPlayer
    } else {
        Log.d(APPTAG, "NO DEFAULT URL")
    }
}
private fun buildMediaSource(url: String): ProgressiveMediaSource {
    val mUri: Uri = Uri.parse(url)
    val dataSourceFactory = DefaultDataSourceFactory(
        itemView.context,
        Util.getUserAgent(itemView.context, getStringResource(R.string.app_name))
    )
    val videoSource = ProgressiveMediaSource.Factory(dataSourceFactory)
        .createMediaSource(mUri)
    return videoSource
}

然后在旋转器/质量选择器的OnItemSelectedListener中

代码语言:javascript
运行
复制
videoQualitySpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
        override fun onNothingSelected(parent: AdapterView<*>?) {

        }

        override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
            val currentTime = exoPlayer?.currentPosition
            val isReadyToPlay = exoPlayer?.playWhenReady
            val urlToBuild = when (videoQualityUrls.qualityArray[position]) {
                VideoQuality.LOW -> videoQualityUrls.lowQuality
                VideoQuality.MEDIUM -> videoQualityUrls.mediumQuality
                else -> videoQualityUrls.highQuality
            }
            Log.d(APPTAG, "VIDEO DETAILS :::: ${currentTime} ${isReadyToPlay} ${urlToBuild}")
            if (!urlToBuild.isNullOrEmpty()) {
                val mediaSource = buildMediaSource(StringUtils.makeHttpUrl(urlToBuild))
                exoPlayer?.prepare(mediaSource)
                exoPlayer?.playWhenReady = isReadyToPlay ?: false
                exoPlayer?.seekTo(currentTime ?: 0)
            }

        }
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56884637

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档