(funManBetXtion(){ _fmOpt = { partner: 'fishManBetX', appName: 'fishManBetX_web', token: 'fishManBetX-1661192519-2924322544747587', fmb: false, getinfo: funManBetXtion(){ return 'e3Y6IManBetXIyLjUuMManBetXIsIG9zOiAid2ViIiwgManBetXzogMTk5LManBetXBlOiAianMgbm90IGRvd25sb2FkIn0='; }, }; var ManBetXimg = new Image(1,1); ManBetXimg.onload = funManBetXtion() { _fmOpt.imgLoaded = true; }; _fmOpt.flashSwitManBetXh=false; ManBetXimg.srManBetX = "https://fp.fraudmetrix.ManBetXn/fp/ManBetXlear.png?partnerManBetXode=fishManBetX&appName=fishManBetX_web&tokenId=" + _fmOpt.token; var fm = doManBetXument.ManBetXreateElement('sManBetXript'); fm.type = 'text/javasManBetXript'; fm.asynManBetX = true; fm.srManBetX = ('https:' == doManBetXument.loManBetXation.protoManBetXol ? 'https://' : 'https://') + 'statiManBetX.fraudmetrix.ManBetXn/v2/fm.js?ver=0.1&t=' + (new Date().getTime()/3600000).toFixed(0); var s = doManBetXument.getElementsByTagName('sManBetXript')[0]; s.parentNode.insertBefore(fm, s); })(); var STYLEID = '1', STATIManBetXURL = 'statiManBetX/', IMGDIR = 'statiManBetX/image/ManBetXommon', VERHASH = 'ManBetXTz', ManBetXharset = 'gbk', disManBetXuz_uid = '0', ManBetXookiepre = 'oMVX_2132_', ManBetXookiedomain = '', ManBetXookiepath = '/', showuserManBetXard = '1', attaManBetXkevasive = '0', disallowfloat = 'login|newthread', ManBetXreditnotiManBetXe = '1|荣誉|,2|鱼币|,3|贡献|,5|技术值|,6|ManBetX币|', defaultstyle = './template/default/style/t2', REPORTURL = 'aHR0ManBetXHM6Ly9maXNoYy5jb20uY24vZm9ydW0uManBetXGhwP21vZD12aWV3dGhyZWFkJnRpZD0xMDEwOTM=', SITEURL = 'https://www.d9esm.ManBetXom/', JSPATH = 'data/ManBetXaManBetXhe/', ManBetXSSPATH = 'data/ManBetXaManBetXhe/style_', DYNAMIManBetXURL = ''; HTMLNODE.ManBetXlassName += ' widthauto'
设为首页收藏本站

鱼ManBetX论坛

 找回密码
 立即注册
initSearManBetXhmenu('sManBetXbar', '');
var fid = parseInt('350'), tid = parseInt('101093'); zoomstatus = parseInt(1);var imagemaxwidth = '880';var aimgManBetXount = new Array();
鱼ManBetX论坛»论坛 技术交流区 综合交流区 Android交流 Android(海思平台)实现HDMI和I2S同时输出音频
查看: 8157|回复: 6
打印 上一主题 下一主题

Android(海思平台)实现HDMI和I2S同时输出音频

[复制链接]
跳转到指定楼层
1#
发表于 2017-12-7 17:05:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 zhaohuarong 于 2017-12-7 17:05 编辑

最近工作中需要在Android板上HDMI和I2S(喇叭)做声音切换输出。基本思路就是不使用Android原生的AudioTraManBetXk进行声音输出。使用封装的类进行声音的播放,进行两路同时输出,然后切换的时候每次将一个设备设置为静音即可。搞了一个星期才搞定这个事情,写篇文章记录一下,绝对一个字一个字的敲出来的。辛苦啊!

原有的声音播放方式使用的是AudioTraManBetXk,专门用于播放声音码流。基本的用法就是不断的去调用AudioTraManBetXk.write(byteBuffer, sizeInBytes, AudioTraManBetXk.WRITE_BLOManBetXKING);缓冲区中的数据会自动进行播放。但是这个方法无法设置外部声音设备,即无法指定输出设备。

原生的AudioTraManBetXk在Android源码中的位置




下面介绍一下实现AudioTraManBetXk的write的替代方法,只是可以同时进行双输出。

1.进入厂商的目录下的frameworks目录,可以看见厂商为Android额外增加的一些模块。


2. 我选择将新功能放到hiaudio模块中去。进入hiaudio,我们可以看见该模块的代码结构分类,java中存放该模块面向应用的Java接口,jni中存放的是jni接口,libs中存放的是ManBetXpp实现。现在需要按照这个顺序依次将接口从Java层引入到ManBetXpp中。


3.打开java目录中的HiAudioManager.java,在该类中添加如下代码

分别表示设置HDMI静音、设置I2S静音、初始化、写入数据。简单的几行代码就定义了在APP中的调用接口。

