OpenHarmony3.1新特性-surface+videoplayer实现视频播放

智数逐影人
• 阅读 899

千呼万唤始出来,在OpenHarmony最新发布的3.1版本中终于支持了surface+videoplayer实现视频播放的功能。

  1. surface+videoplayer视频播放与传统的video组件对比
    大家可能觉得不是很早就支持一个video组件就可以实现视频播放吗?是的,video组件也就简简单单能做个视频播放,而你仔细去查阅下,video组件支持的api功能太少了,很多定制化功能都无法实现。下面是3.1版本上video组件所具备的api:
    OpenHarmony3.1新特性-surface+videoplayer实现视频播放
    OpenHarmony3.1新特性-surface+videoplayer实现视频播放-开源基础软件社区
    而在3.1中添加了一个关键组件就是xcomponent,它可以设置一个type为surface,而我更关心的就是这个surface,在讲surface之前我先讲讲videoplayer。

3.1版本中同时还新增了视频播放的媒体服务videoplayer,它为我们提供了视频播放服务相关的各种api,video组件所具备的功能它全部具备,同时还具备视频首帧送显上报事件、监听视频播放宽高变化事件、监听视频缓存更新事件等等高级功能,这样就可以帮助我们自定义出非常高级的视频播放器出来了。

而videoplayer它只是个做视频播放的媒体服务,它并不能直接项video组件那样输出视频显示在显示器上,这个时候就需要借助surface了。Surface可以简单的理解为绘制时用的画布,在hml布局文件中添加一个xcomponent组件并设置type为surface,就相当于放置了一块画布。而surface在程序中可以抽象为一块内存,在js代码中xcomponent组件通过调用getXComponentSurfaceId()方法可以申请这块内存,然后就可以随意的绘制,videoplayer在完成视频的编解码服务之后,可以通过调用setDisplaySurface这个方法将视频内容输出到之前的surface内存中,从而达到最终视频在窗口上显示的功能。下图是基本架构图
OpenHarmony3.1新特性-surface+videoplayer实现视频播放
OpenHarmony3.1新特性-surface+videoplayer实现视频播放-开源基础软件社区

  1. surface+videoplayer视频播放代码实现
    下面只实现一个最基础的视频播放功能。

首先是编写hml布局文件,代码如下:

<div class="container">
    <xcomponent id="Xcomponent" type='surface' onload='LoadXcomponent'
                style="width : 400px; height : 200px; border-color : red; border-width : 5px;"></xcomponent>
</div>

然后编写js文件,代码如下:

import media from '@ohos.multimedia.media'
import fileIO from '@ohos.fileio'

let videoPlayer = undefined;
let surfaceID = undefined; // 用于保存Xcomponent接口返回的surfaceID

