Exoplayer для android, попытка выполнить потоковую передачу файла m3u8 и получение ошибки: ни один из доступных экстракторов не смог прочитать поток - PullRequest
0 голосов
/ 10 марта 2020

Я пытаюсь передать файл m3u8 и получаю сообщение об ошибке. Я использую следующий URL: http://storage.googleapis.com/videos.siku.org/10005/dash/master.m3u8 Это потоковое видео работает в браузере. Я получаю следующую ошибку во время выполнения:

ExoPlayerImplInternal: Ошибка источника. com.google. android .exoplayer2.source.UnrecognizedInputFormatException: ни один из доступных экстракторов (MatroskaExtractor, FragmentedMp4Extractor, Mp4Extractor, Mp3Extractor, AdtsExtractor, Ac3Extractor, TsExtractor, FractorExtRect поток. в com.google. android .exoplayer2.source.ProgressiveMediaPeriod $ ExtractorHolder.selectExtractor (ProgressiveMediaPeriod. java: 1090) в com.google. android .exoplayer2.source.ProgressiveMediaPeriod $ ExtractingLoadable.loadPgressive 10. ProgressMed. *: 969) на com.google. android .exoplayer2.upstream.Loader $ LoadTask.run (Loader. java: 391) на java .util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor. java: 1162) в java .util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor. java: 636) в java .lang.Thread.run (поток. java: 764)

Я использую класс ExoPlayerHelper (который был взят из вопроса stackoverflow, хотя я реализовал это рекомендуемым способом и получал ту же ошибку)

Вот класс Я использую:

class ExoPlayerHelper(
    private val playerView: PlayerView,
    onError: (ExoPlaybackException) -> Unit,
    onPlayerBuffer: (Boolean) -> Unit
) {
    private var exoPlayer: ExoPlayer? = null
    private var mediaSource: ProgressiveMediaSource? = null
    private val playerListener = object : Player.EventListener {
        override fun onPlayerError(error: ExoPlaybackException) {
            super.onPlayerError(error)
            onError(error)
        }

        override fun onPlayerStateChanged(playWhenReady: Boolean, playbackState: Int) {
            super.onPlayerStateChanged(playWhenReady, playbackState)
            onPlayerBuffer(playbackState == Player.STATE_BUFFERING)
        }
    }

    fun initializePlayer(url: String) {
        exoPlayer = SimpleExoPlayer.Builder(playerView.context).build()
        exoPlayer!!.repeatMode = Player.REPEAT_MODE_ALL
        exoPlayer!!.addListener(playerListener)
        playerView.player = exoPlayer

        val userAgent =
            Util.getUserAgent(playerView.context, playerView.context.getString(R.string.app_name))
        mediaSource = ProgressiveMediaSource
            .Factory(
                DefaultDataSourceFactory(playerView.context, userAgent),
                DefaultExtractorsFactory()
            )
            .createMediaSource(Uri.parse(url))
            exoPlayer!!.prepare(mediaSource!!, true, false)
            exoPlayer!!.playWhenReady = true
        }
    }
}

Я получаю пустой com.google. android .exoplayer2.ui.PlayerView с отображаемыми элементами управления. При нажатии кнопки воспроизведения я получаю то же сообщение об ошибке:

com.google. android .exoplayer2.ExoPlaybackException: com.google. android .exoplayer2.source.UnrecognizedInputFormatException: нет ни одного из доступные экстракторы (MatroskaExtractor, FragmentedMp4Extractor, Mp4Extractor, Mp3Extractor, AdtsExtractor, Ac3Extractor, TsExtractor, FlvExtractor, OggExtractor, PsExtractor, WavExtractor, почему 10 * * 10 Я получаю эту ошибку UnrecognizedInputFormatException?

1 Ответ

1 голос
/ 10 марта 2020

Поскольку вы пытаетесь воспроизвести файл m3u8, вам необходимо создать источник мультимедиа HLS. Так что просто внесите изменения ниже -

mediaSource =HlsMediaSource.Factory(DefaultHttpDataSourceFactory(userAgent))
                .createMediaSource(uri)
...