Exoplayer使用记录4-调节音轨中某个频道的声音

By Xdestiny. 2018/2/5

概述

又是个奇葩需求…有个7.1音轨,想要具体调节其中某个频道的声音。

解决思路

还是上Issue上搜吧…果然有人问过同样的问题
Implement volume controlling AudioProcessor, with independent control of channel volumes
具体来说就是要写一个用于修改单通道声音audioprocessor。需要注意的是,在调用自定义的processor前,exoplayer会先调用一个重采样processor以及一个映射processor。因此自定义处理的均是处理bit16的音频
此外还遇到了个奇怪的问题。由于测试时最后还是通过立体声的形式放出来,同样的代码对于立体声,AAC4.0工作正常,但对于5.1, 7.1就有问题。为此我还提了一个Issue给ExoPlayer。后来发现,再写一个混音器放在后面就OK。当然,如果后面接的直接就是5.1或者7.1的播放设备就得去掉这个混音器了。

具体代码

class MyAudioProcessor: AudioProcessor {private val TAG = "MyAudioProcessor"private var m_channelCnt = Format.NO_VALUEprivate var m_sampleRate = Format.NO_VALUEprivate var m_encoding = C.ENCODING_INVALIDprivate var m_inputEnd = falseprivate var m_buffer: ByteBuffer = EMPTY_BUFFERprivate var m_outputBuffer: ByteBuffer = EMPTY_BUFFERprivate var volume: Array<Float> = Array(8, { _ -> 1.0f}) // 控制具体每个频道的音量大小fun SetVolume(idx: Int, vol: Float){if(idx >= volume.size)throw IllegalArgumentException()volume[idx] = vol}fun GetVolume(idx: Int): Float{if(idx >= volume.size)throw IllegalArgumentException()return volume[idx]}override fun isActive(): Boolean {return m_encoding != C.ENCODING_INVALID}override fun queueEndOfStream() {m_inputEnd = true}override fun configure(sampleRateHz: Int, channelCount: Int, encoding: Int): Boolean {Log.d(TAG, "channel cnt = $channelCount")m_channelCnt = channelCountm_sampleRate = sampleRateHzm_encoding = encodingreturn true}override fun getOutputEncoding(): Int {return m_encoding}override fun flush() {m_outputBuffer = EMPTY_BUFFERm_inputEnd = false}override fun queueInput(buffer: ByteBuffer) {//最后只输出立体声混音结果var position = buffer.position()val limit = buffer.limit()val size = limit - positionif (m_buffer.capacity() < size)m_buffer = ByteBuffer.allocateDirect(size).order(ByteOrder.nativeOrder())elsem_buffer.clear()when(m_encoding){C.ENCODING_PCM_16BIT->{while(position < limit){var retL = 0.0fvar retR = 0.0ffor(i in 0..m_channelCnt - 1){if(i%2 == 0)retL += buffer.getShort(position + i * 2) * volume[i]elseretR += buffer.getShort(position + i * 2) * volume[i]}position += m_channelCnt * 2m_buffer.putShort((retL / m_channelCnt).toShort())m_buffer.putShort((retR / m_channelCnt).toShort())}}else->{throw IllegalStateException()}}buffer.position(limit)m_buffer.flip()m_outputBuffer = m_buffer}override fun isEnded(): Boolean {return m_inputEnd && m_outputBuffer === AudioProcessor.EMPTY_BUFFER}override fun getOutput(): ByteBuffer {val outputBuffer = m_outputBufferm_outputBuffer = EMPTY_BUFFERreturn outputBuffer}override fun reset() {flush()m_buffer = AudioProcessor.EMPTY_BUFFERm_sampleRate = Format.NO_VALUEm_channelCnt = Format.NO_VALUEm_encoding = C.ENCODING_INVALID}override fun getOutputChannelCount(): Int {//最后只输出立体声混音结果return 2}
}

