android html5播放器,android Html5播放器混音解决方案

背景

当一个用户正在听音乐而另一个应用需要通知用户一些重要的事情时,用户可能由于音乐声音大而不能听的通知.从Android2.2开始,平台为应用提供了一个协商它们如何使用设备音频输出的途径,这个机制叫做音频焦点,AudioManager。

当你的应用需要输出像乐音和通知之类的音频时,你应该总是请求音频焦点.一旦应用具有了焦点,它就可以自由的使用音频输出.但它总是应该监听焦点的变化.如果被通知丢失焦点,它应该立即杀死声音或降低到静音水平(有一个标志表明应选择哪一个)并且仅当重新获得焦点后才恢复大声播放。

调研

通过log定位,得出结论:Webview调用的H5播放器的焦点,Android native是会把他当做第三方应用一样处理,简单可以理解为本应用的远程进程。这是根本。

c0c9c3b472b7?from=androidqq

这很重要,这很重要,这很重要!

思考

暂时不考虑,蓝牙,录音,其他语音的问题,先处理混音的问题。

因为音频处理是一个比较复杂的问题,了解的人反而深受苦恼,特别是webview进行加载之后,我当时和leader讨论方案的时候也是从源码着手,发现这个问题还是比较棘手。最后以目的为导向,重新整理了混音问题。

1. 适当场景暂停自己

2. 适当场景暂停别人

忘记那些令人恶心又复杂且睿智的焦点吧,我们只是解决混音正好遇到焦点。

适当场景暂停自己

对于第一个要解决的问题,既然我们是要暂停自己,我们要找到适当的场景,什么时候暂停自己呢?

c0c9c3b472b7?from=androidqq

关键问题让人头大

简单暴力一点,当第三方应用播放音频抢占焦点了,就开始万恶的混音了。根据上述结果,发现H5的焦点Android native是会把他当做第三应用一样处理,简单可以理解本应用的远程进程。

那么暴力的解决方案,当我们永久失去焦点我们就暂停自己。技术实现如下

I. 判断失去焦点

首先,注册一个焦点监听器OnAudioFocusChangeListener 。这个监听器只是处理常用的四种焦点方法,

参数focusChange告诉你音频焦点如何发生了变化,它可以是以上几种值(它们都是定义在AudioManager中的常量):

AUDIOFOCUS_GAIN:你已获得了音频焦点.

AUDIOFOCUS_LOSS:你已经丢失了音频焦点比较长的时间了.你必须停止所有的音频播放.因为预料到你可能很长时间也不能再获音频焦点,所以这里是清理你的资源的好地方.比如,你必须释放MediaPlayer.

AUDIOFOCUS_LOSS_TRANSIENT:你临时性的丢掉了音频焦点,很快就会重新获得.你必须停止所有的音频播放,但是可以保留你的资源,因为你可能很快就能重新获得焦点.

AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:你临时性的丢掉了音频焦点,但是你被允许继续以低音量播放,而不是完全停止.

private AudioManager.OnAudioFocusChangeListener mAudioFocusChangeListener = null;

//Build.VERSION.SDK_INT表示当前SDK的版本, Build.VERSION_CODES.ECLAIR_MR1为SDK 7版本 ,

//因为AudioManager.OnAudioFocusChangeListener在SDK8版本开始才有。

if(Build.VERSION.SDK_INT > Build.VERSION_CODES.ECLAIR_MR1){

mAudioFocusChangeListener = new AudioManager.OnAudioFocusChangeListener() {

@Override

public void onAudioFocusChange(int focusChange) {

if(focusChange == AudioManager.AUDIOFOCUS_LOSS){

//失去焦点之后的操作

}else if(focusChange == AudioManager.AUDIOFOCUS_GAIN){

//获得焦点之后的操作

}

}

};

}

II.请求音频焦点,你必须从AudioManager mAudioMgr 调用requestAudioFocus(),如下所示:

private void requestAudioFocus() {

if(Build.VERSION.SDK_INT <= Build.VERSION_CODES.ECLAIR_MR1){

return;

}

if (mAudioMgr == null)

mAudioMgr = (AudioManager) ApplicationEx.app.getSystemService(Context.AUDIO_SERVICE);

if (mAudioMgr != null) {

DLog.i(TAG, "Request audio focus");

int ret = mAudioMgr.requestAudioFocus(mAudioFocusChangeListener,AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);

if (ret != AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { DLog.i(TAG, "request audio focus fail. " + ret);

}

}

}

暂停H5播放器

Android WebView 中音频关闭问题的解决方法,简单粗暴。

在焦点变化的时候直接调用下面方法。

webView.reload ();

适当场景暂停别人

当H5播放器播放的时候,通过jsbridge先让原生获取焦点 --> Android成功之后,传给H5-->H5调用播放。

c0c9c3b472b7?from=androidqq

功夫是杀人技

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 中实现混音有多种方法,以下是其中的一种简单的方法: 1. 使用 AudioTrack 类来播放音频,可以使用多个 AudioTrack 实例来实现混音。 2. 创建多个 AudioTrack 实例,每个实例代表一个音频流。例如,如果您有两个音频文件,您可以为每个文件创建一个 AudioTrack 实例。 3. 将每个要混合的音频流的数据读入 ByteBuffer 中。 4. 对于每个样本,将所有数据加在一起。 5. 计算加权平均值,以确保混合后的音频不会变得过于嘈杂。 6. 将混合后的数据写入新的 ByteBuffer 中。 7. 使用 AudioTrack 写入混合后的音频数据。 以下是示例代码: ``` // 创建两个 AudioTrack 实例 AudioTrack track1 = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate, AudioFormat.CHANNEL_OUT_STEREO, AudioFormat.ENCODING_PCM_16BIT, bufferSize, AudioTrack.MODE_STREAM); AudioTrack track2 = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate, AudioFormat.CHANNEL_OUT_STEREO, AudioFormat.ENCODING_PCM_16BIT, bufferSize, AudioTrack.MODE_STREAM); // 读取每个音频流的数据 ByteBuffer buffer1 = ByteBuffer.allocate(bufferSize); ByteBuffer buffer2 = ByteBuffer.allocate(bufferSize); track1.read(buffer1, bufferSize, AudioTrack.READ_BLOCKING); track2.read(buffer2, bufferSize, AudioTrack.READ_BLOCKING); // 将数据混合 ByteBuffer mixedBuffer = ByteBuffer.allocate(bufferSize); for (int i = 0; i < bufferSize / 2; i++) { short sample1 = buffer1.getShort(i * 2); short sample2 = buffer2.getShort(i * 2); short mixedSample = (short) ((sample1 + sample2) / 2); mixedBuffer.putShort(i * 2, mixedSample); } // 将混合后的音频写入新的 ByteBuffer 中 byte[] mixedData = mixedBuffer.array(); // 将混合后的音频写入 AudioTrack 实例 track1.write(mixedData, 0, mixedData.length); track2.write(mixedData, 0, mixedData.length); ``` 当然,这只是一个简单示例,实际应用中还需要考虑更多的因素,例如音量平衡、混音算法等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值