1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/isrc_ohos-video-cache_ohos

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

VideoCache_ohos

Этот проект представляет собой адаптацию открытого проекта AndroidVideoCache для платформы HarmonyOS. Вы можете отслеживать версию проекта для Android через метки проекта и адрес GitHub (https://github.com/danikula/AndroidVideoCache). Описание этого проекта было опубликовано в сообществе; вы можете получить доступ к нему по следующей ссылке (https://harmonyos.51cto.com/posts/3463).

Описание проекта

  • Название проекта: Проект открытой системы видео-кэширования
  • Серия: Адаптация третьих сторон для HarmonyOS
  • Функционал: Поддерживает автоматическое кэширование видео и воспроизведение видео при отсутствии интернет-соединения
  • Статус адаптации: завершен
  • Различия при вызове: нет
  • Версия SDK: sdk5, DevEco Studio 2.1 beta3
  • Автор проекта: Лю Цзе
  • Почта: isrc_hm@iscas.ac.cn
  • Адрес документации исходного проекта: https://github.com/danikula/AndroidVideoCache
  • Язык программирования: Java
  • Зависимости внешних библиотек: нет

Исходный проект основан на версии для Android, поэтому он наследует некоторые проблемы этой версии, такие как невозможность ping-соединения с локальным сервером в некоторых случаях, но это не влияет на воспроизведение видео:

  • В некоторых случаях клиенты не могут подключиться к локальному прокси-серверу ('Ошибка пингования сервера'). Возможно, это последствие предыдущей ошибки. При этом видео будет воспроизводиться, но без кэширования.- Из-за проблем с настройками буферизации большие видео могут зависнуть после перемещения ползунка. Проще говоря, если взять за основу весь видеофайл:

    • A: Длина видео, соответствующая положению ползунка после его перемещения;
    • B: Размер временного файла для кэширования при начале перемещения ползунка;
    • C: Размер буфера (20% размера видео),

    Если 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.

  1. Запустите DevEco Studio и импортируйте скачанный jar-файл в директорию проекта "entry->libs".

  2. В файле build.gradle модуля добавьте зависимость, указав путь к jar-файлу внутри тэга dependencies.

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar', '*.har'])
    ……
}
  1. Если jar-файл не был распознан, щелкните правой кнопкой мыши по нему, выберите "Добавить как библиотеку" для его использования, затем выберите нужный модуль и нажмите "ОК".

Проект можно запустить с SDK 4 и DevEco Studio 2.1 beta2. Если проект не запускается, удалите файлы .gradle, .idea, build, gradle, build.gradle, создайте новый проект и скопируйте соответствующие файлы в корневую директорию.

Инструкция по использованию

Связанные классы: HttpProxyCacheServer

  1. Создание объекта Strategy
// Используйте стандартную стратегию кэширования с стандартным размером буфера
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;
  1. Определение функций, связанных с кэшированием, 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) {
        // Стратегия кэширования по частям/узлам, обратный вызов прогресса кэширования
    }
};
  1. Определение функций, связанных с ошибками при использовании стратегий кэширования, ReSetAfterErrorListener
mCacheServerProxy.setAttemptsTime(1); // Установка количества попыток повторной отправки в случае ошибки
// Установка слушателя обратного вызова при возникновении ошибки при использовании стратегии кэширования по частям/узлам
mCacheServerProxy.setListener(() -> {
    getUITaskDispatcher().asyncDispatch(this::resetIfError);
});
  1. Использование объекта 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 )

Вы можете оставить комментарий после Вход в систему

Введение

Описание недоступно Развернуть Свернуть
Apache-2.0
Отмена

Обновления (1)

все

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/isrc_ohos-video-cache_ohos.git
git@api.gitlife.ru:oschina-mirror/isrc_ohos-video-cache_ohos.git
oschina-mirror
isrc_ohos-video-cache_ohos
isrc_ohos-video-cache_ohos
master