export default {
    data: {
        title: ""
    },

    onInit() {

    },
    // 调用Xcomponent的接口用于获取surfaceID,并保存在surfaceID变量中,该接口由XComponent组件默认加载,非主动调用
    async LoadXcomponent() {
        surfaceID = this.$element('Xcomponent').getXComponentSurfaceId();
        console.info('LoadXcomponent surfaceID is' + surfaceID);
        // 用户选择视频设置fd(本地播放)
        let fdPath = 'fd://';
        // path路径的码流可通过"hdc file send D:\xxx\01.mp3 /data/accounts/account_0/appdata" 命令,将其推送到设备上
        let path = '/data/accounts/account_0/appdata/1.mp4';
        await fileIO.open(path).then(fdNumber => {
            fdPath = fdPath + '' + fdNumber;
            console.info('open fd sucess fd is' + fdPath);
        }, err => {
            console.info('open fd failed err is' + err);
        });

        await media.createVideoPlayer().then((video) => {
            if (typeof (video) != 'undefined') {
                videoPlayer = video;
                console.info('video createVideoPlayer success');
            } else {
                console.info('video createVideoPlayer fail');
            }
        }).catch((error) => {
            console.info(`video catchCallback, error:${error.message}`);
        });
        videoPlayer.url = fdPath;
        console.info('video url success');
        // 设置surfaceID用于显示视频画面
        await videoPlayer.setDisplaySurface(surfaceID).then(() => {
            console.info('setDisplaySurface success');
        }).catch((error) => {
            console.info(`video catchCallback, error:${error.message}`);
        });


        // 调用prepare完成播放前准备工作
        await videoPlayer.prepare().then(() => {
            console.info('prepare success');
        }).catch((error) => {
            console.info(`video catchCallback, error:${error.message}`);
        });

        // 调用play开始播放
        await videoPlayer.play().then(() => {
            console.info('play success');
        }).catch((error) => {
            console.info(`video catchCallback, error:${error.message}`);
        });
    },
}
点赞
收藏
评论区
推荐文章
Easter79 Easter79
3年前
uni app video、视频播放开发
视频播放有3种解决方案,使用HTML5的自带video、从HBuilder9.1.3起新增的plus.video的原生视频播放,以及使用Native.js。1.HTML5自带video标签,可以播放符合HTML5规范的视频格式。注意不含flv、ra等三方商业公司的规范格式。HTML5的video在Android上有较多浏览
Easter79 Easter79
3年前
vue video全屏播放
需求:1、视频为长方形,页面初始化打开为横屏全屏播放视频。2、微信不支持自动播放,故自动播放需求删除。方法:1、vuevideoplayer插件因需求较简单,仅要求播放本地一个视频,故未选择使用插件。2、video<divid"video_box"style"zindex:999;":cl
Wesley13 Wesley13
3年前
RTSP协议外网视频直播监控无法播放WS
TSINGSEE青犀视频产品中,EasyNVR、EasyGBS等都是支持播放WSFLV格式的视频流的,曾经我们也处理过EasyGBS无法播放wsflv视频流的问题,大家可以回顾一下解决过程。在EasyNVREasyNVS系统架构中,同样也出现了EasyNVS在通道配置页面中播放视频流时,WSFLV无法播放的情况。!221.png(http
Jacquelyn38 Jacquelyn38
4年前
从0到1搭建一款Vue可配置视频播放器组件(Npm已发布)
前言话不多说,这篇文章主要讲述如何从0到1搭建一款适用于Vue.js的自定义配置视频播放器。我们平时在PC端网站上观看视频时,会看到有很多丰富样式的视频播放器,而我们自己写的video标签样式却是那么丑。其实像那些网站都是基于原生video标签进行开发的,只不过还得适当加工一下,才会有我们所看到的漂亮的视频播放器。开发在具体开发之前,我们需要明确我们需要做什
Stella981 Stella981
3年前
Javascript判断Video视频播放、暂停、结束完成及获取长度事件监听处理
在日常应用场景中,可能会遇到这么一个情况,需要判断用户是否完整的观看完了一部视频,在这个场景中,和视频相关的事件大体涉及到几个部分,获取视频长度,视频开始播放,暂停播放和播放结束,下面来看下如何通过JavaScript来监听获取视频的这几种状态。html页面视频标签大体如下:<video id\"video" controls\"controls
Stella981 Stella981
3年前
2020年下载bilibili 1080p视频的方法
需求:下载1080p视频。工具:安卓.b站app.安卓离线想下载的视频即可。默认保存路径/storage/emulated/0/Android/data/tv.danmaku.bili不过下载后的视频是视频音频分离的。 audio.m4s video.m4s 改对应后缀即可播放。但是我需要单个视频文件!所以需要ffmpeg来合成一下了
Wesley13 Wesley13
3年前
03.视频播放器Api说明
03.视频播放器Api说明目录介绍01.最简单的播放02.如何切换视频内核03.切换视频模式04.切换视频清晰度05.视频播放监听06.列表中播放处理07.悬浮窗口播放08.其他重要功能Api09.播放多个视频10.
Stella981 Stella981
3年前
LayaAir使用原生Video视频播放以及Video监听事件
1.原生Video的基本属性src:视频的属性,url地址poster:视频封面,没有播放时显示的图片preload:预加载|none|metadata(部分预加载)|auto。默认为autoautoplay:自动播放loop:循环播放controls:浏览器自带的控制条width:视频宽度height:视频高
可莉 可莉
3年前
2020年下载bilibili 1080p视频的方法
需求:下载1080p视频。工具:安卓.b站app.安卓离线想下载的视频即可。默认保存路径/storage/emulated/0/Android/data/tv.danmaku.bili不过下载后的视频是视频音频分离的。 audio.m4s video.m4s 改对应后缀即可播放。但是我需要单个视频文件!所以需要ffmpeg来合成一下了
Stella981 Stella981
3年前
H5中video使用
<divid"video"src""controls"true"poster""preload"auto"webkitplaysinline"true"</div属性介绍:1)src:视频地址2)controls:Gecoko会提供用户控制,允许用户控制视频的播放,包括音量,跨
Python进阶者 Python进阶者
1年前
分享一份Python实现的视频播放器源码
大家好,我是Python进阶者。一、前言前几天在Python白银交流群【云何应住】问了一个Python实现的视频播放器源码问题。问题如下:Python实现的视频播放器源码,能运行,简单明了,有吗?二、实现过程这里【瑜亮老师】一开始给了一个代码,可能有点老,