OpenHarmony多媒体-ijkplayer

简介

ijkplayer是OpenHarmony环境下可用的一款基于FFmpeg的视频播放器。

演示

编译运行

1、通过IDE工具下载依赖SDK,Tools->SDK Manager->OpenHarmony SDK 把native选项勾上下载,API版本>=9

2、开发板选择RK3568,ROM下载地址. 选择开发板类型是rk3568,请使用最新的版本

3、使用git clone下载源码,不要直接通过gitee网页的方式下载

下载安装

ohpm install @ohos/ijkplayer

使用说明

   import { IjkMediaPlayer } from "@ohos/ijkplayer";import type { OnPreparedListener } from "@ohos/ijkplayer";import type { OnVideoSizeChangedListener } from "@ohos/ijkplayer";import type { OnCompletionListener } from "@ohos/ijkplayer";import type { OnBufferingUpdateListener } from "@ohos/ijkplayer";import type { OnErrorListener } from "@ohos/ijkplayer";import type { OnInfoListener } from "@ohos/ijkplayer";import type { OnSeekCompleteListener } from "@ohos/ijkplayer";import { LogUtils } from "@ohos/ijkplayer";

在UI中配置XComponent控件

    XComponent({id: 'xcomponentId',type: 'surface',libraryname: 'ijkplayer_napi'}).onLoad((context) => {this.initDelayPlay(context);}).onDestroy(() => {}).width('100%').aspectRatio(this.aspRatio)

播放

    let mIjkMediaPlayer = IjkMediaPlayer.getInstance();// 设置XComponent回调的contextmIjkMediaPlayer.setContext(this.mContext);// 设置debug模式mIjkMediaPlayer.setDebug(true);// 初始化配置mIjkMediaPlayer.native_setup();// 设置视频源mIjkMediaPlayer.setDataSource(url); // 设置视频源http请求头let headers =  new Map([["user_agent", "Mozilla/5.0 BiliDroid/7.30.0 (bbcallen@gmail.com)"],["referer", "https://www.bilibili.com"]]);mIjkMediaPlayer.setDataSourceHeader(headers);// 使用精确寻帧 例如,拖动播放后,会寻找最近的关键帧进行播放,很有可能关键帧的位置不是拖动后的位置,而是较前的位置.可以设置这个参数来解决问题mIjkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "enable-accurate-seek", "1");// 预读数据的缓冲区大小mIjkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "max-buffer-size", "102400");// 停止预读的最小帧数mIjkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "min-frames", "100");// 启动预加载mIjkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "start-on-prepared", "1");// 设置无缓冲,这是播放器的缓冲区,有数据就播放mIjkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "packet-buffering", "0");// 跳帧处理,放CPU处理较慢时,进行跳帧处理,保证播放流程,画面和声音同步mIjkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "framedrop", "5");// 最大缓冲cache是3s, 有时候网络波动,会突然在短时间内收到好几秒的数据// 因此需要播放器丢包,才不会累积延时// 这个和第三个参数packet-buffering无关。mIjkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "max_cached_duration", "3000");// 无限制收流mIjkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "infbuf", "1");// 屏幕常亮mIjkMediaPlayer.setScreenOnWhilePlaying(true);// 设置超时mIjkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "timeout", "10000000");mIjkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "connect_timeout", "10000000");mIjkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "listen_timeout", "10000000");mIjkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "addrinfo_timeout", "10000000");mIjkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "dns_cache_timeout", "10000000");let mOnVideoSizeChangedListener: OnVideoSizeChangedListener = {onVideoSizeChanged(width: number, height: number, sar_num: number, sar_den: number) {that.aspRatio = width / height;LogUtils.getInstance().LOGI("setOnVideoSizeChangedListener-->go:" + width + "," + height + "," + sar_num + "," + sar_den)that.hideLoadIng();}}mIjkMediaPlayer.setOnVideoSizeChangedListener(mOnVideoSizeChangedListener);let mOnPreparedListener: OnPreparedListener = {onPrepared() {LogUtils.getInstance().LOGI("setOnPreparedListener-->go");}}mIjkMediaPlayer.setOnPreparedListener(mOnPreparedListener);let mOnCompletionListener: OnCompletionListener = {onCompletion() {LogUtils.getInstance().LOGI("OnCompletionListener-->go")that.currentTime = that.stringForTime(mIjkMediaPlayer.getDuration());that.progressValue = PROGRESS_MAX_VALUE;that.stop();}}mIjkMediaPlayer.setOnCompletionListener(mOnCompletionListener);let mOnBufferingUpdateListener: OnBufferingUpdateListener = {onBufferingUpdate(percent: number) {LogUtils.getInstance().LOGI("OnBufferingUpdateListener-->go:" + percent)}}mIjkMediaPlayer.setOnBufferingUpdateListener(mOnBufferingUpdateListener);let mOnSeekCompleteListener: OnSeekCompleteListener = {onSeekComplete() {LogUtils.getInstance().LOGI("OnSeekCompleteListener-->go")that.startPlayOrResumePlay();}}mIjkMediaPlayer.setOnSeekCompleteListener(mOnSeekCompleteListener);let mOnInfoListener: OnInfoListener = {onInfo(what: number, extra: number) {LogUtils.getInstance().LOGI("OnInfoListener-->go:" + what + "===" + extra)}}mIjkMediaPlayer.setOnInfoListener(mOnInfoListener);let mOnErrorListener: OnErrorListener = {onError(what: number, extra: number) {LogUtils.getInstance().LOGI("OnErrorListener-->go:" + what + "===" + extra)that.hideLoadIng();prompt.showToast({message:"亲,视频播放异常,系统开小差咯"});}}mIjkMediaPlayer.setOnErrorListener(mOnErrorListener);mIjkMediaPlayer.setMessageListener();mIjkMediaPlayer.prepareAsync();mIjkMediaPlayer.start();

