Пользовательский источник данных Exoplayer: есть ли способ заставить игрока запрашивать большие куски данных?

#java #android #video #datasource #exoplayer

#java #Android #Видео #источник данных #exoplayer

Вопрос:

Я реализовал пользовательский DataSource интерфейс для использования с. ProgressiveMediaSource

 private MediaSource buildMediaSource() {
    MyDataSource.Factory factory = new MyDataSource.Factory(getItem());
    return new ProgressiveMediaSource.Factory(factory).createMediaSource(Uri.EMPTY);
}
  

Когда я пытаюсь открыть несколько файлов MKV, проигрыватель вызывает read(byte[] buf, int offset, int readLength) функцию несколько раз, передавая 1 как readLength .

Это приводит к минутам времени инициализации до начала воспроизведения видео (плеер хочет прочитать 600000 раз по 1 байту на видео, которое у меня есть)

Для теста я настроил свой собственный http-сервер и сформировал uri для этого видео, которое затем использовал следующим образом:

 new ProgressiveMediaSource.Factory(new DefaultHttpDataSourceFactory("sdfsdfds")).createMediaSource(uri); // uri looks like http://127.0.0.1:34567/video.mkv
  

и затем player начал запрашивать 16384 as readLength . Инициализация видео занимает несколько секунд.

Есть ли у меня способ сказать игроку читать большие фрагменты? Или, может быть, есть способ сообщить MatroskaExtractor игнорировать некоторые нежелательные вещи? Мне все еще нужен поиск

Ответ №1:

Моя проблема заключалась в том, что для каждого чтения () Мне пришлось вызвать некоторые функции из собственной библиотеки, что привело к преобразованию структур Java в c , а затем обратно в java, чтобы получить ответ.

Это очень тяжелая операция всего для 1 байта. Быстрые тесты показали, что предварительная загрузка больших объемов данных на стороне java ускоряет инициализацию с нескольких минут до нескольких секунд.