1# 媒体会话提供方(C/C++) 2<!--Kit: AVSession Kit--> 3<!--Subsystem: Multimedia--> 4<!--Owner: @ccfriend; @liao_qian--> 5<!--Designer: @ccfriend--> 6<!--Tester: @chenmingxi1_huawei--> 7<!--Adviser: @zengyawen--> 8 9OHAVSession系统提供的通过使用C API实现媒体会话提供方,从而在媒体会话控制方(例如播控中心)中展示媒体相关信息,及响应媒体会话控制方下发的播控命令。 10 11## 使用入门 12 13开发者要使用[OHAVSession](../../reference/apis-avsession-kit/capi-native-avsession-h.md)实现媒体会话,需要添加对应的头文件。 14 15### 在 CMake 脚本中链接动态库 16 17``` cmake 18target_link_libraries(entry PUBLIC libohavsession.so) 19``` 20 21### 添加头文件 22 23```cpp 24#include <multimedia/av_session/native_avmetadata.h> 25#include <multimedia/av_session/native_avsession.h> 26#include <multimedia/av_session/native_avsession_errors.h> 27``` 28 29## 开发步骤及注意事项 30 31开发者可以通过以下几个步骤在NDK接入本地会话。 321. 创建会话并激活媒体,需要传入会话类型`AVSession_Type`,自定义的TAG,以及应用的包名、ability名字。 33 34 ```c++ 35 OH_AVSession* avsession; 36 OH_AVSession_Create(SESSION_TYPE_AUDIO, "testsession", "com.example.application", "MainAbility", &avsession); 37 OH_AVSession_Activate(avsession); 38 ``` 39 40 `AVSession_Type`包含如下四种类型: 41 42 - SESSION_TYPE_AUDIO 43 - SESSION_TYPE_VIDEO 44 - SESSION_TYPE_VOICE_CALL 45 - SESSION_TYPE_VIDEO_CALL 46 47 482. 应用内播放对应的媒体资源时,同步设置媒体元数据信息。 49 50 要设置元数据,要使用OH_AVMetadataBuilder构造具体的数据,最后生成一个 OH_AVMetadata。生成OH_AVMetadata后,使用OH_AVMetadata的各个功能接口进行资源的设置。 51 52 使用OH_AVMetadataBuilder构造元数据示例: 53 54 ```c++ 55 //创建OH_AVMetadataBuilder构造器。 56 OH_AVMetadataBuilder* builder; 57 OH_AVMetadataBuilder_Create(&builder); 58 59 OH_AVMetadata* ohMetadata; 60 OH_AVMetadataBuilder_SetTitle(builder, "Anonymous title"); 61 OH_AVMetadataBuilder_SetArtist(builder, "Anonymous artist"); 62 OH_AVMetadataBuilder_SetAuthor(builder, "Anonymous author"); 63 OH_AVMetadataBuilder_SetAlbum(builder, "Anonymous album"); 64 OH_AVMetadataBuilder_SetWriter(builder, "Anonymous writer"); 65 OH_AVMetadataBuilder_SetComposer(builder, "Anonymous composer"); 66 OH_AVMetadataBuilder_SetDuration(builder, 3600); 67 // MediaImageUri只支持网络地址。 68 OH_AVMetadataBuilder_SetMediaImageUri(builder, "https://xxx.xxx.xx"); 69 OH_AVMetadataBuilder_SetSubtitle(builder, "Anonymous subtitle"); 70 OH_AVMetadataBuilder_SetDescription(builder, "For somebody"); 71 // Lyric只支持媒体歌词内容(应用需将歌词内容拼接为一个字符串传入)。 72 OH_AVMetadataBuilder_SetLyric(builder, "balabala"); 73 OH_AVMetadataBuilder_SetAssetId(builder, "000"); 74 OH_AVMetadataBuilder_SetSkipIntervals(builder, SECONDS_30); 75 OH_AVMetadataBuilder_SetDisplayTags(builder, AVSESSION_DISPLAYTAG_AUDIO_VIVID); 76 77 /** 78 * generate an AVMetadata 构造AVMetadata对象 79 */ 80 OH_AVMetadataBuilder_GenerateAVMetadata(builder, &ohMetadata); 81 82 /** 83 * set AVMetadata 设置AVMetadata对象 84 */ 85 OH_AVSession_SetAVMetadata(avsession, ohMetadata); 86 ``` 87 88 在不使用AVMetadata之后,开发者应该执行OH_AVMetadataBuilder_Destroy接口来销毁元数据,且不要继续使用。 89 90 ```c++ 91 OH_AVMetadata_Destroy(ohMetadata); 92 OH_AVMetadataBuilder_Destroy(builder); 93 ``` 94 953. 跟随媒体播放状态的变化,及时更新媒体播放状态。 96 97 媒体播放状态,包含状态值、播放位置、播放速度、收藏状态等,可以按需使用对应的接口进行设置。 98 99 ```c++ 100 AVSession_ErrCode ret = AV_SESSION_ERR_SUCCESS; 101 102 // 设置播放状态,其中state范围应为[0,11]。 103 AVSession_PlaybackState state = PLAYBACK_STATE_PREPARING; 104 ret = OH_AVSession_SetPlaybackState(avsession, state); 105 106 // 设置播放位置。 107 AVSession_PlaybackPosition* playbackPosition = new AVSession_PlaybackPosition; 108 playbackPosition->elapsedTime = 1000; 109 playbackPosition->updateTime = 16111150; 110 ret = OH_AVSession_SetPlaybackPosition(avsession, playbackPosition); 111 ``` 112 1134. 注册播控命令事件监听,便于响应用户通过媒体会话控制方,例如播控中心下发的播控命令。 114 115 > **说明:** 116 > 117 > 媒体会话提供方在注册相关固定播控命令事件监听时,监听的事件会在媒体会话控制方的getValidCommands()方法中体现,即媒体会话控制方认为该方法有效,因此在需要时会触发相应的事件。为了保证媒体会话控制方下发的播控命令可以被正常执行,媒体会话提供方请勿进行无逻辑的空实现监听。 118 > 调用注册接口后,在业务结束时需要调用取消注册接口,避免出现异常。 119 120 Session侧目前支持的播控命令包括: 121 - 播放 122 - 暂停 123 - 停止 124 - 上一首 125 - 下一首 126 - 快退 127 - 快进 128 - 设置进度 129 - 设置收藏 130 131 ```c++ 132 // 设置播放/暂停/停止/上一首/下一首回调。 133 // CONTROL_CMD_PLAY = 0; 播放。 134 // CONTROL_CMD_PAUSE = 1; 暂停。 135 // CONTROL_CMD_STOP = 2; 停止。 136 // CONTROL_CMD_PLAY_NEXT = 3; 下一首。 137 // CONTROL_CMD_PLAY_PREVIOUS = 4; 上一首。 138 AVSession_ControlCommand command = CONTROL_CMD_PLAY; 139 OH_AVSessionCallback_OnCommand commandCallback = [](OH_AVSession* session, AVSession_ControlCommand command, 140 void* userData) -> AVSessionCallback_Result 141 { 142 return AVSESSION_CALLBACK_RESULT_SUCCESS; 143 }; 144 OH_AVSession_RegisterCommandCallback(avsession, command, commandCallback, (void *)(&userData)); 145 146 //设置快进回调。 147 OH_AVSessionCallback_OnFastForward fastForwardCallback = [](OH_AVSession* session, uint32_t seekTime, 148 void* userData) -> AVSessionCallback_Result 149 { 150 return AVSESSION_CALLBACK_RESULT_SUCCESS; 151 }; 152 OH_AVSession_RegisterForwardCallback(avsession, fastForwardCallback, (void *)(&userData)); 153 ``` 154 相关回调接口如下: 155 156 | 接口 | 说明 | 157 | ------------------------------------------------------------ | ------------ | 158 |OH_AVSession_RegisterCommandCallback(OH_AVSession* avsession, AVSession_ControlCommand command, OH_AVSessionCallback_OnCommand callback, void* userData) | 注册通用播控的回调,支持:播放、暂停、停止、上一首、下一首回调。 | 159 |OH_AVSession_RegisterForwardCallback(OH_AVSession* avsession, OH_AVSessionCallback_OnFastForward callback, void* userData) | 注册快进的回调。 | 160 |OH_AVSession_RegisterRewindCallback(OH_AVSession* avsession, OH_AVSessionCallback_OnRewind callback, void* userData) | 注册快退的回调。 | 161 |OH_AVSession_RegisterSeekCallback(OH_AVSession* avsession, OH_AVSessionCallback_OnSeek callback, void* userData) | 注册跳转的回调。 | 162 |OH_AVSession_RegisterToggleFavoriteCallback(OH_AVSession* avsession, OH_AVSessionCallback_OnToggleFavorite callback, void* userData) | 注册收藏的回调。 | 1635. 音视频应用在退出,并且不需要继续播放时,及时取消监听以及销毁媒体会话释放资源。示例代码如下所示: 164 165 ```c++ 166 OH_AVSession_Destroy(avsession); 167 ``` 168 169## 相关实例 170 171针对媒体会话提供方的NDK开发,有以下相关实例可供参考: 172 173- [媒体会话——提供方(C/C++)(API13)](https://gitcode.com/openharmony/applications_app_samples/tree/master/code/BasicFeature/Media/AVSession/MediaProvider) 174