Пример сценария: реализация AVPlayer в ArkTS для воспроизведения видео, создания AVPlayer, установки ресурсов и окон воспроизведения, установки параметров воспроизведения, управления воспроизведением (воспроизведение/пауза/переход), сброса, уничтожения ресурсов, переключения видео после завершения воспроизведения.
AVPlayer: ArkTS API для воспроизведения аудио и видео с относительно полными функциями. Он объединяет функции анализа потокового мультимедиа и локальных ресурсов, декапсуляции медиаресурсов, декодирования видео и рендеринга. Он может напрямую работать. воспроизводить mp4, видео файлы в формате mkv и других форматах. В этом примере представлена реализация воспроизведения видео с помощью avplayer. Функции включают в себя воспроизведение видео несколькими способами и управление воспроизведением видео.
Конкретные шаги реализации можно разделить на Шаг 1: Вызов createAVPlayer() для создания экземпляра AVPlayer. Шаг 2. Установите события прослушивания, необходимые для бизнеса, и используйте их в сценариях полного процесса. Шаг 3. Установка окна. Получите и установите атрибут SurfaceID, который используется для установки экрана дисплея. Приложению необходимо получить идентификатор поверхности из компонента XComponent. В то же время настройку события загрузки следует изменить на и завершить операцию установки ресурса воспроизведения в обратном вызове события загрузки. Шаг 4: Зарегистрируйте функцию обратного вызова avplayer. Шаг 5: Вызовите соответствующий интерфейс для реализации play(), паузы(. ), перейти к поиску() и другим операциям.
Вызовите createAVPlayer(), чтобы создать экземпляр AVPlayer.
1. Установите сетевой адрес через URL-адрес для воспроизведения. Адрес сетевого видео:
https://sns-video-bd.xhscdn.com/stream/110/258/01e602cadc11542d010370038e7ae8b418_258.mp4
async avPlayerLiveDemo() {
// Создать объект экземпляра avPlayer
let avPlayer: media.AVPlayer = await media.createAVPlayer();
// Создайте функцию обратного вызова изменения конечного автомата
this.setAVPlayerCallback(avPlayer);
avPlayer.url = 'https://sns-video-bd.xhscdn.com/stream/110/258/01e602cadc11542d010370038e7ae8b418_258.mp4'; // Воспроизвести онлайн-видео
}
}
2. Используйте файловую систему fs, чтобы открыть адрес песочницы, получить адрес медиафайла и воспроизвести его с помощью атрибута dataSrc.
async avPlayerLiveDemo() {
// Создать объект экземпляра avPlayer
let avPlayer: media.AVPlayer = await media.createAVPlayer();
// Создайте функцию обратного вызова изменения конечного автомата
this.setAVPlayerCallback(avPlayer);
avPlayer.url = 'https://sns-video-bd.xhscdn.com/stream/110/258/01e602cadc11542d010370038e7ae8b418_258.mp4'; // Воспроизвести онлайн-видео
}
}async avPlayerDataSrcDemo
// Создать объект экземпляра avPlayer
let avPlayer: media.AVPlayer = await media.createAVPlayer();
// Создайте функцию обратного вызова изменения конечного автомата
this.setAVPlayerCallback(avPlayer);
// Адрес источника воспроизведения в режиме воспроизведения dataSrc. Когда воспроизведение находится в режиме поиска, fileSize — это конкретный размер воспроизводимого файла, который будет присвоен ценой ниже.
let src: media.AVDataSrcDescriptor = {
fileSize: -1,
callback: (buf: ArrayBuffer, length: number, pos: number | undefined) => {
let num = 0;
if (buf == undefined || length == undefined || pos == undefined) {
return -1;
}
num = fs.readSync(this.fd, buf, { offset: pos, length: length });
if (num > 0 && (this.fileSize >= pos)) {
return num;
}
return -1;
}
}
let context = getContext(this) as common.UIAbilityContext;
// Получите адрес песочницы filesDir через UIAbilityContext, взяв в качестве примера модель Stage.
let pathDir = context.filesDir;
let path = pathDir + '/H264_AAC.mp4';
await fs.open(path).then((file: fs.File) => {
this.fd = file.fd;
})
// Получить размер воспроизводимого файла
this.fileSize = fs.statSync(path).size;
src.fileSize = this.fileSize;
avPlayer.dataSrc = src;
}
}
3. Используйте интерфейс управления ресурсами, чтобы получить файлы мультимедийных ресурсов, упакованные в HAP, и воспроизвести их с помощью атрибута fdSrc.
async avPlayerFdSrcDemo() {
// Создать объект экземпляра avPlayer
this.player = await media.createAVPlayer();
// Создайте функцию обратного вызова изменения конечного автомата
this.setAVPlayerCallback(this.player);
// Получите адрес воспроизведения медиа-ресурса через интерфейс getRawFd члена resourcesManager UIAbilityContext.
// Тип возвращаемого значения — {fd,offset,length}, fd — адрес fd пакета HAP, offset — смещение медиаресурса, а length — продолжительность воспроизведения.
let context = getContext(this) as common.UIAbilityContext;
let fileDescriptor = await context.resourceManager.getRawFd('1234.mp4');
let avFileDescriptor: media.AVFileDescriptor =
{ fd: fileDescriptor.fd, offset: fileDescriptor.offset, length: fileDescriptor.length };
// Назначение ценить fdSrc запускает отчет об инициализированном конечном автомате.
this.player.fdSrc = avFileDescriptor;
}
4. Используйте файловую систему fs, чтобы открыть адрес песочницы, получить адрес медиафайла и воспроизвести его через атрибут URL.
async avPlayerUrlDemo() {
// Создать объект экземпляра avPlayer
this.player = await media.createAVPlayer();
this.setAVPlayerCallback(this.player);
let fdPath = 'fd://';
let context = getContext(this) as common.UIAbilityContext;
// Получите адрес песочницы filesDir через UIAbilityContext, взяв в качестве примера модель Stage.
let pathDir = context.filesDir;
console.info(pathDir)
let path = pathDir + '/1234.mp4';
// Откройте соответствующий адрес файла ресурсов, чтобы получить fd, и назначьте цену URL-адресу, чтобы вызвать отчет об инициализированном конечном автомате.
let file = await fs.open(path);
fdPath = fdPath + '' + file.fd;
this.player.url = fdPath;
}
Поддерживаемые события прослушивания включают в себя:
тип события | иллюстрировать |
---|---|
stateChange | Необходимое событие для отслеживания изменения атрибута состояния игрока. |
error | Необходимые события для отслеживания сообщений об ошибках игрока. |
durationUpdate | Используется для индикаторов выполнения, отслеживания длины индикатора выполнения и продолжительности обновления ресурсов. |
timeUpdate | Используется для индикаторов выполнения, отслеживает текущее положение индикатора выполнения и обновляет текущее время. |
seekDone | Отвечайте на вызовы API и отслеживайте выполнение запросов Seek(). Если после использования функции поиска() для перехода к указанной позиции воспроизведения операция поиска будет успешной, об этом событии будет сообщено. |
speedDone | Отвечайте на вызовы API и отслеживайте выполнение запросов setSpeed(). После использования setSpeed() для установки скорости воспроизведения, если операция setSpeed прошла успешно, об этом событии будет сообщено. |
volumeChange | Отвечайте на вызовы API и отслеживайте выполнение запросов setVolume(). После использования setVolume() для регулировки громкости воспроизведения, если операция setVolume прошла успешно, об этом событии будет сообщено. |
bitrateDone | Отвечайте на вызовы API, используемые для потоков протокола HLS, и отслеживайте выполнение запросов setBitrate(). После использования setBitrate() для указания скорости передачи данных при воспроизведении, если операция setBitrate завершится успешно, об этом событии будет сообщено. |
availableBitrates | Используется для потоков протокола HLS, дополнительные битрейты для мониторинга ресурсов HLS, используемые в setBitrate(). |
bufferingUpdate | Используется для сетевого воспроизведения, мониторинга информации буфера сетевого воспроизведения. |
startRenderFrame | Используется для воспроизведения видео, отслеживая время рендеринга первого кадра воспроизведения видео. Когда AVPlayer впервые начинает вещание и переходит в состояние воспроизведения, об этом событии будет сообщено, когда на экране дисплея будет отображен первый кадр видео. Приложения обычно могут использовать это событие, чтобы сообщить и удалить видеообложку, чтобы обеспечить плавное соединение между обложкой и видеоэкраном. |
videoSizeChange | Используется для воспроизведения видео, отслеживает информацию о ширине и высоте воспроизведения видео и может использоваться для настройки размера и пропорций окна. |
audioInterrupt | Отслеживайте информацию о переключении фокуса звука и используйте ее с атрибутом audioInterruptMode. Если на текущем устройстве воспроизводится несколько мультимедиа, об этом событии будет сообщено при переключении аудиофокуса (то есть при воспроизведении других медиафайлов, таких как звонки и т. д.), и приложение сможет своевременно обработать его. |
avPlayer.on('speedDone', (number: Number) => this.speedDone(number));
avPlayer.on('seekDone', (number: Number) => this.seekDone(number));
Тип XComponent установлен на SURFACE. Когда тип установлен на SURFACE, он может поддерживать событие Load. Функция события Load заключается в обратном вызове события при загрузке подключаемого модуля и установке ресурсов. играл в обратном вызове.
build()
Column() {
XComponent({
id: 'AVPlayer',
type: XComponentType.SURFACE,
controller: this.xComponentController
})
.onLoad (()=> {
this.surfaceID = this.xComponentController.getXComponentSurfaceId()
this.xComponentContext = this.xComponentController.getXComponentContext() as Record<string, () => void>
})
2.5 Регистрация функции обратного вызова avplayer
private setAVPlayerCallback(avPlayer: media.AVPlayer) {
if (this.player == null) {
return;
}
// // Отвечайте на вызовы API и отслеживайте выполнение запросов Seek().
avPlayer.on('speedDone', (number: Number) => this.speedDone(number));
avPlayer.on('seekDone', (number: Number) => this.seekDone(number));
// Функция обратного вызова изменения конечного автомата
avPlayer.on('stateChange', async (state: string, reason: media.StateChangeReason) => {
switch (state) {
case 'idle': // После успешного вызова интерфейса сброса запускается отчет конечного автомата.
console.info('AVPlayer state idle called.');
break;
case 'initialized': // avplayer Этот отчет о состоянии активируется после установки источника воспроизведения.
console.info('AVPlayer state initialized called.');
avPlayer.surfaceId = this.surfaceID; // Установите экран дисплея. Нет необходимости настраивать его, если воспроизводимый ресурс представляет собой чистый звук.
avPlayer.prepare();
break;
case 'prepared': // Сообщите о конечном автомате после успешного завершения вызова подготовки.
console.info('AVPlayer state prepared called.');
avPlayer.play(); // Вызовите интерфейс воспроизведения, чтобы начать воспроизведение.
break;
case 'playing': // После успешного вызова игры конечный автомат срабатывает и сообщает
console.info('AVPlayer state playing called.');
break;
case 'paused': // После успешного вызова паузы конечный автомат срабатывает и сообщает
console.info('AVPlayer state paused called.');
break;
case 'completed': // После завершения воспроизведения конечный автомат срабатывает и сообщает
console.info('AVPlayer state completed called.');
avPlayer.stop(); //Вызываем интерфейс завершения воспроизведения
break;
case 'stopped': // После успешного вызова интерфейса остановки конечный автомат срабатывает и сообщает
console.info('AVPlayer state stopped called.');
avPlayer.release();
break;
case 'released':
console.info('AVPlayer state released called.');
break;
default:
console.info('AVPlayer state unknown called.');
break;
}
})
}
1. Пауза и воспроизведение
Button('start')
.onClick(() => {
this.avPlayerDataSrcNOSeekDemo()
})
.margin({right:12})
.margin({top:5})
.width(150)
Button('paused')
.onClick(() => {
this.player?.pause();
})
.margin({right:12})
.margin({top:5})
.width(150)
Button('player')
.onClick(() => {
this.player?.play();
})
.margin({right:12})
.margin({top:5})
.width(150)
2. Перестаньте играть и уничтожьте
Button('stop')
.onClick(() => {
this.player?.stop();
})
.margin({right:12})
3. Сброс переключения видео
Button('stop')
.onClick(() => {
this.player?.stop();
})
.margin({right:12})
4. Здесь установлена двойная скорость для воспроизведения на двойной скорости, можно добиться, установив перечисление PlaybackSpeed. Здесь установлена настройка SPEED_FORWARD_2_00_X, двойная скорость.
Button('speed')
.onClick(() => {
this.player?.setSpeed(media.PlaybackSpeed.SPEED_FORWARD_2_00_X);
})
.margin({right:12})
5. Поиск перехода переходит к указанной позиции воспроизведения. Его можно вызвать только в состоянии подготовки/воспроизведения/приостановки/завершения. Единица измерения времени перехода – мс. Режим перехода контролируется установкой значения перечисления.
имя | ценить | иллюстрировать |
---|---|---|
SEEK_NEXT_SYNC | 0 | Указывает переход к следующему ключевому кадру в указанный момент времени.,Рекомендуется использовать это перечисление ценить при быстрой перемотке вперед. |
SEEK_PREV_SYNC | 1 | Указывает переход к предыдущему ключевому кадру в указанный момент времени.,Рекомендуется использовать это перечисление при быстрой перемотке вперед. |
SEEK_CLOSEST | 2 | Представляет переход к ближайшему кадру к указанному моменту времени.,Рекомендуется использовать это перечисление ценить при точном поиске. |
Если вы считаете, что этот контент вам очень полезен, я хотел бы предложить вам оказать мне три небольшие услуги: