SoundPool.Builder spb = new SoundPool.Builder();
SoundPool soundPool = spb.build(); //创建SoundPool对象SoundPool.Builder spb = new SoundPool.Builder();
spb.setMaxStreams(15); //但是不建议将这个值设置的较大,较大会占用比较大的内存空间的。SoundPool.Builder spb = new SoundPool.Builder();
AudioAttributes mAudioAttributes = new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_GAME).build();
spb.setAudioAttributes(attrBuilder.build());AudioAttributes.USAGE_UNKNOWN://用法未知时要使用的用法值。也就是这个音频预期用途不属于以下定义的
AudioAttributes.USAGE_MEDIA: //当用途为媒体(如音乐或电影配乐)时要使用的用途值。
AudioAttributes.USAGE_VOICE_COMMUNICATION: //当使用是语音通信(如电话或VoIP)时要使用的使用值。
AudioAttributes.USAGE_VOICE_COMMUNICATION_SIGNALLING://在呼叫信号中使用时使用的用法值,例如“忙碌”的嘟嘟声或DTMF音调。
AudioAttributes.USAGE_ALARM: //当使用是警报(例如唤醒警报)时要使用的使用值。
AudioAttributes.USAGE_NOTIFICATION://使用情况为通知时要使用的使用情况值。
AudioAttributes.USAGE_NOTIFICATION_RINGTONE://当使用是电话铃声时要使用的使用值。
AudioAttributes.USAGE_NOTIFICATION_COMMUNICATION_REQUEST: //当使用是请求进入/结束通信(如VoIP通信或视频会议)时要使用的使用值。
AudioAttributes.USAGE_NOTIFICATION_COMMUNICATION_INSTANT://当使用是“即时”通信(如聊天或短信)的通知时使用的使用值。
AudioAttributes.USAGE_NOTIFICATION_COMMUNICATION_DELAYED://当用途是通知非即时类型的通信(如电子邮件)时要使用的用途值。
AudioAttributes.USAGE_NOTIFICATION_EVENT: //当使用是为了吸引用户的注意力时要使用的使用值,例如提醒或电池电量不足警告。
AudioAttributes.USAGE_ASSISTANCE_ACCESSIBILITY: //用于辅助功能时要使用的用法值,例如用于屏幕阅读器。
AudioAttributes.USAGE_ASSISTANCE_NAVIGATION_GUIDANCE: //当用途是驾驶或导航方向时要使用的用途值。
AudioAttributes.USAGE_ASSISTANCE_SONIFICATION: //当使用是声音处理时要使用的使用值,例如用户界面声音。
AudioAttributes.USAGE_GAME: //用于游戏音频时要使用的用法值。
AudioAttributes.USAGE_VIRTUAL_SOURCE: //用于虚拟资源生产时的用途值。
AudioAttributes.USAGE_ASSISTANT://用于对用户查询、音频指令或帮助话语的音频响应的用法值。AudioAttributes.Builder attrBuilder = new AudioAttributes.Builder();
attrBuilder.setUsage(AudioAttributes.USAGE_GAME);PS1:这个Usage用途值是用来告诉系统,我们这个音频文件是属于什么类型的。 如果关注过手机音量设置,就会知道我们可以针对通知,闹钟,音乐,视频游戏,通话等不同场景设置相关音量。这个用途决定了我们的音频文件会被系统哪个音量设置进行控制。PS2:这也就是为啥有些app中的音效在手机媒体音效都禁音了,还在播放。因为它可能将声音的用途标注为了通知铃声等。首次启动SoundPool进行播放音频时,没有配置Usage参数值,这个时候程序触发了系统提示音的播放。那么我们的SoundPool调用load()就会得到返回值为0。音频加载失败。AudioAttributes 类除了上面的声音用途(Usage)以外。还有一些其他方法:
AudioAttributes.Builder attrBuilder = new AudioAttributes.Builder();
attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC);官方注释中,建议我们少使用该方法,而应该通过setUsage,setContentType等方法明确设置音频的用法和内容类型等信息。由于会覆盖我们配置的Usage,ContentType,Flage,HapticChannelsMuted等方法值。所以如果使用setLegacyStreamType 就不要使用上面的配置音频相关信息的方法。因为setLegacyStreamType优先级高,会覆盖掉我们配置的信息。该方法的建议传参有6个值:但是首先会先从历史痕迹中获取信息,获取不到的才会按照下面的配置项进行默认初始化。
soundPool.load(this, R.raw.drill,1);AssetFileDescriptor descriptor = null;
try {
descriptor = am.openFd("sound/zinyan.mp3");
} catch (IOException e) {
e.printStackTrace();
}
if(descriptor!=null){
soundPool.load(descriptor, 1);
}soundPool.load("本地文件路径", 1);PS:常见应用是将部分音频存储在assets目录或者raw目录下。而如果是有比较多音效,那需要进行在线下载后调用FileDescripor进行加载。当我们使用load()进行加载音频时,如果音频文件正确那么就会返回一个id。该值为sound Id。如果是错误会返回0。代表我们的音频文件并没有被转为PCM流。在这里我们需要注意一下,SoundID只是以下两个方法才会使用到。
soundPool.play(soundId,1,1,1,0,1f)
soundPool.stop(soundId);PS:soundId 和streamID并不是同一个值,虽然我们打印输出的时候可能都显示的一样的数。但是并不能代表两个是一致的。如果你确保该音频文件是一个比较高频使用的音频,那么可以在初始化的时候批量调用load()方法进行预加载。之后在需要播放的地方,直接调用soundPool.play 传递该soundId就可以了。在实际使用中,提取音频文件到内存。然后可以进行play播放,中间的耗时是非常短的。但是,我们任然不能直接就执行play播放,因为时间再短它也是有耗时的。如果没有加载完成就播放,是没有声音的
//加载完毕,执行音频播放
soundPool.setOnLoadCompleteListener((soundPool, sampleId, status) -> {
Log.e("onLoadComplete", "音频加载状态(0表示加载成功):" + status);
int streamID = soundPool.play(soundId, 1, 1, 1, 0, 1f);
});soundPool.play(int soundID, float leftVolume, float rightVolume,
int priority, int loop, float rate)int streamId = soundPool.play(soundId, 1, 1, 1, 0, 1f);
soundPool.setLoop(streamId,1); //循环一次
soundPool.setVolume(streamId,1,1);
soundPool.setPriority(streamId,1);
soundPool.setRate(streamId,1f);相较于MediaPlayer。SoundPool因为针对的都是一些快速简单的音效。所以是没有音频播放结束的回调方法的。我们如果自己想知道音频播放完毕,可以自己写一个时间线程,线程结束后就当音频已经播放完毕了吧。虽然没有音频结束的监听。但是我们可以针对音频做停止,暂停和恢复等操作。
soundPool.stop(streamId);//停止
soundPool.pause(streamId);//暂停
soundPool.resume(streamId);//恢复soundPool.autoPause(); //批量暂停
soundPool.autoResume(); //批量恢复请注意:当我们调用音频的stop()方法时,只是将音频流给回收了,也就是streamId失效了。但是soundId还是生效状态,也就是说load()方法加载到内存中的资源是并没有被释放的。释放资源有两种方法,释放某个音频:
soundPool.unload(soundId);//移除指定的加载的的音频文件soundPool.release();
soundPool = null;我一直在寻找一种以编程方式或通过命令行将mp3转换为aac的方法,但没有成功。理想情况下,我有一段代码可以从我的Rails应用程序中调用,将mp3转换为aac。我安装了ffmpeg和libfaac,并能够使用以下命令创建aac文件:ffmpeg-itest.mp3-acodeclibfaac-ab163840dest.aac当我将输出文件的名称更改为dest.m4a时,它无法在iTunes中播放。谢谢! 最佳答案 FFmpeg提供AAC编码功能(如果您已编译它们)。如果您使用的是Windows,则可以从here获取完整的二进制文件。
我如何用ruby编写一个脚本,当从命令行执行时播放mp3文件(背景音乐)?我试过了run="mplayer#{"/Users/bhushan/resume/m.mp3"}-aosdl-vox11-framedrop-cache16384-cache-min20/100"system(run)但它也不起作用,以上是播放器特定的。如果用户没有安装mplayer怎么办。有没有更好的办法? 最佳答案 我一般都是这样pid=fork{exec'mpg123','-q',file} 关于ruby
这是2009年,早在2001年左右,ruby中的声音播放就没有好的绑定(bind)。有变化吗?我正在寻找可以控制原始声音或mp3、ogg和flac播放的东西。我的谷歌搜索已经枯竭。编辑:Linux、OSX,如果可能的话还有Windows。 最佳答案 您没有提到平台。Thispage描述了win32-sound库,它似乎至少支持WAV播放。对于一个更加平台中立的方式,Ruby/SDL为广受欢迎的SDL提供绑定(bind)图书馆。 关于ruby声音播放,我们在StackOverflow上找到
往期周报汇总地址:嵌入式周报-uCOS&uCGUI&emWin&embOS&TouchGFX&ThreadX-硬汉嵌入式论坛-PoweredbyDiscuz! 祝大家开工大吉视频版:https://www.bilibili.com/video/BV1GT411o7zr1、ThreadX老大离开微软,开发的第5代RTOS系统PX5RTOS正式上线最早是看到IAR的一条消息,全面支持PX5RTOS,然后就进一步上他们的官方下载白皮书了解相关消息当看到这两个名字时,很熟悉,这不就是ThreadX的老大BillLamie。 经过信息检索,应该是实锤了,领英上已经更新了他的工作经历: 然后再结合Azur
我有这个简单的代码来获取视频流block并在MediaSource中播放它们。我看到视频,但有时它会停止。它可能会工作几秒钟或几分钟。但最后它在某个时刻停止了。chrome://media-internals/显示没有错误。这里有什么问题吗?navigator.getUserMedia=navigator.getUserMedia||navigator.webkitGetUserMedia||navigator.mozGetUserMedia||navigator.msGetUserMedia;varmediaSource=newMediaSource();varconstraints
首先,很抱歉在这里重新提出这个问题。我已经尝试了两天如何使用javascript/jquery完成这项工作,我想我已经阅读了所有堆栈溢出和其他关于此的博客文章,所以请不要将其标记为重复,因为我无法使用2012年到2017年的过时脚本。我有一个页面重定向到第三方电子学习平台,其中一些内容需要flash才能工作。许多用户不关心他们的机器上安装了哪些软件(多么新,呵呵)所以我需要检测它并显示典型消息“请单击此处安装/更新FlashPlayer”,但我找不到“现代"执行此操作的脚本/方式,在任何地方,尽可能简化。我尝试过的所有脚本都已弃用或在所有浏览器中返回false,即使我安装并激活了最新版
我正在开发一个可靠的JavaScript库。我可以用下面的代码播放声音。varsoundPlayer=null;functionplaySound(){soundPlayer=newAudio(soundName).play();}如何停止和暂停此音频?当我这样尝试时:soundPlayer.pause();或者soundPlayer.stop();但是我得到这个错误:UncaughtTypeError:soundPlayer.stopisnotafunction我该怎么做? 最佳答案 如果你改变它:soundPlayer=newA
我正在尝试使用Chrome扩展程序在SO聊天中播放通知提示音(或提及提示音),但我无法正确播放(如果可能的话)。我尝试了以下代码:this.notify=function(){$("#jplayer").jPlayer('play',0);}但是我得到以下错误:UncaughtTypeError:Object[objectObject]hasnomethod'jPlayer'有没有办法使用SO聊天声音“模块”/播放器来播放@mention提示音?更新我知道我可以设置自己的“音频播放器”,但我想使用SO上聊天中使用的音频播放器,并且我想使用通知提示音。我已经在GitHubgist中上传了
我有一个youtube视频。我想在停止播放时显示一个灯箱。我需要使用javascript/jQuery或PHP来完成此操作。Ajax也很好。我寻找了一种解决方案,但没有找到有效的解决方案。 最佳答案 如果你可以使用youtubeapi,那么像这样的东西应该可以工作:$(document).ready(function(){varplayer;functiononYouTubePlayerAPIReady(){player=newYT.Player('player',{height:'390',width:'640',videoId:
所以我正在使用修改后的脚本来尝试播放来自WebSpeechAPI的一些文本。代码原来在这里:ChromeSpeechSynthesiswithlongertexts这是我修改后的变体:functiongoogleSpeech(text,rate){if(!reading){speechSynthesis.cancel();if(timer){clearInterval(timer);}letmsg=newSpeechSynthesisUtterance();letvoices=window.speechSynthesis.getVoices();msg.voice=voices[63]