• UE4 Android端使用MediaPlayer注意事项



    前言

    UE4中播放音频通常使用AudioComponent、MediaSoundComponent(需要挂载MediaPlayer);
    前者可播放本地音频资源(eg. cue、wave),后者可播放本地指定路径或在线音频资源等(eg. OpenFile、OpenUrl)。
    本文主要介绍在安卓端使用MediaSound播放在线音频需要注意的问题。


    一、音量设置无效?

    MediaSound(MediaPlayer)组件设置音量接口有’SetVolumeMultiplier’和SetNativeVolume;
    如果使用MediaSoundComp:SetVolumeMultiplier设置音量,则在Android下无效;
    反之使用MediaPlayerComp:SetNativeVolume设置,则在Window下无效;
    所以针对不同平台需要使用对应的接口设置。
    设置音量蓝图示例

    二、应用休眠恢复后播放中断

    播放过程应用切换到后台后重新切回,之前播放的音频中断不会继续播放。

    1.原因

    当应用挂起的时候,会将MediaPlayer暂停。
    引擎代码如下,HandleApplicationHasEnteredForeground可看作Android的OnResume, HandleApplicationWillEnterBackground看作OnPause;
    但此处我有点不理解,它是在OnResume的时候将其暂停,OnPause时Start?总感觉这两个设定相反了,或者安卓的机制就是这样设定也可有可能。有了解的朋友欢迎指正!

    // 代码文件路径 \UE_4.26\Engine\Plugins\Media\AndroidMedia\Source\AndroidMedia\Private\Player\AndroidMediaPlayer.cpp
    
    /* FAndroidMediaPlasoundyer callbacks
     *****************************************************************************/
    
    void FAndroidMediaPlayer::HandleApplicationHasEnteredForeground()
    {
    	// check state in case changed before ticked
    	if ((CurrentState == EMediaState::Playing) && JavaMediaPlayer.IsValid())
    	{
    		JavaMediaPlayer->Pause();
    	}
    }
    
    
    void FAndroidMediaPlayer::HandleApplicationWillEnterBackground()
    {
    	// check state in case changed before ticked
    	if ((CurrentState == EMediaState::Playing) && JavaMediaPlayer.IsValid())
    	{
    		JavaMediaPlayer->Start();
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    2.解决方案

    监测应用状态,当应用挂起又重新激活后,及进入OnResume时,再主动调用继续播放接口进行播放。UE4已经提供安卓端应用状态监听组件‘Application Lifecycle’,响应Actor添加改组件接口监听OnPause、OnResume等事件。
    示例如下:
    图片

    ~ 小尾巴 ~
    文章内容有错误、理解不到位以及有更优方案,欢迎指正 补充 讨论!!! 
    
    • 1
    • 2
  • 相关阅读:
    【无标题】
    黑豹程序员-放大招-架构师学习路线图
    STL-list
    PTL货位指引标签为仓储管理打开新思路
    AI从入门到精通,什么是LLMs大型语言模型?
    Visual Studio 2017 安装
    创建node、vue、以及@vuecli 和 vue-cli 的区别
    强制解决Java参数乱码问题
    索尼PS5 Pro将搭载RDNA 3定制GPU 拥有30个WGP/60个CU,频率更高
    React中this.setState方法原理解析(详解)
  • 原文地址:https://blog.csdn.net/boonti/article/details/125460030