Exoplayer使用记录4-调节音轨中某个频道的声音相关推荐

  1. linux用户在哪个文件夹,LINUX中用命令成功建立一个用户后信息会记录在哪个文件中...

    LINUX中用命令成功建立一个用户后信息会记录在哪个文件中 发布时间:2007-07-28 10:14:57来源:红联作者:MPiops 增加用户帐号后 新建用户的命令十分简单,在命令行下使用 use ...

  2. 【错误记录】Visual Studio 中配置 NDK 头文件路径 ( NDK 的三个头文件路径 | 与 CPU 架构相关 asm 头文件路径选择 )

    文章目录 一.报错信息 二.解决方案 1.NDK 的三个头文件路径 2.与 CPU 架构相关 asm 头文件路径选择 一.报错信息 参考 [Android 逆向]Android 进程注入工具开发 ( ...

  3. 记录:Ubuntu20.04中安装和设置VScode

    记录:Ubuntu20.04中安装和设置VScode 一.VScode的安装 1 从VS官网中下载deb文件:https://code.visualstudio.com/Download 下载的deb ...

  4. Android记录15--关于ListView中adapter调用notifyDataSetChanged无效的原因

    Android记录15--关于ListView中adapter调用notifyDataSetChanged无效的原因 2014年1月16日 开发记录 话说这个问题已经困扰我很久了,一直找不到原因,我以 ...

  5. 37.某学生的记录由学号、8门课程成绩和平均分组成,学号和8门课程的成绩已在主函数中给出。请编写函数fun,它的功能是:求出该学生的平均分放在记录的ave成员中。请自己定义正确的形参。

    37.某学生的记录由学号.8门课程成绩和平均分组成,学号和8门课程的成绩已在主函数中给出.请编写函数fun,它的功能是:求出该学生的平均分放在记录的ave成员中.请自己定义正确的形参. 例如,若学生的 ...

  6. C语言编程>第十一周 ⑥ 某学生的记录由学号、5门课程成绩和平均分组成,学号和5门课程的成绩已在主函数中给出。请编写函数fun,它的功能是:求出该学生的平均分,并放在记录的ave成员中。

    例题:某学生的记录由学号.5门课程成绩和平均分组成,学号和5门课程的成绩已在主函数中给出.请编写函数fun,它的功能是:求出该学生的平均分,并放在记录的ave成员中.请自己定义正确的形参.. 例如,若 ...

  7. 某学生的记录由学号、5门课程成绩和平均分组成,学号和5门课程的成绩已在主函数中给出。请编写函数fun,它的功能是:求出该学生的平均分,并放在记录的ave成员中。

    例题:某学生的记录由学号.5门课程成绩和平均分组成,学号和5门课程的成绩已在主函数中给出.请编写函数fun,它的功能是:求出该学生的平均分,并放在记录的ave成员中.请自己定义正确的形参.. 例如,若 ...

  8. Android记录23-关于actionbar中overflow menu(溢出菜单)中的一些问题

    Android记录23-关于actionbar中overflow menu(溢出菜单)中的一些问题 前言 本篇博客记录一下小巫在使用actionbar的时候遇到关于溢出菜单的一些问题: 什么是Over ...

  9. Android记录22-关于开发中账号绑定的逻辑处理

    Android记录22-关于开发中账号绑定的逻辑处理  转载请注明:IT_xiao小巫    博客地址:http://blog.csdn.net/wwj_748 前言 本篇博客要跟大家分享的是开发中我 ...

最新文章

  1. 聊一聊深度学习的activation function
  2. 关于linkedin的network的观察和自己的职业道路的追求
  3. List的遍历 Java
  4. 到无限(溪流)和超越!
  5. 一个从文本文件里“查找并替换”的功能
  6. python 散点图 不同颜色_python – pandas – 每个点都有不同颜色图例的散点图
  7. 不同管理岗层级的团队影响力_高影响力团队的最高要求
  8. 有趣的JS 一行代码 偷取所有图片
  9. 面向对象2(待补充)
  10. Java基础学习总结(81)——如何尽可能的减少Java代码中bug
  11. 拯救万千学子于水深火热之中!Facebook开源无梯度优化工具
  12. atitit 国家与社区发展战略研究attilax 总结 v2 .docx
  13. java俄罗斯方块代码_java俄罗斯方块代码.doc
  14. Redis与数据库数据同步解决方案
  15. 《实用python程序设计》练习题:向量点积计算
  16. TVB十大女星比美十大名花
  17. 找到一个数组对象中 '某某某(属性名)'为 ['某某','某某']的值
  18. unity 模拟水下场景 水下冒泡
  19. 【项目实战二】基于模板匹配和形态学操作的信用卡卡号识别(OpenCV+Python)
  20. 美团校招题 小团的装饰物

热门文章

  1. MT5,MT5软件,MT5源码,MT5主标搭建,MT5主标申请,MT5海外版,MT4海外版
  2. Simulink仿真入门到精通(四) Simulink子系统
  3. 解决Mac上微信\QQ无法截图的问题?
  4. P3375 【模板】KMP字符串匹配(woc我太想她了)
  5. 企业即时通讯需要哪些功能?如何快速实现即时通讯
  6. 在html里面处理菱形元素的各种情况
  7. 全国计算机能力挑战赛练习题
  8. 微信小程序 - 页面背景音乐播放器控件(音乐盒图标旋转 360° 动画且可点击暂停与播放)
  9. ERA5-land数据NC转tif,然后按照经纬度提取数据——基于R
  10. 计算机应用word单元测试,[高职统考}计算机应用基础word2003单元测试题(3)