扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
最近需要在Android的客户端中使用PCM声音播放和录制,简单学习了一下。有不正确的地方还请指出。
创新互联专注于企业成都全网营销、网站重做改版、来宾网站定制设计、自适应品牌网站建设、HTML5、商城建设、集团公司官网建设、成都外贸网站建设、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为来宾等各大城市提供网站开发制作服务。
首先有几个概念需要了解一下:采样频率、声道数、采样位数。
采样频率一般是sample rate, 代表的是数字化音频时每秒采样的次数。常见的有44.1KHz(CD品质)、48KHz等。
这个很好理解,单声道Mono就是声音从一个方向传出来;双声道Stereo也叫立体声,声音是从两个方向传来。通常的流行音乐中,仔细听能发现每个声道可能侧重不同的乐曲声部,比如左声道吉他,右声道钢琴,人声似乎两个声道都有,听起来就像站在中间一样。(这里没有考证,随便举例)
每一个采样都是一个数据点,采样位数是指这个数据点使用了几位来记录。AudioTrack类只支持8位和16位的PCM音频。8位就是2的8次方,即256个值;而16位则是2的16次方,有65536个值。
这个在音频的编解码中还是比较常用的。在PCM格式中,1秒钟音频的数据大小是SampleRate×Channel×Bit/8,单位是byte字节。由于PCM本身没有音频帧的概念,所以通过这个公式就能计算出任意时长音频的大小,或者得到任意大小音频的时长。如果规定1个音频帧是“每个声道256个采样”,双声道下就是512个采样,那么1帧的数据量就是256×Channel×Bit/8,同理可以推断出1秒钟有多少音频帧等等。音频帧的概念在各种编解码中各有不同,但计算公式大同小异,这里不展开。
Android中音频的播放使用的是AudioTrack类,具体用法非常简单。
首先设置buffer大小。AudioTrack播放时需要先写入buffer,如果这个buffer没有写满,那么这部分是不会播放的。所以buffer不能设置太小,这样会导致播放不连贯;而buffer也不能设置太小,这样不间断写入会消耗许多CPU资源。AudioTrack自带了getMinBufferSize方法可以给出一个最小buffer,一般用这个值就可以。getMinBufferSize方法三个参数分别是sample rate、channel和bit。
设置完buffer size就可以实例化一个AudioTrack。其中第一个参数streamType是指不同的音频流类型,包括STREAM_MUSIC、STREAM_ALARM、STREAM_VOICE_CALL、STREAM_RING等,是Android对不同音频的分类。中间三个参数很好理解,第四个是buffer size,刚刚计算出来了。最后一个参数mode有两种:MODE_STREAM和MODE_STATIC。前者是以流形式播放,后者则是一次性全部写入然后播放。
调用实例的play()方法就可以开始播放了。不过播放得要有数据吧?要填写数据就要用到write()方法。write方法中第一个参数是一个byte[]类型,是要写入的数据源,可以是从文件流中读取出来的;第二个参数offset是初始位移,即从source的哪个位置开始;第三个参数则是输入长度。
当write方法写满一个AudioTrack的buffer时,就会有声音播放出来了。
当播放完成后记得要把AudioTrack停止并释放。
如果您使用的是华为手机,手机外放无声音,可以通过以下方法进行排查处理:
1,查看手机是否显示耳机图标
如果手机未插入耳机,仍显示耳机图标,会导致手机外放无声,出现该现象的原因有多种可能为进入液体、受潮、进灰等情况或者耳机是否标配都可能会影响到耳机孔功能。您可以按照以下方法尝试解决:
(1)、请尝试插拔一次耳机或重启手机进行尝试
(2)、如果耳机孔有入液、进灰等情况,请尝试清理。
(3)、如果您的手机显示仍然异常,请您,提前备份好数据(QQ,微信等第三方应用需单独备份)、携带相关购机凭证,前往附近的华为客户服务中心,获取更多帮助
2,确保喇叭没有被遮挡
3,重启手机或更换播放音源后尝试;
4,获取更多帮助
如果您的手机外放仍然异常,请您提前备份好数据(QQ,微信等第三方应用需单独备份)、携带相关购机凭证,前往附近的华为客户服务中心,获取更多帮助
相关链接如下;客户服务中心预约服务维修备件价格查询寄修服务
若使用的是vivo手机,可参考设置输入法按键振动方法:
百度输入法定制版:进入设置--系统管理--输入法--百度输入法定制版--键盘界面设置--按键反馈,根据您的需要调整振动大小即可;
搜狗输入法定制版/vivo输入版:进入设置--系统管理/更多设置--输入法--搜狗输入法定制版/vivo输入法--键盘设置--按键反馈,根据您的需要调整振动大小即可。
Android中手机声音调节步骤:
a、通过系统服务获得声音管理器:
AudioManager audioManager = (AudioManager)getSystemService(Service.AUDIO_SERVICE);
b、根据实际需要调用适当的方法:(常用方法)
audioManager.adjustStreamVolume(int streamType, int direction, int flags);
streamType:声音类型,可取的为STREAM_VOICE_CALL(打电话时的声音), STREAM_SYSTEM(Android系统声音), STREAM_RING(电话铃响), STREAM_MUSIC(音乐声音)or STREAM_ALARM(警告声音)。
direction:调整音量的方向,可取为ADJUST_LOWER(调低音量), ADJUST_RAISE(调高音量), or ADJUST_SAME(保持先前音量)。
flags:可选标志位(如要显示出音量调节UI,使用如下flag:AudioManager.FLAG_SHOW_UI)。
audioManager.setStreamMute(int streamType, boolean state);设置指定声音类型(streamType)是否为静音。如果state为true,则设置为静音;否则,不设置为静音。
audioManager.setRingerMode(int ringerMode);
设置铃音模式,可取值为RINGER_MODE_NORMAL(铃音正常模式), RINGER_MODE_SILENT(铃音静音模式), or RINGER_MODE_VIBRATE(铃音震动模式,即铃音为静音,启动震动)。
audioManager.setMode(int mode);
设置声音模式,可取值为MODE_NORMAL(正常模式,即在没有铃音与电话的情况), MODE_RINGTONE(铃响模式), MODE_IN_CALL(接通电话模式)or MODE_IN_COMMUNICATION(通话模式)。
注意:声音的调节是没有权限要求的。
若使用的是vivo手机,可参考以下方法:
设置系统铃声的方法:
进入设置--声音与振动/声音、振动与静音键/声音--可设置来电铃声、信息铃声、日历提醒铃声、通知铃声、闹钟铃声等。
自定义铃声设置方法:
1、进入设置--声音与振动/声音、振动与静音键/声音--来电铃声--自定义铃声,选择本地歌曲,也可在选择歌曲后点击右上角剪辑,自由截取歌曲片段设置为来电铃声。
2、进入i音乐中,在音乐播放列表中选择歌曲--点击“...”--选择铃声彩铃--截取片段后--设为铃声。目前支持铃声制作的格式:MP3和WAV,付费或会员歌曲暂不支持设置铃声(制作好的铃声保存在文件管理的“制作铃声”文件夹中)
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流