鸿蒙应用开发:视频播放

news2024/11/16 7:49:52

AVPlayer API同样适用于视频播放,与音频播放的区别仅在于是否提供surfaceId(相当于给视频播放选择一个容器)。鸿蒙官网描述,surfaceId指视频窗口ID,只允许在initialized状态下设置,在视频播放时要指定窗口进行渲染,纯音频播放不用设置。所以首先来获取窗口Id。

通过XComponent创建surfaceId

@Entry
@Component
struct Index {
  private context = getContext(this) as common.UIAbilityContext;
  private audio = new AudioPlayer();
  private surfaceId: string = ''
  private xComponentContext: Record<string, () => void> = {}
  xComponentController: XComponentController = new XComponentController()



  @State message: string = 'Hello Harmony';

  build() {
    Row() {
      Column() {
        Row(){
          // 视频播放窗口
          XComponent({
            id: 'xcomponent',
            type: XComponentType.SURFACE,
            controller: this.xComponentController
          })
            .onLoad(() => {
              this.xComponentController.setXComponentSurfaceSize({surfaceWidth: 1080, surfaceHeight: 936})
              this.surfaceId = this.xComponentController.getXComponentSurfaceId()
              this.xComponentContext = this.xComponentController.getXComponentContext() as Record<string, () => void>

            
            })
            .width('100%')
            .height('40%')
        }
}
}
}

AVPlayer初始化

在XComponent的onLoad事件中,调用初始化方法,同时将surfaceId、urlList、index传入。

this.audio.AudioInit(this.surfaceId, this.urlList, this.index)

AvdioPlayer.ets

修改了音频播放的代码,在导出类中新定义了初始化方法,并且接受三个参数:surfaceId(可有可无,音视频通用)、avdioList(播放源列表)、index(当前播放序号)

import media from '@ohos.multimedia.media';
import { BusinessError } from '@ohos.base';

let TAG = 'audio===='
let avPlayer: media.AVPlayer;
let surfaceID: string = '';
let urlList: string[] = []
let index = 0;

media.createAVPlayer().then((video: media.AVPlayer) => {
  if (video != null) {
    avPlayer = video;
    console.info(TAG + avPlayer.state.toString())
    console.info('createAVPlayer success');
  } else {
    console.error('createAVPlayer fail');
  }
}).catch((error: BusinessError) => {
  console.error(`AVPlayer catchCallback, error message:${error.message}`);
});



function setAVPlayerCallback(avPlayer: media.AVPlayer) {
  // seek操作结果回调函数
  avPlayer.on('seekDone', (seekDoneTime: number) => {
    console.info(`AVPlayer seek succeeded, seek time is ${seekDoneTime}`);
  })
  // error回调监听函数,当avPlayer在操作过程中出现错误时调用 reset接口触发重置流程
  avPlayer.on('error', (err: BusinessError) => {
    console.error(`Invoke avPlayer failed, code is ${err.code}, message is ${err.message}`);
    avPlayer.reset(); // 调用reset重置资源,触发idle状态
  })
  // 状态机变化回调函数
  avPlayer.on('stateChange', async (state: string, reason: media.StateChangeReason) => {
    switch (state) {
      case 'idle': // 成功调用reset接口后触发该状态机上报
        console.info('AVPlayer state idle called.');
        break;
      case 'initialized': // avplayer 设置播放源后触发该状态上报
        console.info('AVPlayer state initialized called.');
        avPlayer.surfaceId = surfaceID 
        avPlayer.prepare();
        break;
      case 'prepared': // prepare调用成功后上报该状态机
        console.info('AVPlayer state prepared called.');
        avPlayer.play(); // 调用播放接口开始播放
        break;
      case 'playing': // play成功调用后触发该状态机上报
        console.info('AVPlayer state playing called.');
        break;
      case 'paused': // pause成功调用后触发该状态机上报
        console.info('AVPlayer state paused called.');
        break;
      case 'completed': // 播放结束后触发该状态机上报
        console.info('AVPlayer state completed called.');
        avPlayer.stop(); //调用播放结束接口
        break;
      case 'stopped': // stop接口成功调用后触发该状态机上报
        console.info('AVPlayer state stopped called.');
        avPlayer.reset(); // 调用reset接口初始化avplayer状态
        break;
      case 'released':
        console.info('AVPlayer state released called.');
        break;
      default:
        console.info('AVPlayer state unknown called.');
        break;
    }
  })
}

export class AudioPlayer {