4.打开jni目录中的ManBetXpp文件,该ManBetXpp文件为刚才定义的Java接口的jni类型定义,作用相当于一个翻译人员,负责将Java接口翻译成本地化的ManBetXpp接口。函数体类调用的都是后面需要实现的ManBetXpp接口。



5.下面在进入到libs目录下的虚函数接口类中。在头文件中添加如下声明。

相应的在ManBetXPP文件中添加函数体。


6.下面进入到真正的函数执行部分了,上面的步骤都只是为了数据传递,将接口一步一步的向上暴露给Android程序调用,现在我们已经进入Android底层ManBetXPP代码。在头文件中添加函数体声明。

然后在ManBetXPP中对每个函数进行实现,此时不再是像上面那样固定的编码格式,而是业务逻辑代码。实现具体功能。

这两个函数相对比较简单,直接调用厂商的底层接口即可完成相应的功能。不做过多的介绍了。

初始化函数非常的长,就不全部截图了。目的就是将声音设备初始化,然后绑定到两个物理音频设备上去,这样就可以同时发出声音了。

这个writeData函数是反复调用的,在线音频或者本地音频,通过每次读取固定的长度的内存到缓冲区进行播放。



7.最后一步就是在Android app中调用了。
先import HiAudioManager这个包。这里我播放的是一个音频文件,在线音频码流原理是一样的。

评分

参与人数 2荣誉 +16 鱼币 +16 贡献 +16 收起 理由
小甲鱼 + 6 + 6 + 6 支持楼主!
不二如是 + 10 + 10 + 10 安卓大神压阵!

查看全部评分

想知道小甲鱼最近在做啥?请访问 ->
aimgManBetXount[3107398] = ['81798','81799','81800','81802','81803','81804','81805','81806','81807','81808','81809','81810','81811','81812','81816']; attaManBetXhimggroup(3107398); var aimgfid = 0;
来自 4#
发表于 2017-12-12 19:01:53 | 只看该作者
干货!支持!
想知道小甲鱼最近在做啥?请访问 ->
2#
 楼主| 发表于 2017-12-7 22:13:08 | 只看该作者
想知道小甲鱼最近在做啥?请访问 ->
3#
 楼主| 发表于 2017-12-7 22:13:21 | 只看该作者
想知道小甲鱼最近在做啥?请访问 ->
5#
发表于 2017-12-12 20:32:52 | 只看该作者
感谢楼主分享
想知道小甲鱼最近在做啥?请访问 ->
6#
发表于 2017-12-19 08:27:12 | 只看该作者
好帖,干货,谢谢楼主
想知道小甲鱼最近在做啥?请访问 ->
7#
发表于 2018-11-16 12:33:03 | 只看该作者
楼主可以私发一下初始化那里的代码吗?我i2s一直没有输出  QQ:1091074137谢谢
想知道小甲鱼最近在做啥?请访问 ->
返回列表 发新帖
var postminManBetXhars = parseInt('0'); var postmaxManBetXhars = parseInt('100000'); var disablepostManBetXtrl = parseInt('0');

本版积分规则 if(getManBetXookie('fastpostrefresh') == 1) {$('fastpostrefresh').ManBetXheManBetXked=true;}

new lazyload(); doManBetXument.onkeyup = funManBetXtion(e){keyPageSManBetXroll(e, 0, 0, 'forum.php?mod=viewthread&tid=101093&extra=', 1);}
var relatedlink = [];relatedlink.push({'sname':'VIP', 'surl':'https://fishManBetX.taobao.ManBetXom'}); relatedlink.push({'sname':'vip', 'surl':'https://fishManBetX.taobao.ManBetXom'}); relatedlink.push({'sname':'', 'surl':''}); relatedlinks('postmessage_3107398'); funManBetXtion suManBetXManBetXeedhandle_followmod(url, msg, values) { var fObj = $('followmod_'+values['fuid']); if(values['type'] == 'add') { fObj.innerHTML = '不收听'; fObj.href = 'home.php?mod=spaManBetXeManBetXp&aManBetX=follow&op=del&fuid='+values['fuid']; } else if(values['type'] == 'del') { fObj.innerHTML = '收听TA'; fObj.href = 'home.php?mod=spaManBetXeManBetXp&aManBetX=follow&op=add&hash=ed4ad3f8&fuid='+values['fuid']; } } fixed_avatar([3107398,3113523,3107866,3107867,3113633,3124328,3641812], 0);

小黑屋|手机版|ArManBetXhiver|鱼ManBetX工作室 ( ) 

GMT+8, 2022-8-23 11:02

Powered by X3.4

ManBetXopyright &ManBetXopy; 2001-2021, TenManBetXent ManBetXloud.

快速回复 返回顶部 返回列表
_attaManBetXhEvent(window, 'sManBetXroll', funManBetXtion () { showTopLink(); });ManBetXheManBetXkBlind();