Этот проект представляет собой адаптацию открытого проекта AndroidVideoCache для платформы HarmonyOS. Вы можете отслеживать версию проекта для Android через метки проекта и адрес GitHub (https://github.com/danikula/AndroidVideoCache). Описание этого проекта было опубликовано в сообществе; вы можете получить доступ к нему по следующей ссылке (https://harmonyos.51cto.com/posts/3463).
Исходный проект основан на версии для Android, поэтому он наследует некоторые проблемы этой версии, такие как невозможность ping-соединения с локальным сервером в некоторых случаях, но это не влияет на воспроизведение видео:
В некоторых случаях клиенты не могут подключиться к локальному прокси-серверу ('Ошибка пингования сервера'). Возможно, это последствие предыдущей ошибки. При этом видео будет воспроизводиться, но без кэширования.- Из-за проблем с настройками буферизации большие видео могут зависнуть после перемещения ползунка. Проще говоря, если взять за основу весь видеофайл:
Если A ≤ B + C, то ползунок находится внутри буфера, и требуется продолжить кэширование до тех пор, пока B ≠ A, чтобы можно было прочитать данные из временного файла для воспроизведения;
Если A > B + C, значит, положение ползунка находится вне буфера, и тогда требуется запрос данных из сети и запись их непосредственно в сокет для воспроизведения, без кэширования.
Когда общая длина видео очень велика, значение C также становится большим, что приводит к увеличению размера буфера. Это может вызвать значительную задержку при перемещении ползунка, так что проигрыватель может зависнуть на длительное время перед тем, как продолжить воспроизведение.
Например, если текущий временной файл имеет размер B = 20 МБ, а длина видео составляет 3 ГБ, то C = 600 МБ. Предположим, что A = 590 МБ, тогда A < B + C, и требуется скачать сетевые данные размером 590 МБ для кэширования перед воспроизведением.Чтобы решить эту проблему, в данном проекте были добавлены возможности настройки буфера и разделённого кэширования. На данный момент реализованы два подхода: фрагментированное кэширование и кэширование по узлам.
Видео воспроизводится и одновременно кэшируется. К видео-URL добавляется префикс с адресом 127.0.0.1
и случайным портом. Локальный сервер прослушивает запросы на воспроизведение видео, перехватывает их и передает в локальное клиентское приложение-прокси. Локальное клиентское приложение использует HttpURLConnection
, чтобы скачать сетевые данные и временно сохранить их в локальном файле. Затем эти данные извлекаются из временного файла и отправляются обратно через сокет к проигрывателю. После завершения загрузки всех данных временный файл переименовывается. Поскольку данные для воспроизведения берутся из кэша, видео можно воспроизводить даже при отключенном интернете, если есть доступный кэш. Кроме того, данное решение использует модель производителя-потребителя, что позволяет в условиях слабого соединения ждать завершения записи данных в кэше перед чтением этих данных. Также используется случайный поток файла RandomAccessFile
, который позволяет перемещаться между различными позициями в файле для одновременной работы нескольких потоков чтения и записи одного временного файла. При данной стратегии порядок кэширования может быть только последовательным, каждый раз запись данных происходит в конец файла.- Стратегия кэширования по частям (новая)
Данная стратегия основана на дефолтной стратегии кэширования. Эффект заключается в том, что при перемотке видео начинается кэширование именно с этой точки, а также используются уже имеющиеся кэшированные данные для воспроизведения. Перед началом кэширования проверяется положение seekTo
относительно существующих фрагментов файлов, названных по текущему URL. Это помогает определить, требуется ли создание нового фрагмента файла или можно использовать уже существующие. Фрагменты файлов имеют имя, основанное на начальной точке кэширования, и расширение .download
. Далее определяется текущий фрагмент файла и его начальная и конечная точки кэширования. Когда текущий фрагмент файла достигает своей конечной точки кэширования, он объединяется с любыми соседними фрагментами файлов, которые затем удаляются после объединения. Этот процесс продолжается до тех пор, пока все фрагменты не будут объединены в один файл, который будет переименован.- Кэширование стратегия по узлам (новая)
Эта стратегия также базируется на дефолтной стратегии кэширования. Она обеспечивает возможность начала кэширования именно с точки перемотки видео, а также использование уже имеющихся кэшированных данных для воспроизведения. Реализация осуществляется путём использования временного файла и использования DatabaseHelper
для отслеживания начальных и конечных точек кэширования. Также используется случайный поток файла RandomAccessFile
, который позволяет перемещаться между различными позициями в файле для одновременной работы нескольких потоков чтения и записи одного временного файла. Перед началом кэширования проверяется положение seekTo относительно начальных и конечных точек, которые были заранее зафиксированы. После этого начинается кэширование с использованием RandomAccessFile
, которое прекращается при достижении конечной точки кэширования. После каждого окончания или прерывания кэширования начальные и конечные точки кэширования заносятся в DatabaseHelper
. Если начальные и конечные точки пересекаются или смежны, они объединяются. После завершения кэширования всех данных временный файл переименовывается.### Инструкция по установке1. Скачайте библиотеку VideoCache.jar.
Запустите DevEco Studio и импортируйте скачанный jar-файл в директорию проекта "entry->libs".
В файле build.gradle модуля добавьте зависимость, указав путь к jar-файлу внутри тэга dependencies.
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar', '*.har'])
……
}
Проект можно запустить с SDK 4 и DevEco Studio 2.1 beta2. Если проект не запускается, удалите файлы .gradle, .idea, build, gradle, build.gradle, создайте новый проект и скопируйте соответствующие файлы в корневую директорию.
Связанные классы: HttpProxyCacheServer
// Используйте стандартную стратегию кэширования с стандартным размером буфера
CacheStrategy strategy = new DefaultCacheStrategy();
// Используйте стандартную стратегию кэширования с размером буфера 10МБ
CacheStrategy strategy = new DefaultCacheStrategy(10 * 1024 * 1024);
// Используйте стандартную стратегию кэширования с размером буфера равным 10% от размера видео
CacheStrategy strategy = new DefaultCacheStrategy(0.1f);
``` // Используйте стратегию кэширования с разделением на части
CacheStrategy strategy = new SlicingCacheStrategy();
// Установите минимальный размер одного файла-части, если размер меньше этого значения, файл будет удалён после завершения кэширования
((SlicingCacheStrategy) strategy).setMinSingleFileSize(10 * 1024 * 1024);
// Установите размер буфера для каждого файла-части, если перемещение ползунка находится между размерами файла и буфера, используется этот файл, а не создается новый
((SlicingCacheStrategy) strategy).setMinFileCacheSize(10 * 1024 * 1024); // Используйте стратегию кэширования с одним файлом
CacheStrategy strategy = new OneFileCacheStrategy(this);
```java
private HttpProxyCacheServer mCacheServerProxy = null;
public void onStart(Intent intent) {
//...
if (mCacheServerProxy == null) {
Context context = this;
mCacheServerProxy = new HttpProxyCacheServer(context);
}
//...
}
или
private HttpProxyCacheServer mCacheServerProxy = null;
mCacheListener
private CacheListener mCacheListener = new CacheListener() {
@Override
public void onCacheAvailable(File cacheFile, String url, int percentAvailable) {
// По умолчанию используется стратегия кэширования, обратный вызов прогресса кэширования
}
@Override
public void onCachePartAvailable(File cacheFile, String url, List<long[]> percentAvailables, long fileLength) {
// Стратегия кэширования по частям/узлам, обратный вызов прогресса кэширования
}
};
ReSetAfterErrorListener
mCacheServerProxy.setAttemptsTime(1); // Установка количества попыток повторной отправки в случае ошибки
// Установка слушателя обратного вызова при возникновении ошибки при использовании стратегии кэширования по частям/узлам
mCacheServerProxy.setListener(() -> {
getUITaskDispatcher().asyncDispatch(this::resetIfError);
});
HttpProxyCacheServer
для преобразования прокси-сервера кэширования// Использование функций кэширования из второго шага
mCacheServerProxy.registerCacheListener(mCacheListener, URL);
// Преобразование URL в локальный URL
localUrl = mCacheServerProxy.getProxyUrl(URL);
```6. Использование `localUrl` как источника видео, чтобы автоматически реализовать функцию кэширования.
#### Итерация версий - v0.1.0-alpha
Основные функции реализованы
- v0.2.0-alpha
Устранена проблема длительной синхронизации Gradle
Удалены избыточные строки в config.json
- v0.3.0-alpha
1. Внесено изменение в существующую стратегию кэширования, добавлена возможность установки буферной зоны (по размеру/проценту).
2. Добавлена возможность конфигурации стратегий кэширования, позволяющая динамически заменять стратегии кэширования.
3. Добавлена стратегия кэширования по частям.
4. Добавлена стратегия кэширования для отдельных узлов.
5. Пример проекта получил возможность изменения стратегий кэширования и отображения прогресса кэширования по частям.
6. Добавлена возможность шифрования кода в библиотеках.
#### Информация о правах и лицензиях
- VideoCache_ohos распространяется под лицензией [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0).
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )