Видеоплеер OpenHarmony
Видеоплеер OpenHarmony

Автор «Nuts», эксперт Huawei Cloud Enjoy, автор по контракту InfoQ, эксперт Runhe Software KOL, энтузиаст электроники Хунмэн MVP, блоггер-эксперт 51CTO, эксперт блога Alibaba Cloud, один из участников проекта с открытым исходным кодом gin-vue-admin

Поскольку в проектах часто используются видеоресурсы, в конце этого руководства создается простой проигрыватель.

Video

Поскольку использование локальных видеофайлов повлияет на размер пакета приложения, наши видеофайлы обычно поступают с сетевых адресов, и нам необходимо добавить разрешение на использование сети ohos.permission.INTERNET в «способностях», соответствующих config или Module.json.

Язык кода:javascript
копировать
"abilities":[
  {
    "permissions": ["ohos.permission.INTERNET"],
  }
]

При использовании объект VideoController может управлять одним или несколькими видео.

Язык кода:javascript
копировать
//Объект VideoController может управлять одним или несколькими видео.
controller: VideoController = new VideoController();

интерфейс

Язык кода:javascript
копировать
declare interface VideoOptions {
 
  src?: string | Resource;

  currentProgressRate?: number | string | PlaybackSpeed;
 
  previewUri?: string | PixelMap | Resource;

  controller?: VideoController;
}

image-20220813095416631

из которых толькоsrc( Путь к источнику воспроизведения видео ) Этот параметр является обязательным.

  • Поддержка локального пути видео и сетевого пути.
  • Поддерживает размещение медиа-ресурсов в папке видео или необработанных файлов в разделе ресурсов.
  • Поддерживает префикс пути dataability:// для доступа к путям видео, предоставляемым через Dataability.

currentProgressRate:number Скорость воспроизведения видео увеличена вдвое, поддерживаются версии 0,75, 1,0, 1,25, 1,75, 2,0.

previewUri:string Путь к изображению предварительного просмотра можно использовать в качестве обложки, когда видео не воспроизводится.

controller:VideoController контроллер. Объект VideoController может управлять одним или несколькими видео Если вам нужно управлять воспроизведением видео через код.、Пауза и подождите,Вы можете установить этот параметр для компонента Видео.,Затем управляйте статусом воспроизведения видео через следующий интерфейс контроллера:

Здесь мне для пояснения нужно разделить PlaybackSpeed ​​и VideoController.

Скорость воспроизведения Тип Описание Интерфейс

Speed_Forward_0_75_X

Играйте на скорости 0,75x.

Speed_Forward_1_00_X

Играйте на скорости 1x.

Speed_Forward_1_25_X

Воспроизведение со скоростью 1,25x.

Speed_Forward_1_75_X

Играйте на скорости 1,75x.

Speed_Forward_2_00_X

Играйте на скорости 2x.

имя

описывать

Язык кода:javascript
копировать
declare enum PlaybackSpeed {

  Speed_Forward_0_75_X,

 
  Speed_Forward_1_00_X,

  Speed_Forward_1_25_X,


  Speed_Forward_1_75_X,

  Speed_Forward_2_00_X,
}

VideoController

Объект VideoController может управлять одним или несколькими видео.

  • start(): void Начать игру.
  • пауза(): void Приостановить воспроизведение.
  • stop(): void Остановить воспроизведение.
  • setCurrentTime(value: number, seekMode: SeekMode)Укажите позицию прогресса воспроизведения видео и укажите режим перехода.valueЭто прогресс,seekModeЭто режим прыжка
  • requestFullscreen(): boolean() Запрашивает полноэкранное воспроизведение, true для горизонтального экрана, false для вертикального экрана.
  • exitFullscreen() : void Выход из полноэкранного режима.

Здесь мне также нужно отделить setCurrentTime

setCurrentTime8+

setCurrentTime(value: number, seekMode: SeekMode)

Укажите позицию прогресса воспроизведения видео и укажите режим перехода.

  • параметр Имя параметра Тип параметра Обязательно Значение по умолчанию параметрописыватьvaluenumberда-Позиция прогресса воспроизведения видео。seekModeSeekModeда-Режим прыжка。
  • SeekMode8+ Тип интерфейса Описание имяописыватьPreviousKeyframeПерейти к предыдущему последнему ключевому кадру。NextKeyframeПерейти к следующему последнему ключевому кадру。ClosestKeyframeПерейти к самому последнему ключевому кадру。AccurateТочный прыжок,Независимо от того, ключевой это кадр или нет.
Язык кода:javascript
копировать
declare enum SeekMode {

  PreviousKeyframe,


  NextKeyframe,


  ClosestKeyframe,

 
  Accurate,
}

Видео собственность

отключен звук (отключить звук), autoPlay (автоматическое воспроизведение), элементы управления (панель управления), objectFit (режим отображения), цикл (зацикливание воспроизведения). Среди них, если для параметра objectFit установлено значение ImageFit.Cover, весь контейнер будет покрыт.

Подробное введение

.muted(boolean) Значение по умолчанию ложь Заглушать или нет.

.autoPlay(boolean) Значение по умолчанию ложь Будет ли играть автоматически.

.controls(boolean) Значение по умолчанию true Отображается ли панель управления воспроизведением видео.

.loop(boolean) Будет ли одно видео воспроизводиться циклично.

.objectFit(ImageFit) Значение по умолчаниюCover Установите режим отображения видео. ImageFit имеет следующие значения перечисления на выбор

Описание перечисления ImageFit

имя

описывать

Cover

Сохраните соотношение сторон и уменьшите или увеличьте изображение так, чтобы обе стороны изображения были больше или равны границе дисплея.

Contain

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

Fill

Увеличение и уменьшение масштаба без сохранения соотношения сторон, чтобы изображение заполнило границы дисплея.

None

Сохраняйте исходный размер дисплея. Обычно используется вместе с атрибутом objectRepeat.

ScaleDown

Сохраняйте соотношение сторон дисплея, картинка сжимается или остается прежней.

событие

onStart() => void Это событие срабатывает во время игры。

onPause() => void Это событие срабатывает при паузе。

onFinish() => void Это событие срабатывает, когда воспроизведение заканчивается.

onError() => void Это срабатывает, когда воспроизведение не удается。

onFullscreenChange(event?: { fullscreen: boolean }) => void) Это срабатывает, когда видео входит и выходит из полноэкранного режима.

onPrepared(event?: { duration: number }) => void Это срабатывает, когда видео готово.,Вы можете получить продолжительность видео через продолжительность,Единица измерения — секунды (с).

onSeeking(event?: { time: number }) => void Информация о времени сообщается при работе с индикатором выполнения, единица измерения — с.

onSeeked(event?: { time: number }) => void После завершения работы индикатора выполнения операции информация о времени воспроизведения отображается в секундах.

onUpdate(event?: { time: number }) => void Это срабатывает, когда изменяется ход воспроизведения.,Единица измерения: с.,Интервал обновления составляет 250 мс.

лист

имя

Функцияописывать

onStart() => void

Это событие срабатывает во время игры。

onPause() => void

Это событие срабатывает при паузе。

onFinish() => void

Это событие срабатывает, когда воспроизведение заканчивается.

onError() => void

Это срабатывает, когда воспроизведение не удается。

onPrepared(event?: { duration: number }) => void

Это срабатывает, когда видео готово.,Вы можете получить продолжительность видео через продолжительность,Единица измерения — секунды (с).

onSeeking(event?: { time: number }) => void

Информация о времени сообщается при работе с индикатором выполнения, единица измерения — с.

onSeeked(event?: { time: number }) => void

После завершения работы индикатора выполнения операции информация о времени воспроизведения отображается в секундах.

