Проблема с декодированием UDP в Android Exoplayer 2

Я новичок в ExoPlayer, в настоящее время я собираюсь использовать его для воспроизведения Native Udp Stream (с французского цифрового телевидения: 1080p 5-10 Мбит / с с переменным битрейтом) Мне удалось воспроизвести поток udp с некоторыми тестовыми видео от http://jell.yfish.us/ на разных устройствах. Я сделал другой тест декодирования видео с HLS и Udp Streaming с этим кодом для UDP:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.myactivity);

    sufaceview = (SurfaceView) findViewById(R.id.surfaceView2);


    BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();
    TrackSelection.Factory videoTrackSelectionFactory =
            new AdaptiveTrackSelection.Factory(bandwidthMeter);
    TrackSelector trackSelector =
            new DefaultTrackSelector(videoTrackSelectionFactory);

    LoadControl loadControl = new DefaultLoadControl(
            new DefaultAllocator(true, C.DEFAULT_BUFFER_SEGMENT_SIZE),
            15000, 60000, 2500, 6000);


    player = ExoPlayerFactory.newSimpleInstance(this, trackSelector, loadControl);


    Uri uri =
            Uri.parse
                    ("udp://@239.192.2.2:1234");

    final DefaultBandwidthMeter bandwidthMeterA = new DefaultBandwidthMeter();

    DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(this,
            Util.getUserAgent(this, "teveolauncher"), bandwidthMeterA);

    extractorsFactory = new DefaultExtractorsFactory();

    DataSource.Factory udsf = new UdpDataSource.Factory() {
        @Override
        public DataSource createDataSource() {
            return new UdpDataSource(null, 3000, 100000);
        }
    };
    ExtractorsFactory tsExtractorFactory = new ExtractorsFactory() {
        @Override
        public Extractor[] createExtractors() {
            return new TsExtractor[]{new TsExtractor(MODE_SINGLE_PMT,
                    new TimestampAdjuster(0), new DefaultTsPayloadReaderFactory())};
        }
    };



    MediaSource videoSource = new ExtractorMediaSource
            (uri, udsf, tsExtractorFactory, null, null);

    player.setVideoSurfaceView(sufaceview);
    player.prepare(videoSource);
    player.setPlayWhenReady(true);

}

Для HLS я просто меняю MediaSource и datasourceFactory:

    DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(this,
            Util.getUserAgent(this, "teveolauncher"), bandwidthMeterA);

    MediaSource videoSource = new HlsMediaSource
            (uri, dataSourceFactory, null, null);

Я знаю, что Udpstreaming официально не поддерживается ExoPlayer, но класс UdpDataSource, похоже, работает хорошо.

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

Есть ли улучшения в кодировании, чтобы видео VBR декодировалось правильно? Заранее спасибо :) Извините за плохой английский :)


person Jean Multigner    schedule 24.03.2017    source источник


Ответы (1)


    Uri uri = Uri.parse("udp://@239.192.2.2:1234");

Я думаю, что UDP - это не протокол - это транспорт (например, TCP). Вы также не можете использовать tcp: // host: port / URL.

Или это работает?

person Ondrej    schedule 09.05.2018