暂停

   mIjkMediaPlayer.pause();

停止

   mIjkMediaPlayer.stop();

重置

   mIjkMediaPlayer.reset();

释放

   mIjkMediaPlayer.release();

快进、后退

   mIjkMediaPlayer.seekTo(msec);

倍数播放

   mIjkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "soundtouch", "1");mIjkMediaPlayer.setSpeed("2f");

屏幕常亮

   mIjkMediaPlayer.setScreenOnWhilePlaying(true);

循环播放

   mIjkMediaPlayer.setLoopCount(true);

设置音量

   mIjkMediaPlayer.setVolume(leftVolume, rightVolume);

接口说明

IjkMediaPlayer.getInstance()

接口名参数返回值说明
setContextcontext: objectvoid设置XComponent回调的context
setDebugopen: booleanvoid设置日志开关
native_setupvoid初始化配置
setDataSourceurl: stringvoid设置视频源地址
setDataSourceHeaderheaders: Map<string, string>void设置视频源的HTTP请求头
setOptioncategory:string, key: string, value: stringvoid设置播放前预设参数
setOptionLongcategory:string, key: string, value: stringvoid设置播放前预设参数
prepareAsyncvoid加载视频
startvoid播放视频
stopvoid停止播放
pausevoid暂停播放
resetvoid视频重置
releasevoid释放资源
seekTomsec: stringvoid快进、后退
setScreenOnWhilePlayingon: booleanvoid设置屏幕常亮
setSpeedspeed: stringvoid设置播放倍数
getSpeednumber获取设置的倍数
isPlayingboolean查看是否正在播放状态
setOnVideoSizeChangedListenerlistener: OnVideoSizeChangedListenervoid设置获取视频宽高回调监听
setOnPreparedListenerlistener: OnPreparedListenervoid设置视频准备就绪回调监听
setOnInfoListenerlistener: OnInfoListenervoid设置播放器的各种状态回调监听
setOnErrorListenerlistener: OnErrorListenervoid设置播放异常回调监听
setOnBufferingUpdateListenerlistener: OnBufferingUpdateListenervoid设置buffer缓冲回调监听
setOnSeekCompleteListenerlistener: OnSeekCompleteListenervoid设置快进后退回调监听
setMessageListenervoid设置视频监听器到napi用于接收回调
getVideoWidthnumber获取视频宽度
getVideoHeightnumber获取视频高度
getVideoSarNumnumber获取视频高度
getVideoSarDennumber获取视频高度
getDurationnumber获取视频总的时长
getCurrentPositionnumber获取视频播放当前位置
getAudioSessionIdnumber获取音频sessionID
setVolumeleftVolume: string,rightVolume:stringvoid设置音量
setLoopCountlooping: booleanvoid设置循环播放
isLoopingboolean查看当前是否循环播放
selectTracktrack: stringvoid选择轨道
deselectTracktrack: stringvoid删除选择轨道
getMediaInfoobject获取媒体信息

