Exoplayer не может воспроизвести rtp url

Вопрос или проблема

Я транслирую видео с использованием протокола RTP/TCP. VLC media player работает отлично с URL потока, но ExoPlayer показывает черный экран.

playerView = findViewById(R.id.playerView)
    val renderersFactory =
        DefaultRenderersFactory(this).forceEnableMediaCodecAsynchronousQueueing()
    val loadControl = DefaultLoadControl.Builder()
        .setAllocator(DefaultAllocator(true, C.DEFAULT_BUFFER_SEGMENT_SIZE))
        .setBufferDurationsMs(30_000, 60_000, 3_000, 6_000)
        .setTargetBufferBytes(C.LENGTH_UNSET)
        .setPrioritizeTimeOverSizeThresholds(true)
        .build()
    player = ExoPlayer.Builder(this, renderersFactory)
        .setLoadControl(loadControl)
        .build()
    playerView?.setPlayer(player)

    val mediaItem = MediaItem.Builder()
        .setUri("rtp://239.100.0.1:8433")
        .build()
    val mediaSource = ProgressiveMediaSource.Factory{UdpDataSource()}
        .createMediaSource(mediaItem)

    player?.setMediaSource(mediaSource)
    player?.prepare()
    player?.playWhenReady = true

Я протестировал как ExoPlayer 2, так и ExoPlayer 3, но проблема сохраняется (черный экран).

Ответ или решение

Проблема с воспроизведением RTP URL в ExoPlayer может быть вызвана несколькими факторами. Несмотря на то что VLC Media Player корректно воспроизводит поток, ExoPlayer может встречаться с различиями в обработке протоколов и кодировок. Давайте подробно рассмотрим возможные причины и решения данной ситуации.

1. Поддержка RTP в ExoPlayer

ExoPlayer не имеет встроенной поддержки RTP потоков из коробки, в отличие от VLC. При этом для работы с такими типами потоков необходимо использовать альтернативные подходы, такие как правильная настройка источника данных и выбор кодеков. В вашем коде виден пример создания UdpDataSource, однако важно убедиться, что этот класс правильно настроен.

2. Неправильный источник данных

Кодеки и исходные данные должны соответствовать формату RTP. Чтобы убедиться, что UdpDataSource правильно обрабатывает RTP, вам необходимо изучить, поддерживает ли он нужные параметры. Most likely, UdpDataSource is not able to interpret the RTP stream as VLC does. In ExoPlayer вы можете использовать DataSource.Factory, которая может упростить подбор подходящих параметров.

val dataSourceFactory = UdpDataSource.Factory()
val mediaSource = ProgressiveMediaSource.Factory(dataSourceFactory)
    .createMediaSource(mediaItem)

3. Кодеки и форматы

ExoPlayer имеет специфические требования к кодекам и форматам в зависимости от используемой версии. Убедитесь, что ваш поток использует один из поддерживаемых кодеков (например, H.264 для видео). Если передается неподдерживаемый кодек либо формат, ExoPlayer может выводить черный экран.

4. Настройки потокового воспроизведения

Настройки потокового воспроизведения, такие как DefaultLoadControl, могут быть недостаточно оптимизированы для работы с потоками RTP. Попробуйте сделать более агрессивные настройки буферизации, чтобы обеспечить максимально плавное воспроизведение потока.

val loadControl = DefaultLoadControl.Builder()
    .setBufferDurationsMs(5000, 10000, 1000, 2000)
    .setTargetBufferBytes(C.LENGTH_UNSET)
    .setPrioritizeTimeOverSizeThresholds(true)
    .build()

5. Проверка сети

Проверьте, обеспечивается ли доступ к RTP-потокам через сеть, внутри которой работает ваше приложение. Возможно, существует блокировка UDP-пакетов или их фильтрация на уровне маршрутизатора.

6. Логирование и отладка

Для детальной диагностики данной проблемы полезно включить уровень логирования ExoPlayer. Это может помочь выявить, где именно происходит сбой при попытке воспроизведения:

player?.addListener(object : Player.Listener {
    override fun onPlayerError(error: PlaybackException) {
        Log.e("ExoPlayerError", "Error: ${error.message}")
    }
})

Заключение

Хотя ExoPlayer является мощным инструментом для работы со потоковым мультимедиа, его использование с RTP-источниками требует дополнительной настройки и анализа. Проверьте кодеки, источники данных и настройки загрузки, чтобы обеспечить совместимость с вашим потоком. Используйте логи для диагностики и консультации с документацией ExoPlayer для более глубокого понимания его возможностей.

Если проблема будет сохраняться, вы можете рассмотреть альтернативные решения, такие как использование других библиотек, специализированных под RTP, или даже продолжение использования VLC для ваших нужд.

Оцените материал
Добавить комментарий

Капча загружается...