1 关键字

3.1Release;播放音频文件

2 问题描述

开发板型号:rk3568

OH版本:OpenHarmony 3.1 Release

问题现象:根据@ohos.multimedia.mediaLibrary模块下的AudioPlayer播放音频文件时,使用AudioPlayer.on('timeUpdate')订阅音频播放进度回调事件,无法正常回调。

3 问题原因

3.1 正常机制

根据@ohos.multimedia.mediaLibrary模块下的AudioPlayer播放音频文件时,当播放进度发生变化,AudioPlayer.on('timeUpdate')正常回调。

3.2 异常机制

根据@ohos.multimedia.mediaLibrary模块下的AudioPlayer播放音频文件时,当播放进度发生变化,AudioPlayer.on('timeUpdate')无法回调。

4 解决方案

修改3.1Release openHarmony源码中相应代码,可以解决此问题。

源码路径:foundation\multimedia\media_standard\frameworks\kitsimpl\js\player\player_callback_napi.cpp

在此文件中找到OnPositionUpdateCb方法,将该方法改成如下代码:

void PlayerCallbackNapi::OnPositionUpdateCb(int32_t postion) const
{
    MEDIA_LOGD("OnPositionUpdateCb is called, postion: %{public}d", postion);
​
    CHECK_AND_RETURN_LOG(timeUpdateCallback_ != nullptr, "Cannot find the reference of timeUpdate callback");
​
    PlayerJsCallback *cb = new(std::nothrow) PlayerJsCallback();
    CHECK_AND_RETURN_LOG(cb != nullptr, "No memory");
    cb->callback = timeUpdateCallback_;
    cb->callbackName = TIME_UPDATE_CALLBACK_NAME;
    cb->valueVec.push_back(position);
    return OnJsCallBack(cb);
}

按照以上步骤修改代码之后,AudioPlayer.on('timeUpdate')可正常回调。

5 定位过程

1.在音频进度变化时,通过日志查到了相关日志信息:“OnPositionUpdateCb is called, postion”,于是根据该日志搜索源码找到相关cpp文件player_callback_napi.cpp的相应方法:OnPositionUpdateCb,发现该方法下只有一行打印日志的代码,并没有实现相应回调逻辑。

2.通过观察发现该cpp文件中已定义音频进度发生变化的相关回调:timeUpdateCallback,因此只需在OnPositionUpdateCb方法中使用timeUpdateCallback 即可实现回调逻辑。

6 知识分享

3.1Release下ohos.multimedia.mediaLibrary模块下的AudioPlayer的音频播放事件实现源码位于foundation\multimedia\media_standard\frameworks\kitsimpl\js\player\player_callback_napi.cpp中。

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