依赖的三方库编译指导

1、FFmpeg:基于B站的FFmpeg版本(ff4.0–ijk0.8.8–20210426–001):FFmpeg源码链接, 由于工具链问题,请使用GN编译,编译教程参考:OpenHarmony编译构建指导. 编译脚本参考详见目录:doc/FFmpeg/

2、soudtouch:基于B站的soudtouch版本(ijk-r0.1.2-dev):soundtouch源码链接, 标准的库,可直接通过DevEco Studio cmake编译,编译脚本参考详见目录:doc/soundtouch

3、yuv:基于B站的yuv版本(ijk-r0.2.1-dev):yuv源码链接, 标准的库,可直接通过DevEco Studio cmake编译,编译脚本参考详见目录:doc/yuv

约束与限制

在下述版本验证通过:

  • DevEco Studio版本: 4.1Canary2(4.1.3.322),SDK: API11(4.1.0.36)
  • DevEco Studio版本: 4.1Canary(4.1.3.213),SDK: API11(4.1.2.3)
  • DevEco Studio版本: 4.0(4.0.3.512),SDK: API10(4.0.10.9)
  • DevEco Studio版本: 4.0Canary1(4.0.3.212),SDK: API10(4.0.8.3)

目录结构

|---- ijkplayer  
|     |---- entry  # 示例代码文件夹
|     |---- ijkplayer  # ijkplayer 库文件夹
|			|---- cpp  # native模块
|                  |----- ijkplayer # ijkplayer内部业务
|                  |----- ijksdl    # ijkplayer内部业务
|                  |----- napi      # 封装NAPI接口
|                  |----- proxy     # 代理提供给NAPI调用处理ijkplayer内部业务
|                  |----- third_party #三方库依赖 
|                  |----- utils     #工具
|            |---- ets  # ets接口模块
|                  |----- callback  #视频回调接口
|                  |----- common    #常量
|                  |----- utils     #工具  
|                  |----- IjkMediaPlayer.ets #ijkplayer暴露的napi调用接口
|     |---- README.MD  # 安装使用方法                   

为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙开发学习手册》:

如何快速入门:https://qr21.cn/FV7h05

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. ……

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ……

基于ArkTS 开发:https://qr21.cn/FV7h05

  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全
  7. 网络与链接
  8. 电话服务
  9. 数据管理
  10. 后台任务(Background Task)管理
  11. 设备管理
  12. 设备使用信息统计
  13. DFX
  14. 国际化开发
  15. 折叠屏系列
  16. ……

鸿蒙开发面试真题(含参考答案):https://qr18.cn/F781PH

鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH

1.项目开发必备面试题
2.性能优化方向
3.架构方向
4.鸿蒙开发系统底层方向
5.鸿蒙音视频开发方向
6.鸿蒙车载开发方向
7.鸿蒙南向开发方向

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

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

