Skip to content

Commit

Permalink
Merge pull request #5 from AstaTus/dep-har-1.5.0-preview3-2
Browse files Browse the repository at this point in the history
[QPlayer Harmony] 1.5.0-preview4 版本发布
  • Loading branch information
AstaTus authored Jul 31, 2024
2 parents 206e8b0 + 6452c64 commit 32ee2c8
Show file tree
Hide file tree
Showing 26 changed files with 1,001 additions and 141 deletions.
9 changes: 8 additions & 1 deletion AppScope/app.json5
Original file line number Diff line number Diff line change
@@ -1,9 +1,16 @@
{
"app": {
// "appEnvironments": [
// {
// "name": "ASAN_OPTIONS",
// "value": "log_path=/dev/asanlog/asan.log log_exe_name=true abort_on_error=0 print_cmdline=true" // 示例仅供参考,具体以实际为准
// },
// ],
// "asanEnabled": false,
"bundleName": "com.qiniu.qplayer2demo",
"vendor": "example",
"versionCode": 1000000,
"versionName": "{1.5.0_preview2}",
"versionName": "{1.5.0_preview4}",
"icon": "$media:app_icon",
"label": "$string:app_name"
}
Expand Down
43 changes: 27 additions & 16 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

Qplayer2是一款跨平台的播放器SDK,除了基础的播放器能力外,更致力于各种应用场景的对接。

注:preview 版本为预览版,仅支持基础功能,其他功能将陆续开放
注:preview 版本为预览版,仅支持部分功能,其他功能将陆续开放

播放器 SDK 合规使用说明请参考[七牛 SDK 合规使用说明](https://developer.qiniu.com/pili/12616/sdk-compliance-instructions);隐私政策说明请参考[七牛 SDK 隐私策略](https://developer.qiniu.com/pili/8027/sdk-privacy-policy)

Expand All @@ -15,26 +15,35 @@ Qplayer2是一款跨平台的播放器SDK,除了基础的播放器能力外,
Android | https://github.com/pili-engineering/QPlayer2-Android
IOS |https://github.com/pili-engineering/QPlayer2-IOS
Windows | https://github.com/pili-engineering/QPlayer2-Windows
HarmonyOS NEXT | Last Version: 1.5.0-preview2
HarmonyOS NEXT | Last Version: 1.5.0-preview4
Mac | 敬请期待
Linux | 敬请期待
### qplayer2-core 功能列表

| 能力 | 亮点 | 备注 |
| ------------------ | ------------------------------------------------------------ | -------------------------------- |
| 媒体资源组成形式 | 一个媒体资源支持多url,比如一个音频url和一个视频url组成一个媒体资源,提升拉流速度和解封装速度 | |
| 播放协议及视频类型 | http/https/rtmp flv/m3u8/mp4/flac/wav(PCM_S24LE) | 新增协议和视频类型请联系技术支持 |
| 后台播放 | 支持设置是否开启后台播放 | |
| seek | 支持精准/关键帧 seek 两种方式 | |
| 能力 | 亮点 | 备注 |
| --------------------- | ------------------------------------------------------------ | -------------------------------- |
| 媒体资源组成形式 | 一个媒体资源支持多url,比如一个音频url和一个视频url组成一个媒体资源,提升拉流速度和解封装速度 | |
| 播放协议及视频类型 | http/https/rtmp flv/m3u8/mp4/flac/wav(PCM_S24LE) | 新增协议和视频类型请联系技术支持 |
| 解码 | 软解/硬解/自动解码 | |
| 色盲模式 | 能在业务场景中更好的服务视觉有障碍的客户 | |
| 倍速 | 变速不变调 | |
| 清晰度切换 | 通用清晰度切换方案,无缝切换,即使媒体资源gop不对齐 | |
| seek | 支持精准/关键帧 seek 两种方式 | |
| 指定起播位置 | 从指定位置开始播放 | |
| 起播方式 | 起播播放/起播暂停 设置起播暂停时,起播后首帧渲染出来就停止画面 | |
| SEI数据回调 | 所有解码方式都支持 | |
| 纯音频播放/纯视频播放 | 播放只有单音频流或者只有单视频流的视频 | |
| 后台播放 | 支持设置是否开启后台播放 | |
| 截图 | 自动转换成jpeg格式,可以展示在UI上,也可存放到相册 | |



## 环境要求

| 类别 | 说明 |
| -------- | ---------------------------------------------------- |
| 系统版本 | 版本为 3.0.0.22 的 harmony-next 手机 |
| IDE 版本 | DevEco Studio NEXT Developer Beta1 version 5.0.3.300 |
| 系统版本 | 版本为 NEXT.0.0.26 的 harmony-next 手机 |
| IDE 版本 | DevEco Studio NEXT Developer Beta1 version 5.0.3.403 |



Expand Down Expand Up @@ -63,16 +72,18 @@ Qplayer2是一款跨平台的播放器SDK,除了基础的播放器能力外,
```awk
{
"dependencies": {
"@qiniu/qplayer2-core": "^1.5.0-preview2", //依赖 open harmony 中心仓
"@qiniu/qplayer2-core": "^1.5.0-preview4", //依赖 open harmony 中心仓
}
}
```

##### 鉴权

| 权限 | 说明 | 鉴权失败结果 |
| ---- | ------------ | ------------------- |
| Base | 基础播放能力 | 播放器进入error状态 |
| 权限 | 说明 | 鉴权失败结果 |
| ----- | ------------ | ------------------------------------------------------------ |
| Base | 基础播放能力 | 播放器进入error状态 |
| SEI | SEI数据回调 | 开启sei 回调,且视频有sei数据。能正常播放视频,SEI数据不回调,同时抛出鉴权失败错误码 |
| BLIND | 色盲滤镜 | 开启色盲滤镜,视频正常播放,滤镜不生效。 |

如需使用该套sdk到其他工程中,可通过 400-808-9176 联系七牛商务开通帐号和权限 或者 通过 [工单](https://support.qiniu.com/?ref=developer.qiniu.com) 联系七牛的技术支持。

Expand All @@ -90,12 +101,12 @@ https://developer.qiniu.io/pili/12702/qplayer2-harmony

1. demo 工程内的 长视频播放页 是基于 qplayer2-core 来实现的

1. demo 下载:https://sdk-release.qiniushawn.top/qplayer2-demo-v1.5.0-preview2.hap
1. demo 下载:https://sdk-release.qnsdk.com/qplayer2-demo-v1.5.0-preview4.hap

1. 电脑连接 harmony next 手机,执行下方命令安装 hap 包

```awk
hdc install qplayer2-demo-v1.5.0-preview2.hap
hdc install qplayer2-demo-v1.5.0-preview4.hap
```


Expand Down
11 changes: 10 additions & 1 deletion entry/build-profile.json5
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,16 @@
],
"targets": [
{
"name": "demo"
"name": "demo",
"config": {
"buildOption": {
"arkOptions": {
"buildProfileFields": {
"qplayer2_version": "1.5.0-preview4" //自定义要获取的sdk 版本信息
}
}
}
}
},
{
"name": "ohosTest",
Expand Down
2 changes: 1 addition & 1 deletion entry/oh-package.json5
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
"author": "",
"license": "",
"dependencies": {
"@qiniu/qplayer2-core": "^1.5.0-preview2"
"@qiniu/qplayer2-core": "^1.5.0-preview4"
},
"devDependencies": {},
"dynamicDependencies": {}
Expand Down
11 changes: 11 additions & 0 deletions entry/src/main/ets/pages/Index.ets
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@ import {} from './view/longVideo/QLongVideoView'

import connection from '@ohos.net.connection';
import { BusinessError } from '@ohos.base';
import { bundleManager } from '@kit.AbilityKit';
import BuildProfile from 'BuildProfile'

@Entry
@Component
struct Index {
Expand Down Expand Up @@ -39,6 +42,14 @@ struct Index {
console.info('Invoke pushUrl succeeded.')
})
})

Text("demoVersion : " + bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_DEFAULT).versionName)
.width('70%')
.height($r('app.float.index_button_height'))
//这里用到了自动生成的 BuildProfile 文件,rebuild 会清理掉 BuildProfile 导致报错,可以用 clean + run(上面那个三角图标,或者爬虫的图标) 代替
Text("sdkVersion : " + BuildProfile.qplayer2_version)
.width('70%')
.height($r('app.float.index_button_height'))
}
.width('100%')
}
Expand Down
21 changes: 21 additions & 0 deletions entry/src/main/ets/pages/common/Helper/QDecimalToHexHelper.ets
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@


