From 71a78f965526a9c5dbcfc7f55d36e2e2c4b7b0e2 Mon Sep 17 00:00:00 2001 From: kaaryachen Date: Sat, 30 Mar 2024 15:08:51 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0DFX=E4=BA=8B=E4=BB=B6?= =?UTF-8?q?=E8=AE=BE=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: kaaryachen --- ...346\236\266DFX\350\256\276\350\256\241.md" | 150 ++++++++++++++++-- 1 file changed, 133 insertions(+), 17 deletions(-) diff --git "a/design/dfx/\350\247\206\351\242\221\346\241\206\346\236\266DFX\350\256\276\350\256\241.md" "b/design/dfx/\350\247\206\351\242\221\346\241\206\346\236\266DFX\350\256\276\350\256\241.md" index b049b93..e86b3f1 100644 --- "a/design/dfx/\350\247\206\351\242\221\346\241\206\346\236\266DFX\350\256\276\350\256\241.md" +++ "b/design/dfx/\350\247\206\351\242\221\346\241\206\346\236\266DFX\350\256\276\350\256\241.md" @@ -5,6 +5,7 @@ 统计事件:根据视频框架业务演进的需要,关键的KPI指标,设计统计事件,统计关键信息。 +相关打点能力接口请查看[HiSysEvent打点接口](https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/subsystems/subsys-dfx-hisysevent-logging.md#/openharmony/docs/blob/master/zh-cn/device-dev/subsystems/subsys-dfx-hisysevent-logging-config.md)。 ### 事件管理服务 (可放在MonitorService) 职责: @@ -16,27 +17,97 @@ 6. 统计事件,把所有事件记录信息转换为统计事件(json字符串)。 #### 接口设计 -这只是草稿, -```cpp -void MediaEvent::RecordEvent(name, parameters); +1. 使用简单工厂生成avplayer实例一一对应的MediaEvent实例 +```c++ +public: +MediaEvent MediaEventFactory::GetInstance(pid, uid, name); +void MediaEvent::DestroyMediaEvent(); // avplayer实例退出后需要销毁对应MediaEvent对象 + +private: +void MediaEvent::MediaEvent(name); +``` +2. 业务中调用RecordEvent将对应的键值对传入到MediaEvent实例中 + +方案一:提供一个统一接口,各个业务逻辑调用的时候会保存到MediaEvent内部的PlayerInfo/RecorderInfo/RetrieverInfo实例中 +```c++ +void MediaEvent::RecordEvent(params); +``` +方案二:提供定制化的接口 +```c++ +void MediaEvent::addPlayerBaseInfo(source_type, ...); +void MediaEvent::addPlayerDemuxerInfo(demuxer_type, ...); +void MediaEvent::addPlayerCodecInfo(video_height, ...); ``` #### 数据结构设计 -这只是草稿, media service event ```plantuml -class MediaItemInfo { - source_type - url - demuxer_type - audio_decoder_type - ... +class MediaEventFactory { + + MediaEvent MediaEventFactory::GetInstance(pid, uid, name) +} + +class MediaEvent { + + void RecordEvent(params); + + void DestroyMediaEvent(); + - void MediaEvent(name); + - void ScheduleUpload(); +} + +struct EventName { + MEDIA_PLAYER; + MEDIA_RECORDER; + MEDIA_RETR8EVER; +} + +class PlayerInfo { + time_stamp : string + source_type : string + url : string + demuxer_type : string + audio_decoder_type : string + bit_rate : int32_t + average_frame_rate : int32_t + video_height : int32_t + video_width : int32_t + play_duration : int32_t + sample_rate : int32_t + channels : int32_t + audio_mime : string + video_mime : string +} + +class RecorderInfo { + time_stamp : string + audio_source_type : string + audio_encoder : string + audio_bit_rate : int32_t + audio_sample_rate : int32_t + audio_channels : int32_t + video_source_type : string + video_encoder : string + recorder_video_width : int32_t + recorder_video_height : int32_t + video_bit_rate : int32_t + video_frame_rate : int32_t + recorder_count : int32_t + output_format : string + recorder_duration : int32_t } -class MSEvent { - app_name : string - event_name : string - media_items : list - result : bool + +class RetrieverInfo { + time_stamp : string + retriever_player_type : string + get_frame_type : string + retriever_count : int32_t + device_model : string + chip_board : string } + +MediaEvent o-down-> PlayerInfo +MediaEvent o-down-> RecorderInfo +MediaEvent o-down-> RetrieverInfo +MediaEvent o-right-> EventName +MediaEventFactory --> MediaEvent: use + ``` 最终效果: 1. 存储了所有内部记录的事件的信息 @@ -45,10 +116,55 @@ class MSEvent { #### 事件上报机制设计 1. 统计事件,如何根据记录的信息,生成事件? ++ 同一个avplayer/avrecorder/retriever会根据pid、uid和name生成唯一的MediaEvent实例,各个关键节点在执行过程中调用MediaEvent的RecordEvent方法,MediaEvent会根据name信息把信息保存到PlayerInfo/RecorderInfo/RetrieverInfo实例中。 ++ 当avplayer/avrecorder/retriever销毁或者所有info收集结束后会尝试把事件通过HiSysEventWrite上报,如果网络等因素无法上报,则保存到本地。 2. 定时上报如何实现。 -3. 对接到 HiSysEvent接口。 - +MediaEvent构造方法中执行定时逻辑,默认为每晚8点上报,**同时需要做离散操作(例如离散19:30-20:30),防止出现浪涌现象。** +```c++ +void MediaEvent::ScheduleUpload(); +``` +3. 对接到 HiSysEvent接口。 +**hisysevent.yaml文件player事件定义** +``` +PLAYER_INFO: + __BASE: {type: BEHAVIOR, level: MINOR, tag: PlayerInfo, desc: player info} + TIME_STAMP: {type: STRING, desc: time stamp} + SOURCE_TYPE: {type: STRING, desc: player source type} + URL: {type: STRING, desc: source url} + DEMUXER_TYPE: {type: STRING, desc: demuxer type} + AUDIO_DECODEC_TYPE: {type: STRING, desc: audio decode type} + BIT_RATE: {type: INT32, desc: bit rate} + AVERAGE_FRAME_RATE: {type: INT32, desc: average frame rate} + VIDEO_HEIGHT: {type: INT32, desc: video height} + VIDEO_WIDTH: {type: INT32, desc: video width} + PLAYER_DURATION: {type: INT32, desc: player duration} + SAMPLE_RATE: {type: INT32, desc: sample rate} + CHANNELS: {type: INT32, desc: channels} + AUDIO_MIME: {type: STRING, desc: audio mime} + VIDEO_MIME: {type: STRING, desc: video mime} +``` +**业务中打点方式** +```c++ +HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::XXX, "PLAYER_INFO", + HiviewDFX::HiSysEvent::EventType::BEHAVIOR, + "TIME_STAMP", xxx, + "SOURCE_TYPE", xxx, + "URL", xxx, + "DEMUXER_TYPE", xxx, + "AUDIO_DECODEC_TYPE", xxx, + "BIT_RATE", xxx, + "AVERAGE_FRAME_RATE", xxx, + "VIDEO_HEIGHT", xxx, + "VIDEO_WIDTH", xxx, + "PLAYER_DURATION", xxx, + "SAMPLE_RATE", xxx, + "CHANNELS", xxx, + "AUDIO_MIME", xxx, + "VIDEO_MIME", xxx); +``` +Domain定义在hisysevent.h中,目前没有player_framework相关的Domain,需要新增。 +注:av_session业务中已经存在类似打点工具avsession_sysevent.h,除了封装HiSysEventWrite立刻打点的接口外,还提供了定制化的接口用来保存事件的参数,每隔一个小时会尝试上报一次事件。 \ No newline at end of file -- Gitee