相关文章

美女视频素材无水印哪里找?四个顶级资源站点

寻找高质量的美女视频素材无水印对于制作引人注目的视频内容至关重要。如果你正困惑于“美女视频素材无水印哪里找”&#xff0c;以下是四个提供优秀无水印美女视频素材的网站&#xff0c;可以满足你的各种创作需求。 蛙学网&#xff1a;多样化的美女视频素材 首先推荐的是蛙…

LeetCode第797题: 所有可能的路径

目录 1.问题描述 2.问题分析 1.问题描述 给你一个有 n 个节点的有向无环图&#xff08;DAG&#xff09;&#xff0c;请你找出所有从节点 0 到节点 n-1 的路径并输出&#xff08;不要求按特定顺序&#xff09;。 graph[i] 是一个从节点 i 可以访问的所有节点的列表&#xff08…

[论文精读]Masked Autoencoders are scalable Vision Learners

摘要本文证明了掩码自编码器(MAE)是一种可扩展的计算机视觉自监督学习算法。我们的 MAE方法很简单:我们盖住输入图像的随机块并重建缺失的像素。它基于两个核心设计。首先&#xff0c;我们开发了一个非对称编码器-解码器架构&#xff0c;其中一个编码器仅对块的可见子集(没有掩…

Linux中如何安装ImageMagick及其常规使用命令

在Linux中安装ImageMagick可以通过包管理工具进行安装。具体步骤如下&#xff1a; 打开终端&#xff08;Terminal&#xff09;。 使用以下命令更新系统软件包列表&#xff1a; sudo apt update使用以下命令安装ImageMagick&#xff1a; sudo apt install imagemagick安装完…

Codeforces Round 924 (Div. 2) ---- F. Digital Patterns ---- 题解

F. Digital Patterns&#xff1a; 题目描述&#xff1a; 思路解析&#xff1a; 要求在一个方块中&#xff0c;任意相邻的方块中他的透明度系数不能相同&#xff0c;这样的方块称为趣味性方块&#xff0c;问这样的方块有多少种。 那么我们可以相当&#xff0c;假设 a1 a2, 那…

求交错且分母为阶乘的和(java)