export class QDecimalToHexHelper{
static decimalToHex(num : number) : string{
if (num < 10) {
return num.toString()
}else if (num == 10){
return "a"
}else if (num == 11){
return "b"
}else if (num == 12){
return "c"
}else if (num == 13){
return "d"
}else if (num == 14){
return "e"
}else{
return "f"
}
}
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,25 @@
import { QPlayerSettingModel } from '../../model/longVideo/QPlayerSettingModel';
import { Immediately, PlaySpeed, QPlayerSettingModel } from '../../model/longVideo/QPlayerSettingModel';
import dataPreferences from '@ohos.data.preferences';
import { Context } from '@kit.AbilityKit';
import { QPlayerSeek } from '@qiniu/qplayer2-core/qplayer2-core';
import { QBlindType, QPlayerDecoderPriority, QPlayerSeek,
QPlayerStart,
QRenderRatio } from '@qiniu/qplayer2-core/qplayer2-core';

export class QSettingPersistentStorageHelper{
static save(context : Context,settingModel : QPlayerSettingModel){
let options: dataPreferences.Options = { name: 'qplayer2-setting' };
let preferences: dataPreferences.Preferences = dataPreferences.getPreferencesSync(context, options);
preferences.putSync('seek_mode', settingModel.mSeekMode)
preferences.putSync('background_play_mode', settingModel.mBackgroundPlay)
preferences.putSync('decoder_type', settingModel.mDecoderType)
preferences.putSync('play_speed', settingModel.mPlaySpeed)
preferences.putSync('binder_type', settingModel.mBlinderType)
preferences.putSync('render_ratio', settingModel.mRenderRatio)
preferences.putSync('position', settingModel.mPosition)
preferences.putSync('sei_enable', settingModel.mSEIEnable)
preferences.putSync('start_action', settingModel.mStartAction)
preferences.putSync('immediately', settingModel.mImmediately)
console.log(`write settingModel.mPosition : ${settingModel.mPosition}`);
preferences.flush()
}

Expand All @@ -17,9 +28,26 @@ export class QSettingPersistentStorageHelper{
let preferences :dataPreferences.Preferences = dataPreferences.getPreferencesSync(context,options)
let seekValue : QPlayerSeek = preferences.getSync('seek_mode',0) as QPlayerSeek
let backgroundPlayValue : number = preferences.getSync('background_play_mode',0) as number
let decoderPriorityValue : QPlayerDecoderPriority = preferences.getSync('decoder_type',0) as QPlayerDecoderPriority
let playSpeedValue : PlaySpeed = preferences.getSync('play_speed',2) as PlaySpeed
let renderRatioValue : QRenderRatio = preferences.getSync('render_ratio',1) as QRenderRatio
let blindType : QBlindType = preferences.getSync('binder_type',0) as QBlindType
let position : number = preferences.getSync('position',0) as number
let seiEnable : number = preferences.getSync('sei_enable',0) as number
let startAction : QPlayerStart = preferences.getSync('start_action',0) as QPlayerStart
let immediately : Immediately = preferences.getSync('immediately',0) as Immediately
let settingModel = new QPlayerSettingModel()
settingModel.mSeekMode = seekValue
settingModel.mBackgroundPlay = backgroundPlayValue
settingModel.mDecoderType = decoderPriorityValue
settingModel.mPlaySpeed = playSpeedValue
settingModel.mRenderRatio = renderRatioValue
settingModel.mBlinderType = blindType
settingModel.mPosition = position
settingModel.mSEIEnable = seiEnable
settingModel.mStartAction = startAction
settingModel.mImmediately = immediately
console.log(`read settingModel.mPosition : ${settingModel.mPosition}`);
return settingModel
}

Expand Down
26 changes: 25 additions & 1 deletion entry/src/main/ets/pages/model/longVideo/QPlayerSettingModel.ets
Original file line number Diff line number Diff line change
@@ -1,11 +1,35 @@
import { QPlayerSeek } from '@qiniu/qplayer2-core/qplayer2-core'

import { QBlindType, QPlayerDecoderPriority, QPlayerSeek,
QPlayerStart,
QRenderRatio } from '@qiniu/qplayer2-core/qplayer2-core'
import { QSettingPersistentStorageHelper } from '../../common/helper/QSettingPersistentStorageHelper'
import { Context } from '@ohos.abilityAccessCtrl'

export enum PlaySpeed{
SPEED_0_5,
SPEED_0_75,
SPEED_1_0,
SPEED_1_25,
SPEED_1_5,
SPEED_2_0
}
export enum Immediately{
IMMEDIATELY_TRUE = 0,
IMMEDIATELY_FALSE = 1,
IMMEDIATELY_MIX = 2
}
@Observed
export class QPlayerSettingModel{
public mSeekMode :QPlayerSeek = QPlayerSeek.NORMAL
public mBackgroundPlay : number = 1
public mDecoderType : QPlayerDecoderPriority = QPlayerDecoderPriority.AUTO
public mPlaySpeed : PlaySpeed = PlaySpeed.SPEED_1_0
public mRenderRatio : QRenderRatio = QRenderRatio.AUTO
public mBlinderType : QBlindType = QBlindType.NONE
public mPosition : number = 0
public mSEIEnable : number = 0
public mStartAction : QPlayerStart = QPlayerStart.PLAYING
public mImmediately : Immediately = Immediately.IMMEDIATELY_TRUE
constructor() {
}
}
Loading

0 comments on commit 32ee2c8

Please sign in to comment.