onUpdate(event?: { time: number }) => void

Это срабатывает, когда изменяется ход воспроизведения.,Единица измерения: с.,Интервал обновления составляет 250 мс.

Полный пример

Язык кода:javascript
копировать
@Entry
@Component
struct Index {
  @State message: string = «Предварительный просмотр видео»
  @State previewUris: Resource = $r('app.media.openharmony'); //предварительный просмотр обложки
  controller: VideoController = new VideoController();
  @State currentProgressRate: number = 1
  @State muted: boolean = false
  @State autoPlay: boolean = true
  @State controls: boolean = true
  @State startStatus: boolean = true
  @State loop: boolean = true

  aboutToAppear() {
    this.controller.requestFullscreen(true)
    this.controller.start()
  }

  build() {

    Column() {
      Text(this.message)
        .fontSize(50)
        .fontWeight(FontWeight.Bold)
      Video({
        src: $r('app.media.video'),
        previewUri: this.previewUris, // Видео обложка
        currentProgressRate: this.currentProgressRate, // Скорость воспроизведения видео
        controller: this.controller,

      })
        .muted(this.muted) // Отключить ли звук
        .autoPlay(this.autoPlay) // Играть ли автоматически
        .controls(this.controls) // Отображается ли панель управления, управляющая воспроизведением видео
        .objectFit(ImageFit.Contain) // Режим отображения видео
        .loop(this.loop) // Зацикливать ли одно видео
        .height("60%")
        .onStart(() => {
          // Это событие срабатывает во время игры
          console.info('onStart');
        })
        .onPause(() => {
          // Это событие срабатывает при паузе
          console.info('onPause');
        })
        .onFinish(() => {
          console.info('onFinish');

        })
        .onError(() => {
          // Это срабатывает, когда воспроизведение не удается
          console.error('onError');
        })
        .onFullscreenChange((e) => {
          console.info('Это срабатывает, когда видео переходит в полноэкранный режим и выходит из него:' + e.fullscreen)
        })
        .onPrepared((e) => {
          console.info('Это срабатывает, когда видео готово:' + e.duration)
        })
        .onSeeking((e) => {
          console.info('Сообщать информацию о времени при работе с индикатором выполнения:' + e.time)
        })
        .onSeeked((e) => {
          console.info('После завершения работы индикатора выполнения операции сообщите информацию о времени воспроизведения:' + e.time)
        })
        .onUpdate((e) => {
          console.info('Это срабатывает, когда изменяется ход воспроизведения:' + e.time)
        })
      Row({}) {
        Flex({ wrap: FlexWrap.Wrap, justifyContent: FlexAlign.SpaceAround, alignItems: ItemAlign.Center }) {
          Кнопка («играть»)
            .onClick(() => {
              this.controller.start()
            }).margin(8)
          Кнопка («Пауза»)
            .onClick(() => {
              this.controller.pause()
            })
          Кнопка("Петля")
            .onClick(() => {
              this.loop=!this.loop
            })
          Кнопка("2x скорость")
            .onClick(() => {
              this.currentProgressRate=2
            })
          Кнопка («Отключить звук»)
            .onClick(() => {
              this.muted=!this.muted
            })

          Кнопка («Стоп»)
            .onClick(() => {
              this.controller.stop()
            })

          Кнопка("Воспроизвести в полноэкранном режиме")
            .onClick(() => {
              this.controller.requestFullscreen(true)
            })
          Кнопка("Выйти из полноэкранного режима")
            .onClick(() => {
              this.controller.exitFullscreen()
            }).margin(8)

          Button("Отображается ли панель управления")
            .onClick(() => {
              this.controls = !this.controls
            }).margin(8)

          Кнопка("Указать ход воспроизведения видео")
            .onClick(() => {
              this.controller.setCurrentTime(9)
            })
        }
      }
    }
    .width('100%').height('100%')
  }
}
boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose