Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Docs
提交
37e403cf
D
Docs
项目概览
OpenHarmony
/
Docs
接近 2 年 前同步成功
通知
159
Star
292
Fork
28
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
Docs
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
未验证
提交
37e403cf
编写于
8月 30, 2023
作者:
O
openharmony_ci
提交者:
Gitee
8月 30, 2023
浏览文件
操作
浏览文件
下载
差异文件
!23495 arkts格式整改(audio, avsession)
Merge pull request !23495 from zhangkai/master
上级
56f0c12b
fa7d23d2
变更
9
隐藏空白更改
内联
并排
Showing
9 changed file
with
294 addition
and
237 deletion
+294
-237
zh-cn/application-dev/media/audio-input-device-management.md
zh-cn/application-dev/media/audio-input-device-management.md
+1
-0
zh-cn/application-dev/media/audio-output-device-management.md
...n/application-dev/media/audio-output-device-management.md
+1
-0
zh-cn/application-dev/media/audio-recording-stream-management.md
...pplication-dev/media/audio-recording-stream-management.md
+1
-1
zh-cn/application-dev/media/local-avsession-overview.md
zh-cn/application-dev/media/local-avsession-overview.md
+5
-4
zh-cn/application-dev/media/mic-management.md
zh-cn/application-dev/media/mic-management.md
+47
-50
zh-cn/application-dev/media/using-audiocapturer-for-recording.md
...pplication-dev/media/using-audiocapturer-for-recording.md
+5
-5
zh-cn/application-dev/media/using-avsession-controller.md
zh-cn/application-dev/media/using-avsession-controller.md
+99
-82
zh-cn/application-dev/media/using-avsession-developer.md
zh-cn/application-dev/media/using-avsession-developer.md
+112
-79
zh-cn/application-dev/media/using-distributed-avsession.md
zh-cn/application-dev/media/using-distributed-avsession.md
+23
-16
未找到文件。
zh-cn/application-dev/media/audio-input-device-management.md
浏览文件 @
37e403cf
...
@@ -65,6 +65,7 @@ audioRoutingManager.off('deviceChange', (deviceChanged: audio.DeviceChangeAction
...
@@ -65,6 +65,7 @@ audioRoutingManager.off('deviceChange', (deviceChanged: audio.DeviceChangeAction
> 用户可以选择连接一组音频设备(如一对蓝牙耳机),但系统侧只感知为一个设备,该组设备共用一个设备id。
> 用户可以选择连接一组音频设备(如一对蓝牙耳机),但系统侧只感知为一个设备,该组设备共用一个设备id。
```
ts
```
ts
import
audio
from
'
@ohos.multimedia.audio
'
;
let
inputAudioDeviceDescriptor
:
audio
.
AudioDeviceDescriptors
=
[{
let
inputAudioDeviceDescriptor
:
audio
.
AudioDeviceDescriptors
=
[{
deviceRole
:
audio
.
DeviceRole
.
INPUT_DEVICE
,
deviceRole
:
audio
.
DeviceRole
.
INPUT_DEVICE
,
deviceType
:
audio
.
DeviceType
.
EARPIECE
,
deviceType
:
audio
.
DeviceType
.
EARPIECE
,
...
...
zh-cn/application-dev/media/audio-output-device-management.md
浏览文件 @
37e403cf
...
@@ -66,6 +66,7 @@ audioRoutingManager.off('deviceChange');
...
@@ -66,6 +66,7 @@ audioRoutingManager.off('deviceChange');
> 用户可以选择连接一组音频设备(如一对蓝牙耳机),但系统侧只感知为一个设备,该组设备共用一个设备ID。
> 用户可以选择连接一组音频设备(如一对蓝牙耳机),但系统侧只感知为一个设备,该组设备共用一个设备ID。
```
ts
```
ts
import
audio
from
'
@ohos.multimedia.audio
'
;
let
outputAudioDeviceDescriptor
:
audio
.
AudioDeviceDescriptors
=
[{
let
outputAudioDeviceDescriptor
:
audio
.
AudioDeviceDescriptors
=
[{
deviceRole
:
audio
.
DeviceRole
.
OUTPUT_DEVICE
,
deviceRole
:
audio
.
DeviceRole
.
OUTPUT_DEVICE
,
deviceType
:
audio
.
DeviceType
.
SPEAKER
,
deviceType
:
audio
.
DeviceType
.
SPEAKER
,
...
...
zh-cn/application-dev/media/audio-recording-stream-management.md
浏览文件 @
37e403cf
...
@@ -61,7 +61,7 @@
...
@@ -61,7 +61,7 @@
console
.
info
(
`StreamId for
${
i
}
is:
${
AudioCapturerChangeInfoArray
[
i
].
streamId
}
`
);
console
.
info
(
`StreamId for
${
i
}
is:
${
AudioCapturerChangeInfoArray
[
i
].
streamId
}
`
);
console
.
info
(
`Source for
${
i
}
is:
${
AudioCapturerChangeInfoArray
[
i
].
capturerInfo
.
source
}
`
);
console
.
info
(
`Source for
${
i
}
is:
${
AudioCapturerChangeInfoArray
[
i
].
capturerInfo
.
source
}
`
);
console
.
info
(
`Flag
${
i
}
is:
${
AudioCapturerChangeInfoArray
[
i
].
capturerInfo
.
capturerFlags
}
`
);
console
.
info
(
`Flag
${
i
}
is:
${
AudioCapturerChangeInfoArray
[
i
].
capturerInfo
.
capturerFlags
}
`
);
let
devDescriptor
=
AudioCapturerChangeInfoArray
[
i
].
deviceDescriptors
;
let
devDescriptor
:
audio
.
AudioDeviceDescriptors
=
AudioCapturerChangeInfoArray
[
i
].
deviceDescriptors
;
for
(
let
j
=
0
;
j
<
AudioCapturerChangeInfoArray
[
i
].
deviceDescriptors
.
length
;
j
++
)
{
for
(
let
j
=
0
;
j
<
AudioCapturerChangeInfoArray
[
i
].
deviceDescriptors
.
length
;
j
++
)
{
console
.
info
(
`Id:
${
i
}
:
${
AudioCapturerChangeInfoArray
[
i
].
deviceDescriptors
[
j
].
id
}
`
);
console
.
info
(
`Id:
${
i
}
:
${
AudioCapturerChangeInfoArray
[
i
].
deviceDescriptors
[
j
].
id
}
`
);
console
.
info
(
`Type:
${
i
}
:
${
AudioCapturerChangeInfoArray
[
i
].
deviceDescriptors
[
j
].
deviceType
}
`
);
console
.
info
(
`Type:
${
i
}
:
${
AudioCapturerChangeInfoArray
[
i
].
deviceDescriptors
[
j
].
deviceType
}
`
);
...
...
zh-cn/application-dev/media/local-avsession-overview.md
浏览文件 @
37e403cf
...
@@ -38,8 +38,9 @@ import AVSessionManager from '@ohos.multimedia.avsession';
...
@@ -38,8 +38,9 @@ import AVSessionManager from '@ohos.multimedia.avsession';
```
ts
```
ts
// 创建session
// 创建session
async
createSession
()
{
let
context
:
Context
=
this
.
context
;
let
session
:
AVSessionManager
.
AVSession
=
await
AVSessionManager
.
createAVSession
(
this
.
context
,
'
SESSION_NAME
'
,
'
audio
'
);
async
function
createSession
()
{
let
session
:
AVSessionManager
.
AVSession
=
await
AVSessionManager
.
createAVSession
(
context
,
'
SESSION_NAME
'
,
'
audio
'
);
console
.
info
(
`session create done : sessionId :
${
session
.
sessionId
}
`
);
console
.
info
(
`session create done : sessionId :
${
session
.
sessionId
}
`
);
}
}
```
```
...
@@ -48,9 +49,9 @@ async createSession() {
...
@@ -48,9 +49,9 @@ async createSession() {
```
ts
```
ts
// 创建controller
// 创建controller
async
createController
()
{
async
function
createController
()
{
// 获取到所有存活session的描述符列表
// 获取到所有存活session的描述符列表
let
descriptorsArray
:
Array
<
Readonly
<
AVSessionManager
.
AVSessionDescriptor
>
>
=
await
AVSessionManager
.
getAllSessionDescriptors
();
let
descriptorsArray
:
Array
<
AVSessionManager
.
AVSessionDescriptor
>
=
await
AVSessionManager
.
getAllSessionDescriptors
();
if
(
descriptorsArray
.
length
>
0
)
{
if
(
descriptorsArray
.
length
>
0
)
{
// 为了演示,我们简单取第一个描述符的sessionId用来创建对应的controller
// 为了演示,我们简单取第一个描述符的sessionId用来创建对应的controller
let
sessionId
:
string
=
descriptorsArray
[
0
].
sessionId
;
let
sessionId
:
string
=
descriptorsArray
[
0
].
sessionId
;
...
...
zh-cn/application-dev/media/mic-management.md
浏览文件 @
37e403cf
...
@@ -12,8 +12,8 @@
...
@@ -12,8 +12,8 @@
```
ts
```
ts
import
audio
from
'
@ohos.multimedia.audio
'
;
import
audio
from
'
@ohos.multimedia.audio
'
;
let
audioVolumeGroupManager
;
let
audioVolumeGroupManager
:
audio
.
AudioVolumeGroupManager
;
async
function
loadVolumeGroupManager
()
{
//创建audioVolumeGroupManager对象
async
function
loadVolumeGroupManager
()
{
//创建audioVolumeGroupManager对象
const
groupid
=
audio
.
DEFAULT_VOLUME_GROUP_ID
;
const
groupid
=
audio
.
DEFAULT_VOLUME_GROUP_ID
;
audioVolumeGroupManager
=
await
audio
.
getAudioManager
().
getVolumeManager
().
getVolumeGroupManager
(
groupid
);
audioVolumeGroupManager
=
await
audio
.
getAudioManager
().
getVolumeManager
().
getVolumeGroupManager
(
groupid
);
...
@@ -28,7 +28,7 @@
...
@@ -28,7 +28,7 @@
```
ts
```
ts
async
function
on
()
{
//监听麦克风状态变化
async
function
on
()
{
//监听麦克风状态变化
audioVolumeGroupManager
.
on
(
'
micStateChange
'
,
(
micStateChange
)
=>
{
audioVolumeGroupManager
.
on
(
'
micStateChange
'
,
(
micStateChange
:
audio
.
MicStateChangeEvent
)
=>
{
console
.
info
(
`Current microphone status is:
${
micStateChange
.
mute
}
`
);
console
.
info
(
`Current microphone status is:
${
micStateChange
.
mute
}
`
);
});
});
}
}
...
@@ -38,7 +38,7 @@
...
@@ -38,7 +38,7 @@
```
ts
```
ts
async
function
isMicrophoneMute
()
{
//查询麦克风是否静音
async
function
isMicrophoneMute
()
{
//查询麦克风是否静音
await
audioVolumeGroupManager
.
isMicrophoneMute
().
then
((
value
)
=>
{
await
audioVolumeGroupManager
.
isMicrophoneMute
().
then
((
value
:
boolean
)
=>
{
console
.
info
(
`isMicrophoneMute is:
${
value
}
.`
);
console
.
info
(
`isMicrophoneMute is:
${
value
}
.`
);
});
});
}
}
...
@@ -64,51 +64,48 @@
...
@@ -64,51 +64,48 @@
参考以下示例,完成从设置麦克风静音到取消麦克风静音的过程。
参考以下示例,完成从设置麦克风静音到取消麦克风静音的过程。
```
ts
```
ts
import
audio
from
'
@ohos.multimedia.audio
'
;
import
audio
from
'
@ohos.multimedia.audio
'
;
@
Entry
let
audioVolumeGroupManager
:
audio
.
AudioVolumeGroupManager
;
@
Component
struct
AudioVolumeGroup
{
async
function
loadVolumeGroupManager
()
{
private
audioVolumeGroupManager
:
audio
.
AudioVolumeGroupManager
;
const
groupid
=
audio
.
DEFAULT_VOLUME_GROUP_ID
;
audioVolumeGroupManager
=
await
audio
.
getAudioManager
().
getVolumeManager
().
getVolumeGroupManager
(
groupid
);
async
loadVolumeGroupManager
()
{
console
.
info
(
'
audioVolumeGroupManager------create-------success.
'
);
const
groupid
=
audio
.
DEFAULT_VOLUME_GROUP_ID
;
}
this
.
audioVolumeGroupManager
=
await
audio
.
getAudioManager
().
getVolumeManager
().
getVolumeGroupManager
(
groupid
);
console
.
info
(
'
audioVolumeGroupManager------create-------success.
'
);
async
function
on
()
{
//监听麦克风状态变化
}
await
loadVolumeGroupManager
();
audioVolumeGroupManager
.
on
(
'
micStateChange
'
,
(
micStateChange
)
=>
{
console
.
info
(
`Current microphone status is:
${
micStateChange
.
mute
}
`
);
});
}
async
function
isMicrophoneMute
()
{
//查询麦克风是否静音
await
audioVolumeGroupManager
.
isMicrophoneMute
().
then
((
value
)
=>
{
console
.
info
(
`isMicrophoneMute is:
${
value
}
.`
);
});
}
async
function
setMicrophoneMuteTrue
()
{
//设置麦克风静音
await
loadVolumeGroupManager
();
await
audioVolumeGroupManager
.
setMicrophoneMute
(
true
).
then
(()
=>
{
console
.
info
(
'
setMicrophoneMute to mute.
'
);
});
}
async
function
setMicrophoneMuteFalse
()
{
//取消麦克风静音
await
loadVolumeGroupManager
();
await
audioVolumeGroupManager
.
setMicrophoneMute
(
false
).
then
(()
=>
{
console
.
info
(
'
setMicrophoneMute to not mute.
'
);
});
}
async
function
test
(){
await
on
();
await
isMicrophoneMute
();
await
setMicrophoneMuteTrue
();
await
isMicrophoneMute
();
await
setMicrophoneMuteFalse
();
await
isMicrophoneMute
();
await
setMicrophoneMuteTrue
();
await
isMicrophoneMute
();
}
async
on
()
{
//监听麦克风状态变化
await
this
.
loadVolumeGroupManager
();
this
.
audioVolumeGroupManager
.
on
(
'
micStateChange
'
,
(
micStateChange
)
=>
{
console
.
info
(
`Current microphone status is:
${
micStateChange
.
mute
}
`
);
});
}
async
isMicrophoneMute
()
{
//查询麦克风是否静音
await
this
.
audioVolumeGroupManager
.
isMicrophoneMute
().
then
((
value
)
=>
{
console
.
info
(
`isMicrophoneMute is:
${
value
}
.`
);
});
}
async
setMicrophoneMuteTrue
()
{
//设置麦克风静音
await
this
.
loadVolumeGroupManager
();
await
this
.
audioVolumeGroupManager
.
setMicrophoneMute
(
true
).
then
(()
=>
{
console
.
info
(
'
setMicrophoneMute to mute.
'
);
});
}
async
setMicrophoneMuteFalse
()
{
//取消麦克风静音
await
this
.
loadVolumeGroupManager
();
await
this
.
audioVolumeGroupManager
.
setMicrophoneMute
(
false
).
then
(()
=>
{
console
.
info
(
'
setMicrophoneMute to not mute.
'
);
});
}
async
test
(){
await
this
.
on
();
await
this
.
isMicrophoneMute
();
await
this
.
setMicrophoneMuteTrue
();
await
this
.
isMicrophoneMute
();
await
this
.
setMicrophoneMuteFalse
();
await
this
.
isMicrophoneMute
();
await
this
.
setMicrophoneMuteTrue
();
await
this
.
isMicrophoneMute
();
}
}
```
```
zh-cn/application-dev/media/using-audiocapturer-for-recording.md
浏览文件 @
37e403cf
...
@@ -21,24 +21,24 @@ AudioCapturer是音频采集器,用于录制PCM(Pulse Code Modulation)音
...
@@ -21,24 +21,24 @@ AudioCapturer是音频采集器,用于录制PCM(Pulse Code Modulation)音
import
audio
from
'
@ohos.multimedia.audio
'
;
import
audio
from
'
@ohos.multimedia.audio
'
;
import
fs
from
'
@ohos.file.fs
'
;
import
fs
from
'
@ohos.file.fs
'
;
import
{
BusinessError
}
from
'
@ohos.base
'
;
import
{
BusinessError
}
from
'
@ohos.base
'
;
let
audioStreamInfo
:
audio
.
AudioStreamInfo
=
{
let
audioStreamInfo
:
audio
.
AudioStreamInfo
=
{
samplingRate
:
audio
.
AudioSamplingRate
.
SAMPLE_RATE_44100
,
samplingRate
:
audio
.
AudioSamplingRate
.
SAMPLE_RATE_44100
,
channels
:
audio
.
AudioChannel
.
CHANNEL_2
,
channels
:
audio
.
AudioChannel
.
CHANNEL_2
,
sampleFormat
:
audio
.
AudioSampleFormat
.
SAMPLE_FORMAT_S16LE
,
sampleFormat
:
audio
.
AudioSampleFormat
.
SAMPLE_FORMAT_S16LE
,
encodingType
:
audio
.
AudioEncodingType
.
ENCODING_TYPE_RAW
encodingType
:
audio
.
AudioEncodingType
.
ENCODING_TYPE_RAW
};
};
let
audioCapturerInfo
:
audio
.
AudioCapturerInfo
=
{
let
audioCapturerInfo
:
audio
.
AudioCapturerInfo
=
{
source
:
audio
.
SourceType
.
SOURCE_TYPE_MIC
,
source
:
audio
.
SourceType
.
SOURCE_TYPE_MIC
,
capturerFlags
:
0
capturerFlags
:
0
};
};
let
audioCapturerOptions
:
audio
.
AudioCapturerOptions
=
{
let
audioCapturerOptions
:
audio
.
AudioCapturerOptions
=
{
streamInfo
:
audioStreamInfo
,
streamInfo
:
audioStreamInfo
,
capturerInfo
:
audioCapturerInfo
capturerInfo
:
audioCapturerInfo
};
};
audio
.
createAudioCapturer
(
audioCapturerOptions
,
(
err
,
data
)
=>
{
audio
.
createAudioCapturer
(
audioCapturerOptions
,
(
err
,
data
)
=>
{
if
(
err
)
{
if
(
err
)
{
console
.
error
(
`Invoke createAudioCapturer failed, code is
${
err
.
code
}
, message is
${
err
.
message
}
`
);
console
.
error
(
`Invoke createAudioCapturer failed, code is
${
err
.
code
}
, message is
${
err
.
message
}
`
);
...
@@ -169,7 +169,7 @@ export default class AudioCapturerDemo {
...
@@ -169,7 +169,7 @@ export default class AudioCapturerDemo {
while
(
numBuffersToCapture
)
{
while
(
numBuffersToCapture
)
{
let
bufferSize
=
await
this
.
audioCapturer
.
getBufferSize
();
let
bufferSize
=
await
this
.
audioCapturer
.
getBufferSize
();
let
buffer
=
await
this
.
audioCapturer
.
read
(
bufferSize
,
true
);
let
buffer
=
await
this
.
audioCapturer
.
read
(
bufferSize
,
true
);
let
options
=
{
let
options
:
Options
=
{
offset
:
count
*
bufferSize
,
offset
:
count
*
bufferSize
,
length
:
bufferSize
length
:
bufferSize
};
};
...
...
zh-cn/application-dev/media/using-avsession-controller.md
浏览文件 @
37e403cf
...
@@ -58,27 +58,28 @@ OpenHarmony系统预置的播控中心,作为媒体会话控制方与音视频
...
@@ -58,27 +58,28 @@ OpenHarmony系统预置的播控中心,作为媒体会话控制方与音视频
```
ts
```
ts
//导入AVSessionManager模块
//导入AVSessionManager模块
import
AVSessionManager
from
'
@ohos.multimedia.avsession
'
;
import
AVSessionManager
from
'
@ohos.multimedia.avsession
'
;
import
{
BusinessError
}
from
'
@ohos.base
'
;
// 全局变量定义
// 全局变量定义
let
g_controller
=
new
Array
<
AVSessionManager
.
AVSessionController
>
();
let
g_controller
=
new
Array
<
AVSessionManager
.
AVSessionController
>
();
let
g_centerSupportCmd
:
Set
<
AVSessionManager
.
AVControlCommandType
>
=
new
Set
([
'
play
'
,
'
pause
'
,
'
playNext
'
,
'
playPrevious
'
,
'
fastForward
'
,
'
rewind
'
,
'
seek
'
,
'
setSpeed
'
,
'
setLoopMode
'
,
'
toggleFavorite
'
]);
let
g_centerSupportCmd
:
Set
<
AVSessionManager
.
AVControlCommandType
>
=
new
Set
([
'
play
'
,
'
pause
'
,
'
playNext
'
,
'
playPrevious
'
,
'
fastForward
'
,
'
rewind
'
,
'
seek
'
,
'
setSpeed
'
,
'
setLoopMode
'
,
'
toggleFavorite
'
]);
let
g_validCmd
:
Set
<
AVSessionManager
.
AVControlCommandType
>
;
let
g_validCmd
:
Set
<
AVSessionManager
.
AVControlCommandType
>
;
// 获取会话描述符,创建控制器
// 获取会话描述符,创建控制器
AVSessionManager
.
getAllSessionDescriptors
().
then
((
descriptors
)
=>
{
AVSessionManager
.
getAllSessionDescriptors
().
then
((
descriptors
)
=>
{
descriptors
.
forEach
((
descriptor
)
=>
{
descriptors
.
forEach
((
descriptor
)
=>
{
AVSessionManager
.
createController
(
descriptor
.
sessionId
).
then
((
controller
)
=>
{
AVSessionManager
.
createController
(
descriptor
.
sessionId
).
then
((
controller
)
=>
{
g_controller
.
push
(
controller
);
g_controller
.
push
(
controller
);
}).
catch
((
er
r
)
=>
{
}).
catch
((
err
:
BusinessErro
r
)
=>
{
console
.
error
(
`Failed to create controller. Code:
${
err
.
code
}
, message:
${
err
.
message
}
`
);
console
.
error
(
`Failed to create controller. Code:
${
err
.
code
}
, message:
${
err
.
message
}
`
);
});
});
});
});
}).
catch
((
err
)
=>
{
}).
catch
((
err
:
BusinessError
)
=>
{
console
.
error
(
`Failed to get all session descriptors. Code:
${
err
.
code
}
, message:
${
err
.
message
}
`
);
console
.
error
(
`Failed to get all session descriptors. Code:
${
err
.
code
}
, message:
${
err
.
message
}
`
);
});
});
// 获取历史会话的描述符
// 获取历史会话的描述符
avSession
.
getHistoricalSessionDescriptors
().
then
((
descriptors
)
=>
{
AVSessionManager
.
getHistoricalSessionDescriptors
().
then
((
descriptors
)
=>
{
console
.
info
(
`getHistoricalSessionDescriptors : SUCCESS : descriptors.length :
${
descriptors
.
length
}
`
);
console
.
info
(
`getHistoricalSessionDescriptors : SUCCESS : descriptors.length :
${
descriptors
.
length
}
`
);
if
(
descriptors
.
length
>
0
){
if
(
descriptors
.
length
>
0
){
console
.
info
(
`getHistoricalSessionDescriptors : SUCCESS : descriptors[0].isActive :
${
descriptors
[
0
].
isActive
}
`
);
console
.
info
(
`getHistoricalSessionDescriptors : SUCCESS : descriptors[0].isActive :
${
descriptors
[
0
].
isActive
}
`
);
...
@@ -87,7 +88,7 @@ OpenHarmony系统预置的播控中心,作为媒体会话控制方与音视频
...
@@ -87,7 +88,7 @@ OpenHarmony系统预置的播控中心,作为媒体会话控制方与音视频
console
.
info
(
`getHistoricalSessionDescriptors : SUCCESS : descriptors[0].sessionId :
${
descriptors
[
0
].
sessionId
}
`
);
console
.
info
(
`getHistoricalSessionDescriptors : SUCCESS : descriptors[0].sessionId :
${
descriptors
[
0
].
sessionId
}
`
);
console
.
info
(
`getHistoricalSessionDescriptors : SUCCESS : descriptors[0].elementName.bundleName :
${
descriptors
[
0
].
elementName
.
bundleName
}
`
);
console
.
info
(
`getHistoricalSessionDescriptors : SUCCESS : descriptors[0].elementName.bundleName :
${
descriptors
[
0
].
elementName
.
bundleName
}
`
);
}
}
}).
catch
((
err
)
=>
{
}).
catch
((
err
:
BusinessError
)
=>
{
console
.
error
(
`Failed to get historical session descriptors, error code:
${
err
.
code
}
, error message:
${
err
.
message
}
`
);
console
.
error
(
`Failed to get historical session descriptors, error code:
${
err
.
code
}
, error message:
${
err
.
message
}
`
);
});
});
```
```
...
@@ -103,42 +104,46 @@ OpenHarmony系统预置的播控中心,作为媒体会话控制方与音视频
...
@@ -103,42 +104,46 @@ OpenHarmony系统预置的播控中心,作为媒体会话控制方与音视频
AVSession服务状态事件指sessionServiceDie,在AVSession服务异常时产生该事件。
AVSession服务状态事件指sessionServiceDie,在AVSession服务异常时产生该事件。
```
ts
```
ts
import
AVSessionManager
from
'
@ohos.multimedia.avsession
'
;
import
{
BusinessError
}
from
'
@ohos.base
'
;
let
g_controller
=
new
Array
<
AVSessionManager
.
AVSessionController
>
();
// 注册会话创建监听,创建控制器
// 注册会话创建监听,创建控制器
AVSessionManager
.
on
(
'
sessionCreate
'
,
(
session
)
=>
{
AVSessionManager
.
on
(
'
sessionCreate
'
,
(
session
)
=>
{
// 新增会话,需要创建控制器
// 新增会话,需要创建控制器
AVSessionManager
.
createController
(
session
.
sessionId
).
then
((
controller
)
=>
{
AVSessionManager
.
createController
(
session
.
sessionId
).
then
((
controller
)
=>
{
g_controller
.
push
(
controller
);
g_controller
.
push
(
controller
);
}).
catch
((
err
)
=>
{
}).
catch
((
err
:
BusinessError
)
=>
{
console
.
error
(
`Failed to create controller. Code:
${
err
.
code
}
, message:
${
err
.
message
}
`
);
console
.
error
(
`Failed to create controller. Code:
${
err
.
code
}
, message:
${
err
.
message
}
`
);
});
});
});
});
// 注册系统会话销毁监听
// 注册系统会话销毁监听
AVSessionManager
.
on
(
'
sessionDestroy
'
,
(
session
)
=>
{
AVSessionManager
.
on
(
'
sessionDestroy
'
,
(
session
)
=>
{
let
index
=
g_controller
.
findIndex
((
controller
)
=>
{
let
index
=
g_controller
.
findIndex
((
controller
)
=>
{
return
controller
.
sessionId
===
session
.
sessionId
;
return
controller
.
sessionId
===
session
.
sessionId
;
});
});
if
(
index
!==
0
)
{
if
(
index
!==
0
)
{
g_controller
[
index
].
destroy
();
g_controller
[
index
].
destroy
();
g_controller
.
splice
(
index
,
1
);
g_controller
.
splice
(
index
,
1
);
}
}
});
});
// 注册系统最高优先级会话变更监听
// 注册系统最高优先级会话变更监听
AVSessionManager
.
on
(
'
topSessionChange
'
,
(
session
)
=>
{
AVSessionManager
.
on
(
'
topSessionChange
'
,
(
session
)
=>
{
let
index
=
g_controller
.
findIndex
((
controller
)
=>
{
let
index
=
g_controller
.
findIndex
((
controller
)
=>
{
return
controller
.
sessionId
===
session
.
sessionId
;
return
controller
.
sessionId
===
session
.
sessionId
;
});
});
// 将该会话显示排到第一个
// 将该会话显示排到第一个
if
(
index
!==
0
)
{
if
(
index
!==
0
)
{
g_controller
.
sort
((
a
,
b
)
=>
{
g_controller
.
sort
((
a
,
b
)
=>
{
return
a
.
sessionId
===
session
.
sessionId
?
-
1
:
0
;
return
a
.
sessionId
===
session
.
sessionId
?
-
1
:
0
;
});
});
}
}
});
});
// 注册服务异常监听
// 注册服务异常监听
AVSessionManager
.
on
(
'
sessionServiceDie
'
,
()
=>
{
AVSessionManager
.
on
(
'
sessionServiceDie
'
,
()
=>
{
// 服务端异常,应用清理资源
// 服务端异常,应用清理资源
console
.
info
(
`服务端异常`
);
console
.
info
(
`服务端异常`
);
})
})
```
```
...
@@ -160,6 +165,13 @@ OpenHarmony系统预置的播控中心,作为媒体会话控制方与音视频
...
@@ -160,6 +165,13 @@ OpenHarmony系统预置的播控中心,作为媒体会话控制方与音视频
媒体会话控制方可以根据实际需要监听对应的事件。
媒体会话控制方可以根据实际需要监听对应的事件。
```
ts
```
ts
import
AVSessionManager
from
'
@ohos.multimedia.avsession
'
;
import
{
BusinessError
}
from
'
@ohos.base
'
;
let
g_controller
=
new
Array
<
AVSessionManager
.
AVSessionController
>
();
let
controller
=
g_controller
[
0
];
let
g_validCmd
:
Set
<
AVSessionManager
.
AVControlCommandType
>
;
let
g_centerSupportCmd
:
Set
<
AVSessionManager
.
AVControlCommandType
>
=
new
Set
([
'
play
'
,
'
pause
'
,
'
playNext
'
,
'
playPrevious
'
,
'
fastForward
'
,
'
rewind
'
,
'
seek
'
,
'
setSpeed
'
,
'
setLoopMode
'
,
'
toggleFavorite
'
]);
// 注册会话激活状态变更监听
// 注册会话激活状态变更监听
controller
.
on
(
'
activeStateChange
'
,
(
isActive
)
=>
{
controller
.
on
(
'
activeStateChange
'
,
(
isActive
)
=>
{
if
(
isActive
)
{
if
(
isActive
)
{
...
@@ -170,38 +182,39 @@ OpenHarmony系统预置的播控中心,作为媒体会话控制方与音视频
...
@@ -170,38 +182,39 @@ OpenHarmony系统预置的播控中心,作为媒体会话控制方与音视频
});
});
// 注册会话销毁监听
// 注册会话销毁监听
controller
.
on
(
'
sessionDestroy
'
,
()
=>
{
controller
.
on
(
'
sessionDestroy
'
,
()
=>
{
info
(
`on sessionDestroy : SUCCESS `
);
console
.
info
(
`on sessionDestroy : SUCCESS `
);
controller
.
destroy
().
then
(()
=>
{
controller
.
destroy
().
then
(()
=>
{
console
.
info
(
`destroy : SUCCESS`
);
console
.
info
(
`destroy : SUCCESS`
);
}).
catch
((
er
r
)
=>
{
}).
catch
((
err
:
BusinessErro
r
)
=>
{
console
.
error
(
`Failed to destroy session. Code:
${
err
.
code
}
, message:
${
err
.
message
}
`
);
console
.
error
(
`Failed to destroy session. Code:
${
err
.
code
}
, message:
${
err
.
message
}
`
);
});
});
});
});
// 注册元数据更新监听
// 注册元数据更新监听
let
metaFilter
=
[
'
assetId
'
,
'
title
'
,
'
description
'
];
let
metaFilter
=
[
'
assetId
'
,
'
title
'
,
'
description
'
];
controller
.
on
(
'
metadataChange
'
,
metaFilter
,
(
metadata
)
=>
{
controller
.
on
(
'
metadataChange
'
,
metaFilter
,
(
metadata
:
AVSessionManager
.
AVMetadata
)
=>
{
console
.
info
(
`on metadataChange assetId :
${
metadata
.
assetId
}
`
);
console
.
info
(
`on metadataChange assetId :
${
metadata
.
assetId
}
`
);
});
});
// 注册播放状态更新监听
// 注册播放状态更新监听
let
playbackFilter
=
[
'
state
'
,
'
speed
'
,
'
loopMode
'
];
let
playbackFilter
=
[
'
state
'
,
'
speed
'
,
'
loopMode
'
];
controller
.
on
(
'
playbackStateChange
'
,
playbackFilter
,
(
playbackState
)
=>
{
controller
.
on
(
'
playbackStateChange
'
,
playbackFilter
,
(
playbackState
:
AVSessionManager
.
AVPlaybackState
)
=>
{
console
.
info
(
`on playbackStateChange state :
${
playbackState
.
state
}
`
);
console
.
info
(
`on playbackStateChange state :
${
playbackState
.
state
}
`
);
});
});
// 注册会话支持的命令变更监听
// 注册会话支持的命令变更监听
controller
.
on
(
'
validCommandChange
'
,
(
cmds
)
=>
{
controller
.
on
(
'
validCommandChange
'
,
(
cmds
)
=>
{
console
.
info
(
`validCommandChange : SUCCESS : size :
${
cmds
.
size
}
`
);
console
.
info
(
`validCommandChange : SUCCESS : size :
${
cmds
.
length
}
`
);
console
.
info
(
`validCommandChange : SUCCESS : cmds :
${
cmds
.
values
()}
`
);
console
.
info
(
`validCommandChange : SUCCESS : cmds :
${
cmds
.
values
()}
`
);
g_validCmd
.
clear
();
g_validCmd
.
clear
();
for
(
let
c
of
g_centerSupportCmd
)
{
let
centerSupportCmd
=
Array
.
from
(
g_centerSupportCmd
.
values
())
if
(
cmds
.
has
(
c
))
{
for
(
let
c
of
centerSupportCmd
)
{
g_validCmd
.
add
(
c
);
if
(
cmds
.
concat
(
c
))
{
}
g_validCmd
.
add
(
c
);
}
}
}
});
});
// 注册输出设备变更监听
// 注册输出设备变更监听
controller
.
on
(
'
outputDeviceChange
'
,
(
device
)
=>
{
controller
.
on
(
'
outputDeviceChange
'
,
(
state
,
device
)
=>
{
console
.
info
(
`on outputDeviceChange device isRemote :
${
device
.
isRemote
}
`
);
console
.
info
(
`outputDeviceChange device are :
${
JSON
.
stringify
(
device
)
}
`
);
});
});
// 注册会话自定义事件变更监听
// 注册会话自定义事件变更监听
controller
.
on
(
'
sessionEvent
'
,
(
eventName
,
eventArgs
)
=>
{
controller
.
on
(
'
sessionEvent
'
,
(
eventName
,
eventArgs
)
=>
{
...
@@ -224,40 +237,41 @@ OpenHarmony系统预置的播控中心,作为媒体会话控制方与音视频
...
@@ -224,40 +237,41 @@ OpenHarmony系统预置的播控中心,作为媒体会话控制方与音视频
4.
获取媒体会话提供方传递的媒体信息,可以用于界面展示,例如在播控中心展示当前播放的曲目及对应的播放状态。
4.
获取媒体会话提供方传递的媒体信息,可以用于界面展示,例如在播控中心展示当前播放的曲目及对应的播放状态。
```
ts
```
ts
async
getInfoFromSessionByController
()
{
import
AVSessionManager
from
'
@ohos.multimedia.avsession
'
;
async
function
getInfoFromSessionByController
()
{
// 假设我们已经有了一个对应session的controller,如何创建controller可以参考之前的案例
// 假设我们已经有了一个对应session的controller,如何创建controller可以参考之前的案例
let
controller
:
AVSessionManager
.
AVSessionController
=
ALLREADY_HAVE_A_CONTROLLER
;
let
controller
=
await
AVSessionManager
.
createController
(
""
)
// 获取sessionId
// 获取sessionId
let
sessionId
:
string
=
controller
.
sessionId
;
let
sessionId
=
controller
.
sessionId
;
console
.
info
(
`get sessionId by controller : isActive :
${
sessionId
}
`
);
console
.
info
(
`get sessionId by controller : isActive :
${
sessionId
}
`
);
// 获取session激活状态
// 获取session激活状态
let
isActive
:
boolean
=
await
controller
.
isActive
();
let
isActive
=
await
controller
.
isActive
();
console
.
info
(
`get activeState by controller :
${
isActive
}
`
);
console
.
info
(
`get activeState by controller :
${
isActive
}
`
);
// 获取session的媒体信息
// 获取session的媒体信息
let
metadata
:
AVSessionManager
.
AVMetadata
=
await
controller
.
getAVMetadata
();
let
metadata
=
await
controller
.
getAVMetadata
();
console
.
info
(
`get media title by controller :
${
metadata
.
title
}
`
);
console
.
info
(
`get media title by controller :
${
metadata
.
title
}
`
);
console
.
info
(
`get media artist by controller :
${
metadata
.
artist
}
`
);
console
.
info
(
`get media artist by controller :
${
metadata
.
artist
}
`
);
// 获取session的播放信息
// 获取session的播放信息
let
avPlaybackState
:
AVSessionManager
.
AVPlaybackState
=
await
controller
.
getAVPlaybackState
();
let
avPlaybackState
=
await
controller
.
getAVPlaybackState
();
console
.
info
(
`get playbackState by controller :
${
avPlaybackState
.
state
}
`
);
console
.
info
(
`get playbackState by controller :
${
avPlaybackState
.
state
}
`
);
console
.
info
(
`get favoriteState by controller :
${
avPlaybackState
.
isFavorite
}
`
);
console
.
info
(
`get favoriteState by controller :
${
avPlaybackState
.
isFavorite
}
`
);
// 获取session的播放列表信息
// 获取session的播放列表信息
let
queueItems
:
Array
<
AVSessionManager
.
AVQueueItem
>
=
await
controller
.
getAVQueueItems
();
let
queueItems
=
await
controller
.
getAVQueueItems
();
console
.
info
(
`get queueItems length by controller :
${
queueItems
.
length
}
`
);
console
.
info
(
`get queueItems length by controller :
${
queueItems
.
length
}
`
);
// 获取session的播放标题信息
// 获取session的播放标题信息
let
queueTitle
:
string
=
await
controller
.
getAVQueueTitle
();
let
queueTitle
=
await
controller
.
getAVQueueTitle
();
console
.
info
(
`get queueTitle by controller :
${
queueTitle
}
`
);
console
.
info
(
`get queueTitle by controller :
${
queueTitle
}
`
);
// 获取session的自定义媒体数据包
// 获取session的自定义媒体数据包
let
extras
:
any
=
await
controller
.
getExtras
();
let
extras
=
await
controller
.
getExtras
();
console
.
info
(
`get custom media packets by controller :
${
JSON
.
stringify
(
extras
)}
`
);
console
.
info
(
`get custom media packets by controller :
${
JSON
.
stringify
(
extras
)}
`
);
// 获取session对应应用提供的ability信息
// 获取session对应应用提供的ability信息
let
agent
:
WantAgent
=
await
controller
.
getLaunchAbility
();
let
agent
=
await
controller
.
getLaunchAbility
();
console
.
info
(
`get want agent info by controller :
${
JSON
.
stringify
(
agent
)}
`
);
console
.
info
(
`get want agent info by controller :
${
JSON
.
stringify
(
agent
)}
`
);
// 获取session的当前播放位置信息
// 获取session的当前播放位置信息
let
currentTime
:
number
=
controller
.
getRealPlaybackPositionSync
();
let
currentTime
=
controller
.
getRealPlaybackPositionSync
();
console
.
info
(
`get current playback time by controller :
${
currentTime
}
`
);
console
.
info
(
`get current playback time by controller :
${
currentTime
}
`
);
// 获取session支持的有效命令
// 获取session支持的有效命令
let
validCommands
:
Array
<
AVSessionManager
.
AVControlCommandType
>
=
await
controller
.
getValidCommands
();
let
validCommands
=
await
controller
.
getValidCommands
();
console
.
info
(
`get valid commands by controller :
${
JSON
.
stringify
(
validCommands
)}
`
);
console
.
info
(
`get valid commands by controller :
${
JSON
.
stringify
(
validCommands
)}
`
);
}
}
```
```
...
@@ -267,11 +281,14 @@ OpenHarmony系统预置的播控中心,作为媒体会话控制方与音视频
...
@@ -267,11 +281,14 @@ OpenHarmony系统预置的播控中心,作为媒体会话控制方与音视频
作为媒体会话提供方的音视频应用在监听到相关的播控命令事件后,在相应的逻辑中可以完成对应的操作动作。
作为媒体会话提供方的音视频应用在监听到相关的播控命令事件后,在相应的逻辑中可以完成对应的操作动作。
```
ts
```
ts
async
sendCommandToSessionByController
()
{
import
AVSessionManager
from
'
@ohos.multimedia.avsession
'
;
import
{
BusinessError
}
from
'
@ohos.base
'
;
async
function
sendCommandToSessionByController
()
{
// 假设我们已经有了一个对应session的controller,如何创建controller可以参考之前的案例
// 假设我们已经有了一个对应session的controller,如何创建controller可以参考之前的案例
let
controller
:
AVSessionManager
.
AVSessionController
=
ALLREADY_HAVE_A_CONTROLLER
;
let
controller
=
await
AVSessionManager
.
createController
(
""
)
// 获取这个session支持的命令种类
// 获取这个session支持的命令种类
let
validCommandTypeArray
:
Array
<
AVSessionManager
.
AVControlCommandType
>
=
await
controller
.
getValidCommands
();
let
validCommandTypeArray
=
await
controller
.
getValidCommands
();
console
.
info
(
`get validCommandArray by controller : length :
${
validCommandTypeArray
.
length
}
`
);
console
.
info
(
`get validCommandArray by controller : length :
${
validCommandTypeArray
.
length
}
`
);
// 下发播放命令
// 下发播放命令
// 如果可用命令包含播放,则下发播放命令,正常session都应该提供并实现播放功能
// 如果可用命令包含播放,则下发播放命令,正常session都应该提供并实现播放功能
...
@@ -295,20 +312,17 @@ OpenHarmony系统预置的播控中心,作为媒体会话控制方与音视频
...
@@ -295,20 +312,17 @@ OpenHarmony系统预置的播控中心,作为媒体会话控制方与音视频
controller
.
sendControlCommand
(
avCommand
);
controller
.
sendControlCommand
(
avCommand
);
}
}
// 下发自定义控制命令
// 下发自定义控制命令
let
commandName
:
string
=
'
custom command
'
;
let
commandName
=
'
custom command
'
;
let
args
=
{
await
controller
.
sendCommonCommand
(
commandName
,
{
command
:
'
This is my custom command
'
}).
then
(()
=>
{
command
:
'
This is my custom command
'
}
await
controller
.
sendCommonCommand
(
commandName
,
args
).
then
(()
=>
{
console
.
info
(
`SendCommonCommand successfully`
);
console
.
info
(
`SendCommonCommand successfully`
);
}).
catch
((
err
)
=>
{
}).
catch
((
err
:
BusinessError
)
=>
{
console
.
error
(
`Failed to send common command. Code:
${
err
.
code
}
, message:
${
err
.
message
}
`
);
console
.
error
(
`Failed to send common command. Code:
${
err
.
code
}
, message:
${
err
.
message
}
`
);
})
})
// 设置指定播放列表单项的ID,供session选择播放
// 设置指定播放列表单项的ID,供session选择播放
let
queueItemId
:
number
=
0
;
let
queueItemId
=
0
;
await
controller
.
skipToQueueItem
(
queueItemId
).
then
(()
=>
{
await
controller
.
skipToQueueItem
(
queueItemId
).
then
(()
=>
{
console
.
info
(
`SkipToQueueItem successfully`
);
console
.
info
(
`SkipToQueueItem successfully`
);
}).
catch
((
err
)
=>
{
}).
catch
((
err
:
BusinessError
)
=>
{
console
.
error
(
`Failed to skip to queue item. Code:
${
err
.
code
}
, message:
${
err
.
message
}
`
);
console
.
error
(
`Failed to skip to queue item. Code:
${
err
.
code
}
, message:
${
err
.
message
}
`
);
});
});
}
}
...
@@ -317,12 +331,15 @@ OpenHarmony系统预置的播控中心,作为媒体会话控制方与音视频
...
@@ -317,12 +331,15 @@ OpenHarmony系统预置的播控中心,作为媒体会话控制方与音视频
6.
在媒体会话控制方应用退出时及时取消事件监听,并释放资源。
6.
在媒体会话控制方应用退出时及时取消事件监听,并释放资源。
```
ts
```
ts
async
destroyController
()
{
import
AVSessionManager
from
'
@ohos.multimedia.avsession
'
;
import
{
BusinessError
}
from
'
@ohos.base
'
;
async
function
destroyController
()
{
// 假设我们已经有了一个对应session的controller,如何创建controller可以参考之前的案例
// 假设我们已经有了一个对应session的controller,如何创建controller可以参考之前的案例
let
controller
:
AVSessionManager
.
AVSessionController
=
ALLREADY_HAVE_A_CONTROLLER
;
let
controller
=
await
AVSessionManager
.
createController
(
""
)
// 销毁当前的controller,销毁后这个controller将不在可用
// 销毁当前的controller,销毁后这个controller将不在可用
controller
.
destroy
(
function
(
err
)
{
controller
.
destroy
(
(
err
:
BusinessError
)
=>
{
if
(
err
)
{
if
(
err
)
{
console
.
error
(
`Failed to destroy controller. Code:
${
err
.
code
}
, message:
${
err
.
message
}
`
);
console
.
error
(
`Failed to destroy controller. Code:
${
err
.
code
}
, message:
${
err
.
message
}
`
);
}
else
{
}
else
{
...
...
zh-cn/application-dev/media/using-avsession-developer.md
浏览文件 @
37e403cf
...
@@ -37,22 +37,16 @@
...
@@ -37,22 +37,16 @@
1.
通过AVSessionManager的方法创建并激活媒体会话。
1.
通过AVSessionManager的方法创建并激活媒体会话。
```
ts
```
ts
// 创建媒体会话需要获取应用的上下文(context)。开发者可以在应用的EntryAbility文件中设置一个全局变量来存储应用的上下文
import
AVSessionManager
from
'
@ohos.multimedia.avsession
'
;
export
default
class
EntryAbility
extends
UIAbility
{
onCreate
(
want
,
launchParam
)
{
globalThis
.
context
=
this
.
context
;
// 设置一个全局变量globalThis.context来存储应用的上下文
}
// 其它EntryAbility类的方法
}
// 开始创建并激活媒体会话
// 开始创建并激活媒体会话
import
AVSessionManager
from
'
@ohos.multimedia.avsession
'
;
//导入AVSessionManager模块
// 创建session
// 创建session
async
createSession
()
{
let
context
:
Context
=
this
.
context
;
let
session
:
AVSessionManager
.
AVSession
=
await
AVSessionManager
.
createAVSession
(
globalThis
.
context
,
'
SESSION_NAME
'
,
'
audio
'
);
async
function
createSession
()
{
session
.
activate
();
let
type
:
AVSessionManager
.
AVSessionType
=
'
audio
'
;
console
.
info
(
`session create done : sessionId :
${
session
.
sessionId
}
`
);
let
session
=
await
AVSessionManager
.
createAVSession
(
context
,
'
SESSION_NAME
'
,
type
);
await
session
.
activate
();
console
.
info
(
`session create done : sessionId :
${
session
.
sessionId
}
`
);
}
}
```
```
...
@@ -63,9 +57,13 @@
...
@@ -63,9 +57,13 @@
音视频应用设置的媒体会话信息,会被媒体会话控制方通过AVSessionController相关方法获取后进行显示或处理。
音视频应用设置的媒体会话信息,会被媒体会话控制方通过AVSessionController相关方法获取后进行显示或处理。
```
ts
```
ts
async
setSessionInfo
()
{
import
AVSessionManager
from
'
@ohos.multimedia.avsession
'
;
import
{
BusinessError
}
from
'
@ohos.base
'
;
let
context
:
Context
=
this
.
context
;
async
function
setSessionInfo
()
{
// 假设已经创建了一个session,如何创建session可以参考之前的案例
// 假设已经创建了一个session,如何创建session可以参考之前的案例
let
session
:
AVSessionManager
.
AVSession
=
ALREADY_CREATE_A_SESSION
;
let
session
=
await
AVSessionManager
.
createAVSession
(
context
,
'
SESSION_NAME
'
,
'
audio
'
)
;
// 播放器逻辑··· 引发媒体信息与播放状态的变更
// 播放器逻辑··· 引发媒体信息与播放状态的变更
// 设置必要的媒体信息
// 设置必要的媒体信息
let
metadata
:
AVSessionManager
.
AVMetadata
=
{
let
metadata
:
AVSessionManager
.
AVMetadata
=
{
...
@@ -75,7 +73,7 @@
...
@@ -75,7 +73,7 @@
};
};
session
.
setAVMetadata
(
metadata
).
then
(()
=>
{
session
.
setAVMetadata
(
metadata
).
then
(()
=>
{
console
.
info
(
`SetAVMetadata successfully`
);
console
.
info
(
`SetAVMetadata successfully`
);
}).
catch
((
err
)
=>
{
}).
catch
((
err
:
BusinessError
)
=>
{
console
.
error
(
`Failed to set AVMetadata. Code:
${
err
.
code
}
, message:
${
err
.
message
}
`
);
console
.
error
(
`Failed to set AVMetadata. Code:
${
err
.
code
}
, message:
${
err
.
message
}
`
);
});
});
// 简单设置一个播放状态 - 暂停 未收藏
// 简单设置一个播放状态 - 暂停 未收藏
...
@@ -83,7 +81,7 @@
...
@@ -83,7 +81,7 @@
state
:
AVSessionManager
.
PlaybackState
.
PLAYBACK_STATE_PAUSE
,
state
:
AVSessionManager
.
PlaybackState
.
PLAYBACK_STATE_PAUSE
,
isFavorite
:
false
isFavorite
:
false
};
};
session
.
setAVPlaybackState
(
playbackState
,
function
(
err
)
{
session
.
setAVPlaybackState
(
playbackState
,
(
err
)
=>
{
if
(
err
)
{
if
(
err
)
{
console
.
error
(
`Failed to set AVPlaybackState. Code:
${
err
.
code
}
, message:
${
err
.
message
}
`
);
console
.
error
(
`Failed to set AVPlaybackState. Code:
${
err
.
code
}
, message:
${
err
.
message
}
`
);
}
else
{
}
else
{
...
@@ -91,43 +89,41 @@
...
@@ -91,43 +89,41 @@
}
}
});
});
// 设置一个播放列表
// 设置一个播放列表
let
queueItemDescription_1
=
{
let
queueItemDescription_1
:
AVSessionManager
.
AVMediaDescription
=
{
media
Id
:
'
001
'
,
asset
Id
:
'
001
'
,
title
:
'
music_name
'
,
title
:
'
music_name
'
,
subtitle
:
'
music_sub_name
'
,
subtitle
:
'
music_sub_name
'
,
description
:
'
music_description
'
,
description
:
'
music_description
'
,
icon
:
PIXELMAP_OBJECT
,
mediaImage
:
"
PIXELMAP_OBJECT
"
,
iconUri
:
'
http://www.xxx.com
'
,
extras
:
{
'
extras
'
:
'
any
'
}
extras
:
{
'
extras
'
:
'
any
'
}
};
};
let
queueItem_1
=
{
let
queueItem_1
:
AVSessionManager
.
AVQueueItem
=
{
itemId
:
1
,
itemId
:
1
,
description
:
queueItemDescription_1
description
:
queueItemDescription_1
};
};
let
queueItemDescription_2
=
{
let
queueItemDescription_2
:
AVSessionManager
.
AVMediaDescription
=
{
media
Id
:
'
002
'
,
asset
Id
:
'
002
'
,
title
:
'
music_name
'
,
title
:
'
music_name
'
,
subtitle
:
'
music_sub_name
'
,
subtitle
:
'
music_sub_name
'
,
description
:
'
music_description
'
,
description
:
'
music_description
'
,
icon
:
PIXELMAP_OBJECT
,
mediaImage
:
"
PIXELMAP_OBJECT
"
,
iconUri
:
'
http://www.xxx.com
'
,
extras
:
{
'
extras
'
:
'
any
'
}
extras
:
{
'
extras
'
:
'
any
'
}
};
};
let
queueItem_2
=
{
let
queueItem_2
:
AVSessionManager
.
AVQueueItem
=
{
itemId
:
2
,
itemId
:
2
,
description
:
queueItemDescription_2
description
:
queueItemDescription_2
};
};
let
queueItemsArray
=
[
queueItem_1
,
queueItem_2
];
let
queueItemsArray
=
[
queueItem_1
,
queueItem_2
];
session
.
setAVQueueItems
(
queueItemsArray
).
then
(()
=>
{
session
.
setAVQueueItems
(
queueItemsArray
).
then
(()
=>
{
console
.
info
(
`SetAVQueueItems successfully`
);
console
.
info
(
`SetAVQueueItems successfully`
);
}).
catch
((
err
)
=>
{
}).
catch
((
err
:
BusinessError
)
=>
{
console
.
error
(
`Failed to set AVQueueItem, error code:
${
err
.
code
}
, error message:
${
err
.
message
}
`
);
console
.
error
(
`Failed to set AVQueueItem, error code:
${
err
.
code
}
, error message:
${
err
.
message
}
`
);
});
});
// 设置媒体播放列表名称
// 设置媒体播放列表名称
let
queueTitle
=
'
QUEUE_TITLE
'
;
let
queueTitle
=
'
QUEUE_TITLE
'
;
session
.
setAVQueueTitle
(
queueTitle
).
then
(()
=>
{
session
.
setAVQueueTitle
(
queueTitle
).
then
(()
=>
{
console
.
info
(
`SetAVQueueTitle successfully`
);
console
.
info
(
`SetAVQueueTitle successfully`
);
}).
catch
((
er
r
)
=>
{
}).
catch
((
err
:
BusinessErro
r
)
=>
{
console
.
info
(
`Failed to set AVQueueTitle, error code:
${
err
.
code
}
, error message:
${
err
.
message
}
`
);
console
.
info
(
`Failed to set AVQueueTitle, error code:
${
err
.
code
}
, error message:
${
err
.
message
}
`
);
});
});
}
}
...
@@ -141,22 +137,29 @@
...
@@ -141,22 +137,29 @@
```
```
```
ts
```
ts
// 假设已经创建了一个session,如何创建session可以参考之前的案例
import
AVSessionManager
from
'
@ohos.multimedia.avsession
'
;
let
session
:
AVSessionManager
.
AVSession
=
ALREADY_CREATE_A_SESSION
;
import
wantAgent
from
'
@ohos.app.ability.wantAgent
'
;
let
wantAgentInfo
=
{
let
context
:
Context
=
this
.
context
;
async
function
getWantAgent
()
{
let
type
:
AVSessionManager
.
AVSessionType
=
'
audio
'
;
// 假设已经创建了一个session,如何创建session可以参考之前的案例
let
session
=
await
AVSessionManager
.
createAVSession
(
context
,
'
SESSION_NAME
'
,
type
);
let
wantAgentInfo
:
wantAgent
.
WantAgentInfo
=
{
wants
:
[
wants
:
[
{
{
bundleName
:
'
com.example.musicdemo
'
,
bundleName
:
'
com.example.musicdemo
'
,
abilityName
:
'
com.example.musicdemo.MainAbility
'
abilityName
:
'
com.example.musicdemo.MainAbility
'
}
}
],
],
operationType
:
wantAgent
.
OperationType
.
START_ABILITIES
,
operationType
:
wantAgent
.
OperationType
.
START_ABILITIES
,
requestCode
:
0
,
requestCode
:
0
,
wantAgentFlags
:
[
wantAgent
.
WantAgentFlags
.
UPDATE_PRESENT_FLAG
]
wantAgentFlags
:
[
wantAgent
.
WantAgentFlags
.
UPDATE_PRESENT_FLAG
]
}
}
wantAgent
.
getWantAgent
(
wantAgentInfo
).
then
((
agent
)
=>
{
wantAgent
.
getWantAgent
(
wantAgentInfo
).
then
((
agent
)
=>
{
session
.
setLaunchAbility
(
agent
);
session
.
setLaunchAbility
(
agent
);
})
})
}
```
```
4.
设置一个即时的自定义会话事件,以供媒体控制方接收到事件后进行相应的操作。
4.
设置一个即时的自定义会话事件,以供媒体控制方接收到事件后进行相应的操作。
...
@@ -165,17 +168,23 @@
...
@@ -165,17 +168,23 @@
> 通过dispatchSessionEvent方法设置的数据不会保存在会话对象或AVSession服务中。
> 通过dispatchSessionEvent方法设置的数据不会保存在会话对象或AVSession服务中。
```
ts
```
ts
// 假设已经创建了一个session,如何创建session可以参考 "1. 通过AVSessionManager的方法创建并激活媒体会话"
let
session
:
AVSessionManager
.
AVSession
=
ALREADY_CREATE_A_SESSION
;
import
AVSessionManager
from
'
@ohos.multimedia.avsession
'
;
let
eventName
=
'
dynamic_lyric
'
;
import
{
BusinessError
}
from
'
@ohos.base
'
;
let
args
=
{
lyric
:
'
This is my lyric
'
let
context
:
Context
=
this
.
context
;
async
function
dispatchSessionEvent
()
{
// 假设已经创建了一个session,如何创建session可以参考之前的案例
let
type
:
AVSessionManager
.
AVSessionType
=
'
audio
'
;
let
session
=
await
AVSessionManager
.
createAVSession
(
context
,
'
SESSION_NAME
'
,
type
);
let
eventName
=
'
dynamic_lyric
'
;
await
session
.
dispatchSessionEvent
(
eventName
,
{
lyric
:
'
This is my lyric
'
}).
then
(()
=>
{
console
.
info
(
`Dispatch session event successfully`
);
}).
catch
((
err
:
BusinessError
)
=>
{
console
.
error
(
`Failed to dispatch session event. Code:
${
err
.
code
}
, message:
${
err
.
message
}
`
);
})
}
}
await
session
.
dispatchSessionEvent
(
eventName
,
args
).
then
(()
=>
{
console
.
info
(
`Dispatch session event successfully`
);
}).
catch
((
err
)
=>
{
console
.
error
(
`Failed to dispatch session event. Code:
${
err
.
code
}
, message:
${
err
.
message
}
`
);
})
```
```
5.
设置与当前会话相关的自定义媒体数据包,以供媒体控制方接收到事件后进行相应的操作。
5.
设置与当前会话相关的自定义媒体数据包,以供媒体控制方接收到事件后进行相应的操作。
...
@@ -184,16 +193,20 @@
...
@@ -184,16 +193,20 @@
> 通过setExtras方法设置的数据包会被存储在AVSession服务中,数据的生命周期与会话一致;会话对应的Controller可以使用getExtras来获取该数据。
> 通过setExtras方法设置的数据包会被存储在AVSession服务中,数据的生命周期与会话一致;会话对应的Controller可以使用getExtras来获取该数据。
```
ts
```
ts
// 假设已经创建了一个session,如何创建session可以参考之前的案例
import
AVSessionManager
from
'
@ohos.multimedia.avsession
'
;
let
session
:
AVSessionManager
.
AVSession
=
ALREADY_CREATE_A_SESSION
;
import
{
BusinessError
}
from
'
@ohos.base
'
;
let
extras
=
{
extra
:
'
This is my custom meida packet
'
let
context
:
Context
=
this
.
context
;
async
function
setExtras
()
{
// 假设已经创建了一个session,如何创建session可以参考之前的案例
let
type
:
AVSessionManager
.
AVSessionType
=
'
audio
'
;
let
session
=
await
AVSessionManager
.
createAVSession
(
context
,
'
SESSION_NAME
'
,
type
);
await
session
.
setExtras
({
extra
:
'
This is my custom meida packet
'
}).
then
(()
=>
{
console
.
info
(
`Set extras successfully`
);
}).
catch
((
err
:
BusinessError
)
=>
{
console
.
error
(
`Failed to set extras. Code:
${
err
.
code
}
, message:
${
err
.
message
}
`
);
})
}
}
await
session
.
setExtras
(
extras
).
then
(()
=>
{
console
.
info
(
`Set extras successfully`
);
}).
catch
((
err
)
=>
{
console
.
error
(
`Failed to set extras. Code:
${
err
.
code
}
, message:
${
err
.
message
}
`
);
})
```
```
6.
注册播控命令事件监听,便于响应用户通过媒体会话控制方,例如播控中心,下发的播控命令。
6.
注册播控命令事件监听,便于响应用户通过媒体会话控制方,例如播控中心,下发的播控命令。
...
@@ -209,9 +222,13 @@
...
@@ -209,9 +222,13 @@
Session侧的固定播控命令主要包括播放、暂停、上一首、下一首等基础操作命令,详细介绍请参见
[
AVControlCommand
](
../reference/apis/js-apis-avsession.md
)
Session侧的固定播控命令主要包括播放、暂停、上一首、下一首等基础操作命令,详细介绍请参见
[
AVControlCommand
](
../reference/apis/js-apis-avsession.md
)
```
ts
```
ts
async
setListenerForMesFromController
()
{
import
AVSessionManager
from
'
@ohos.multimedia.avsession
'
;
let
context
:
Context
=
this
.
context
;
async
function
setListenerForMesFromController
()
{
// 假设已经创建了一个session,如何创建session可以参考之前的案例
// 假设已经创建了一个session,如何创建session可以参考之前的案例
let
session
:
AVSessionManager
.
AVSession
=
ALREADY_CREATE_A_SESSION
;
let
type
:
AVSessionManager
.
AVSessionType
=
'
audio
'
;
let
session
=
await
AVSessionManager
.
createAVSession
(
context
,
'
SESSION_NAME
'
,
type
);
// 一般在监听器中会对播放器做相应逻辑处理
// 一般在监听器中会对播放器做相应逻辑处理
// 不要忘记处理完后需要通过set接口同步播放相关信息,参考上面的用例
// 不要忘记处理完后需要通过set接口同步播放相关信息,参考上面的用例
session
.
on
(
'
play
'
,
()
=>
{
session
.
on
(
'
play
'
,
()
=>
{
...
@@ -272,9 +289,13 @@
...
@@ -272,9 +289,13 @@
-
commonCommand: 自定义控制命令变化的事件。
-
commonCommand: 自定义控制命令变化的事件。
```
ts
```
ts
async
setListenerForMesFromController
()
{
import
AVSessionManager
from
'
@ohos.multimedia.avsession
'
;
let
context
:
Context
=
this
.
context
;
async
function
setListenerForMesFromController
()
{
// 假设已经创建了一个session,如何创建session可以参考之前的案例
// 假设已经创建了一个session,如何创建session可以参考之前的案例
let
session
:
AVSessionManager
.
AVSession
=
ALREADY_CREATE_A_SESSION
;
let
type
:
AVSessionManager
.
AVSessionType
=
'
audio
'
;
let
session
=
await
AVSessionManager
.
createAVSession
(
context
,
'
SESSION_NAME
'
,
type
);
// 一般在监听器中会对播放器做相应逻辑处理
// 一般在监听器中会对播放器做相应逻辑处理
// 不要忘记处理完后需要通过set接口同步播放相关信息,参考上面的用例
// 不要忘记处理完后需要通过set接口同步播放相关信息,参考上面的用例
session
.
on
(
'
skipToQueueItem
'
,
(
itemId
)
=>
{
session
.
on
(
'
skipToQueueItem
'
,
(
itemId
)
=>
{
...
@@ -299,23 +320,27 @@
...
@@ -299,23 +320,27 @@
7.
获取当前媒体会话自身的控制器,与媒体会话对应进行通信交互。
7.
获取当前媒体会话自身的控制器,与媒体会话对应进行通信交互。
```
ts
```
ts
async
createControllerFromSession
()
{
import
AVSessionManager
from
'
@ohos.multimedia.avsession
'
;
let
context
:
Context
=
this
.
context
;
async
function
createControllerFromSession
()
{
// 假设已经创建了一个session,如何创建session可以参考之前的案例
// 假设已经创建了一个session,如何创建session可以参考之前的案例
let
session
:
AVSessionManager
.
AVSession
=
ALREADY_CREATE_A_SESSION
;
let
type
:
AVSessionManager
.
AVSessionType
=
'
audio
'
;
let
session
=
await
AVSessionManager
.
createAVSession
(
context
,
'
SESSION_NAME
'
,
type
);
// 通过已有session获取一个controller对象
// 通过已有session获取一个controller对象
let
controller
:
AVSessionManager
.
AVSessionController
=
await
session
.
getController
();
let
controller
=
await
session
.
getController
();
// controller可以与原session对象进行基本的通信交互,比如下发播放命令
// controller可以与原session对象进行基本的通信交互,比如下发播放命令
let
avCommand
:
AVSessionManager
.
AVControlCommand
=
{
command
:
'
play
'
};
let
avCommand
:
AVSessionManager
.
AVControlCommand
=
{
command
:
'
play
'
};
controller
.
sendControlCommand
(
avCommand
);
controller
.
sendControlCommand
(
avCommand
);
// 或者做状态变更监听
// 或者做状态变更监听
controller
.
on
(
'
playbackStateChange
'
,
'
all
'
,
(
state
:
AVSessionManager
.
AVPlaybackState
)
=>
{
controller
.
on
(
'
playbackStateChange
'
,
'
all
'
,
(
state
)
=>
{
// do some things
// do some things
});
});
// controller可以做的操作还有很多,具体可以参考媒体会话控制方相关的说明
// controller可以做的操作还有很多,具体可以参考媒体会话控制方相关的说明
}
}
```
```
...
@@ -324,10 +349,14 @@
...
@@ -324,10 +349,14 @@
取消播控命令监听的示例代码如下所示 :
取消播控命令监听的示例代码如下所示 :
```
ts
```
ts
async
unregisterSessionListener
()
{
import
AVSessionManager
from
'
@ohos.multimedia.avsession
'
;
let
context
:
Context
=
this
.
context
;
async
function
unregisterSessionListener
()
{
// 假设已经创建了一个session,如何创建session可以参考之前的案例
// 假设已经创建了一个session,如何创建session可以参考之前的案例
let
session
:
AVSessionManager
.
AVSession
=
ALREADY_CREATE_A_SESSION
;
let
type
:
AVSessionManager
.
AVSessionType
=
'
audio
'
;
let
session
=
await
AVSessionManager
.
createAVSession
(
context
,
'
SESSION_NAME
'
,
type
);
// 取消指定session下的相关监听
// 取消指定session下的相关监听
session
.
off
(
'
play
'
);
session
.
off
(
'
play
'
);
session
.
off
(
'
pause
'
);
session
.
off
(
'
pause
'
);
...
@@ -344,11 +373,15 @@
...
@@ -344,11 +373,15 @@
销毁媒体会话示例代码如下所示:
销毁媒体会话示例代码如下所示:
```
ts
```
ts
async
destroySession
()
{
import
AVSessionManager
from
'
@ohos.multimedia.avsession
'
;
let
context
:
Context
=
this
.
context
;
async
function
destroySession
()
{
// 假设已经创建了一个session,如何创建session可以参考之前的案例
// 假设已经创建了一个session,如何创建session可以参考之前的案例
let
session
:
AVSessionManager
.
AVSession
=
ALREADY_CREATE_A_SESSION
;
let
type
:
AVSessionManager
.
AVSessionType
=
'
audio
'
;
let
session
=
await
AVSessionManager
.
createAVSession
(
context
,
'
SESSION_NAME
'
,
type
);
// 主动销毁已创建的session
// 主动销毁已创建的session
session
.
destroy
(
function
(
err
)
{
session
.
destroy
(
(
err
)
=>
{
if
(
err
)
{
if
(
err
)
{
console
.
error
(
`Failed to destroy session. Code:
${
err
.
code
}
, message:
${
err
.
message
}
`
);
console
.
error
(
`Failed to destroy session. Code:
${
err
.
code
}
, message:
${
err
.
message
}
`
);
}
else
{
}
else
{
...
...
zh-cn/application-dev/media/using-distributed-avsession.md
浏览文件 @
37e403cf
...
@@ -30,22 +30,29 @@
...
@@ -30,22 +30,29 @@
2.
通过AVSessionManager的castAudio接口将当前设备所有会话投播到其他设备。
2.
通过AVSessionManager的castAudio接口将当前设备所有会话投播到其他设备。
```
ts
```
ts
// 投播到其他设备
import
AVSessionManager
from
'
@ohos.multimedia.avsession
'
;
let
audioManager
=
audio
.
getAudioManager
();
import
audio
from
'
@ohos.multimedia.audio
'
;
let
audioRoutingManager
=
audioManager
.
getRoutingManager
();
import
{
BusinessError
}
from
'
@ohos.base
'
;
let
audioDevices
;
await
audioRoutingManager
.
getDevices
(
audio
.
DeviceFlag
.
OUTPUT_DEVICES_FLAG
).
then
((
data
)
=>
{
async
function
castAudio
()
{
audioDevices
=
data
;
// 投播到其他设备
console
.
info
(
`Promise returned to indicate that the device list is obtained.`
);
let
audioManager
=
audio
.
getAudioManager
();
}).
catch
((
err
)
=>
{
let
audioRoutingManager
=
audioManager
.
getRoutingManager
();
console
.
error
(
`Failed to get devices. Code:
${
err
.
code
}
, message:
${
err
.
message
}
`
);
let
audioDevices
:
audio
.
AudioDeviceDescriptors
;
});
await
audioRoutingManager
.
getDevices
(
audio
.
DeviceFlag
.
OUTPUT_DEVICES_FLAG
).
then
((
data
)
=>
{
audioDevices
=
data
;
AVSessionManager
.
castAudio
(
'
all
'
,
audioDevices
).
then
(()
=>
{
console
.
info
(
`Promise returned to indicate that the device list is obtained.`
);
console
.
info
(
`createController : SUCCESS`
);
}).
catch
((
err
:
BusinessError
)
=>
{
}).
catch
((
err
)
=>
{
console
.
error
(
`Failed to get devices. Code:
${
err
.
code
}
, message:
${
err
.
message
}
`
);
console
.
error
(
`Failed to cast audio. Code:
${
err
.
code
}
, message:
${
err
.
message
}
`
);
});
});
AVSessionManager
.
castAudio
(
'
all
'
,
audioDevices
).
then
(()
=>
{
console
.
info
(
`createController : SUCCESS`
);
}).
catch
((
err
:
BusinessError
)
=>
{
console
.
error
(
`Failed to cast audio. Code:
${
err
.
code
}
, message:
${
err
.
message
}
`
);
});
}
```
```
系统应用在投播主控端发起投播后,媒体会话框架会通知远端设备的AVSession服务创建远端媒体会话。投播主控端的媒体会话变化时(例如媒体信息变化、播放状态变化等),媒体会话框架会自动同步变化到远端设备。
系统应用在投播主控端发起投播后,媒体会话框架会通知远端设备的AVSession服务创建远端媒体会话。投播主控端的媒体会话变化时(例如媒体信息变化、播放状态变化等),媒体会话框架会自动同步变化到远端设备。
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录