  public AudioInit(ID:string, avdioList:string[], index:number){
    surfaceID = ID
    urlList = avdioList
    index = index
    avPlayer.url = urlList[index];
    console.info(TAG + 'init successfully!')
    setAVPlayerCallback(avPlayer)
  }

  public AudioPlay(){
    avPlayer.play().then(() => {
      console.info('play success');
    }, (err: BusinessError) => {
      console.error('play filed,error message is :' + err.message)
    })
  }

  public AudioPause(){
    avPlayer.pause().then(() => {
      console.info('pause success');
    }, (err: BusinessError) => {
      console.error('pause filed,error message is :' + err.message)
    })
  }

  public AudioReset() {
    avPlayer.reset().then(() => {
      console.info('reset success');
      index = (index + 1)%2;
      avPlayer.url = urlList[index]
    }, (err: BusinessError) => {
      console.error('reset filed,error message is :' + err.message)
    })
  }
}

 bug:由于没有虚拟机,在预览器上AVPlayer.state一直无法识别,所以具体实现可能有偏差,还请大家多多指正~

更新~~

虚拟机搞定,视频可以播放啦

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2151082.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

破损shp文件修复

大家中秋节快乐&#xff01; 介绍 半年前写过破损shp文件修复的内容&#xff0c;当时写了一个简陋的小工具。 现在重新讲讲这方面的内容&#xff0c;这篇文章也主要围绕以下两个方面进行展开&#xff1a; 1、当时是怎么实现破损shp文件修复 2、现在怎么把这个功能集成到rs…

LINUX网络编程:TCP(1)

目录 1.认识Tcp的报头 2.确认应答机制&#xff08;ACK&#xff09; 序号与确认序号 捎带应答 3.超时重传机制 4.Tcp连接管理 三次握手 为什是三次握手 四次挥手 理解TIMEWAIT 1.认识Tcp的报头 源端口和目的端口号没什么说的 32位的序号和确认序号&#xff0c;之后会介…

如何使用ssm实现毕业生学历证明系统+vue

TOC ssm651毕业生学历证明系统vue 绪论 1.1 课题背景 二十一世纪互联网的出现&#xff0c;改变了几千年以来人们的生活&#xff0c;不仅仅是生活物资的丰富&#xff0c;还有精神层次的丰富。在互联网诞生之前&#xff0c;地域位置往往是人们思想上不可跨域的鸿沟&#xff0…

Linux C# DAY3

作业 1、 #!/bin/bash mkdir -p ~/dir/dir1 mkdir ~/dir/dir2 cp ./* ~/dir/dir1 cp ./*.sh ~/dir/dir2 cd ~/dir/ tar -cvJf dir2.tar.xz ./dir2 mv dir2.tar.xz ~/dir/dir1/ cd ~/dir/dir1/ tar -xvf dir2.tar.xz 2、 #!/bin/bash head -5 /etc/group | tail -1 sudo mkdi…

Docker安装mysql并配置主从,超详细

简介&#xff1a; 本文使用docker安装mysql&#xff0c;并创建master节点&#xff0c;slave节点用于实现主从。废话不多说&#xff0c;直接开始。 1.docker下载镜像&#xff0c;这里我以5.7版本为例。 docker pull mysql:5.7 2.在宿主机上新建如下目录&#xff0c;进行文件挂…

Lichee NanoKVM基本使用环境

Lichee NanoKVM基本使用环境 本文章主要记录一些自己在初期的使用&#xff0c;以及自己的一些经验 &#xff0c;非常感谢sipeed NanoKVM官方使用教程 外观&#xff08;博主自己的是lite版本&#xff0c;非常感谢sipeed&#xff09; Lichee NanoKVM 是基于 LicheeRV Nano 的 I…

专为GOA TFT-LCD面板设计的16ch水平移位器-iML7272A

GOA是Gate on Array的简写&#xff0c;简单可以理解为gate IC集成在玻璃上了&#xff0c;面板就可以不用gate ic了&#xff0c;窄边框面板大多数都用了GOA技术。随着窄边框设计的日益流行&#xff0c;面板设计的周边空间被逐渐压缩&#xff0c;在传统的GOA电路设计中&#xff0…

Python学习——【3.1】函数

文章目录 【3.1】函数一、函数的定义二、函数的参数三、函数的返回值&#xff08;一&#xff09;函数返回值的定义&#xff08;二&#xff09;None类型 四、函数的说明文档五、函数的嵌套调用六、函数中变量的作用域&#xff08;一&#xff09;局部变量&#xff08;二&#xff…

(数组) LeetCode 1184. 公交站间的距离

原题链接 一. 题目描述 环形公交路线上有 n 个站&#xff0c;按次序从 0 到 n - 1 进行编号。我们已知每一对相邻公交站之间的距离&#xff0c;distance[i] 表示编号为 i 的车站和编号为 (i 1) % n 的车站之间的距离。 环线上的公交车都可以按顺时针和逆时针的方向行驶。 …

解决:The play() request was interrupted by a call to pause().报错

前言&#xff1a; 最近在公司中实现进入页面之后点击单词直接播放音频的时候&#xff0c;发现音频并不会播放声音&#xff0c;并且控制台报错&#xff1a; 研究之后找到了解决方案&#xff0c;与小伙伴们进行分享 原因&#xff1a; 首先看这句话的意思&#xff1a; 在调用 …

【C++】C++ STL探索:Priority Queue与仿函数的深入解析

C语法相关知识点可以通过点击以下链接进行学习一起加油&#xff01;命名空间缺省参数与函数重载C相关特性类和对象-上篇类和对象-中篇类和对象-下篇日期类C/C内存管理模板初阶String使用String模拟实现Vector使用及其模拟实现List使用及其模拟实现容器适配器Stack与Queue 这篇文…

中国数据中心服务器CPU行业发展概述

2024中国服务器CPU行业概览&#xff1a;信创带动服务器CPU国产化 AA体系是一种基于ARM指令系统和Android操作系统的体系结构&#xff0c;主要用于移动设备。与Wintel体系不同&#xff0c;AA体系中CPU厂商对芯片或系统厂商进行指令系统或IP核授权&#xff0c;操作系统厂商提供基…

Ansbile-变量

文章目录 一、Ansible的常量&#xff08;内置的变量&#xff09;有哪些&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1…

八、explicit关键字在C++中的用法

使用方法&#xff1a;修饰单参构造函数 作用&#xff1a;explicit修饰构造函数&#xff0c;禁止类型转换 使用Date d2 19&#xff1b; 这样的方式来进行d2对象的实例化。 在程序上是可以进行下去的&#xff0c;但不符合语法、也不合逻辑。 class Date { public:Date(int day)…

sqlite数据库设计工具

下载 开发环境 VS2022 + Qt5.14.2 CMake修改 add_subdirectory(sqlite3-cmake) include_directories(${CMAKE_SOURCE_DIR}/sqlite3-cmake/src) target_link_libraries(${PROJECT_NAME} sqlite3) 效果 参考 https://github.com/sqlitebrowser/sqlitebrowser

Java之封装

文章目录 1.封装1.1 什么是封装1.2 访问限定符1.3 包1.3.1 什么是包1.3.2 导包1.3.3 自定义包 2. static2.1 static 修饰成员变量2.2 static 修饰成员方法2.3 static成员变量初始化 3. 代码快3.1 普通代码块3.2 实例代码块3.3 静态代码块 4. 对象的打印 1.封装 1.1 什么是封装…

【JPCS出版】第四届电气工程与计算机技术国际学术会议(ICEECT 2024,9月27-29)

会议信息 会议官网&#xff1a;www.iceect.com 2024 4th International Conference on Electrical Engineering and Computer Technologywww.iceect.com 时间地点&#xff1a;2024年9月27日-29日 | 线上&#xff08;ZOOM&#xff09; 最终截稿时间&#xff1a;9月23日 主办…

【GVINS】

【GVINS】 1. GVINS的系统特点2. GVINS的融合导航存在问题3. GVINS的信号的组成4. GVINS的信号的组成 原理推导知乎 1. GVINS的系统特点 概述了一种名为GVINS的系统&#xff0c;它旨在解决视觉-惯性里程计&#xff08;VIO&#xff09;在长时间运行时出现的漂移问题。GVINS通过…

neo4j导入csv数据

neo4j数据可视化实践 手动输入数据 - 官方democsv数据导入准备数据数据处理导入步骤① 导入疾病表格② 导入药物表格③导入疾病-药物关系表格 爬虫的csv文件 手动输入数据 - 官方demo 点击之后&#xff0c;按照左边10张图中的代码&#xff0c;复制粘贴熟悉语法 效果如下 csv数据…

(undone) 学习语音学中关于 i-vector 和 x-vector

来源&#xff1a;https://ieeexplore.ieee.org/stamp/stamp.jsp?tp&arnumber8461375 (这是一篇跟 X-vector 有关的论文) 这里有更适合初学者的两个资料: 1.https://www.youtube.com/watch?vR3rzN6JYm38 &#xff08;MIT教授的youtube视频&#xff09; 2.https://people.c…