#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 ускоряет инициализацию с нескольких минут до нескольких секунд.