import java.util.*; public class APP1{public static void main(String[] args){double sum0.0;int n0;int flag1;int fm1;Scanner reader new Scanner(System.in);System.out.println("请输入n的值&#xff1a;");nreader.nextInt();for(int i0;i<n;i){fm*i; …

物理页采样内核配置damon和perf

一、安装报错Missing file: arch/x86/boot/bzImage [sudo] password for xmu: arch/x86/Makefile:142: CONFIG_X86_X32 enabled but no binutils support sh ./arch/x86/boot/install.sh 5.15.19-htmm-test1 \arch/x86/boot/bzImage System.map "/boot"*** Missing…

Redis中的Lua脚本(二)

Lua脚本 创建排序辅助函数 为了防止带有副作用的函数令脚本产生不一致的数据&#xff0c;Redis对math库的math.random函数和math.randomseed函数进行了替换。对于Lua脚本来说&#xff0c;另一个可能产生不一致数据的地方是哪些带有不确定性质的命令&#xff0c;比如对于一个集…

python爬虫之环境配置(1)

一、安装python &#xff08;1&#xff09;下载python安装包 Python Releases for Windows | Python.org &#xff08;2&#xff09;傻瓜式安装python 安装成功 二、安装PyCharm (1&#xff09;下载安装包 Professional&#xff1a;专业版&#xff08;建议选择专业版&am…

前端CSS基础4(像素,颜色,字体属性大小复合属性)

前端CSS基础4&#xff08;像素&#xff0c;颜色&#xff0c;字体属性大小复合属性&#xff09; CSS代码编写位置CSS像素CSS颜色CSS常用字体属性和大小字体的复合属性 CSS代码编写位置 在HTML文件的头部使用 <head><style>/* 在这里编写CSS代码 */</style> …

VsCode调试远程服务器上面的Docker容器

第一步 VsCode 连接ssh 下载安装VsCode(Visual Studio Code)&#xff0c;首次安装会提示你安装Chinese(Simplified)中文简体&#xff0c;安装完后重新打开就是汉化界面了。在左边侧边栏找到扩展选项&#xff0c;然后安装Remote Development插件&#xff0c;里面包含了Remote S…

Redis中的Lua脚本(三)

Lua脚本 EVAL命令的实现 EVAL命令的执行过程可以分为以下三个步骤: 1.根据客户端给定的Lua脚本&#xff0c;在Lua环境中定义一个Lua函数2.将客户端给定的脚本保存到lua_scripts字典&#xff0c;等待将来进一步使用3.执行刚刚在Lua环境中定义的函数&#xff0c;以此来执行客户…

数据应用OneID:ID-Mapping Spark GraphX实现

前言 说明 以用户实体为例&#xff0c;ID 类型包含 user_id 和 device_id。当然还有其他类型id。不同id可以获取到的阶段、生命周期均不相同。 device_id 生命周期通常指的是一个设备从首次被识别到不再活跃的整个时间段。 user_id是用户登录之后系统分配的唯一标识&#xff…

【详细介绍下图搜索算法】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

NLP问答系统:使用 Deepset SQUAD 和 SQuAD v2 度量评估

目录 一、说明 二、Deepset SQUAD是个啥&#xff1f; 三、问答系统&#xff08;QA系统&#xff09;&#xff0c;QA系统在各行业的应用及基本原理 3.1 医疗 3.2 金融 3.3 顾客服务 3.4 教育 3.5 制造业 3.6 法律 3.7 媒体 3.8 政府 四、在不同行业使用QA系统的基本原理 五、关于…

使用自己训练好的模型YOLOv8进行X-AnyLabeling自动标注

目录 1. 下载项目2. 创建环境3. 运行程序3.1 自行下载和添加官方模型3.2 使用自己训练好的模型标注自己的数据集 本机环境&#xff1a;win 10&#xff0c; GPU 1. 下载项目 git clone https://github.com/CVHub520/X-AnyLabeling.git2. 创建环境 仔细查看项目的README文件 …

游游的you矩阵

题目&#xff1a; 游游拿到了一个字符矩阵&#xff0c;她想知道有多少个三角形满足以下条件&#xff1a; 三角形的三个顶点分别是 y、o、u 字符。三角形为直角三角形&#xff0c;且两个直角边一个为水平、另一个为垂直。 输入描述&#xff1a; 第一行输入两个正整数n,m&#…

Root mapping definition has unsupported parameters: [all : {analyzer=ik_max_wor

你们好&#xff0c;我是金金金。 场景 我正在使用Springboot整合elasticsearch&#xff0c;在创建索引(分词器) 运行报错&#xff0c;如下 排查 排查之前我先贴一下代码 import org.elasticsearch.action.admin.indices.create.CreateIndexRequest; // 注意这个包SpringBootTe…

文字转语音工具:GPT-SoVITS

诸神缄默不语-个人CSDN博文目录 OpenAI官方的TTS模型我在这篇博文中给出了使用教程&#xff1a;ChatGPT 3.5 API的调用不全指南&#xff08;持续更新ing…&#xff09; - 知乎 但是OpenAI的TTS对中文支持不好&#xff0c;有一种老外说中文的美&#xff0c;所以本文介绍另一个…

自己的事情自己做:使用 Python Turtle 绘制 Python Logo

以下代码中&#xff0c;将向你展示一个有趣的程序&#xff0c;如何使用 Python Turtle 中绘制 Python Logo。Python 翻译成汉语是蟒蛇的意思&#xff0c;Python 的 Logo 也是两条缠绕在一起的蟒蛇。 import turtlepen turtle.Turtle() turtle.bgcolor("black") pe…