
正文
android音效,Android音效增强
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
android系统设置里的触摸提示音功能怎么在代码中实现开启和关闭?
设置启用的时候加上 mAudioManager.loadSoundEffects(); 关闭按键音的时候加上mAudioManager.unloadSoundEffects(); 应该就可以了。
提供下参考 有这么几个类AudioManager SoundPool。
我提供一段我们项目中的代码,各作用其余的你自己相关搜索下
/**
* 播放音效
*/
@TargetApi(8)
public static void PlaySoundEffect(final SeekerActivity activity, int wavid){
final SoundPool sp = new SoundPool(20, AudioManager.STREAM_MUSIC, 100);
sp.load(activity, wavid ,1);
sp.setOnLoadCompleteListener(new OnLoadCompleteListener() {
public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
AudioManager am = (AudioManager)activity.getSystemService(Context.AUDIO_SERVICE);
float streamVolumeCurrent = am.getStreamVolume(AudioManager.STREAM_MUSIC);
float streamVolumeMax = am.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
float volume = streamVolumeCurrent/streamVolumeMax;
sp.play(1, volume, volume, 0, 0, 1);
}
}
wavid为你对应的音效资源id,play()方法调用时设置音量大小。
方法有很多,不限于这一个。
相关问答
Q1: 有没有用过android sdk里面的AudioEffect设置音效的
在Android2.3中增加了对音频混响的支持,这些API包含在android.media.audiofx包中。
一、概述
AudioEffect是android audio framework(android 音频框架)提供的音频效果控制的基类。开发者不能直接使用此类,应该使用它的派生类。 下面列出它的派生类。
Equalizer
Virtualizer
BassBoost
PresetReverb
EnvironmentalReverb
当创建AudioEffect时,如果音频效果应用到一个具体的AudioTrack和MediaPlayer的实例,应用程序必须指定该实例的音频session ID,如果要应用Global音频输出混响的效果必须制定Session 0。
要创建音频输出混响(音频 Session 0)要求要有 MODIFY_AUDIO_SETTINGS权限。
如果要创建的效果在audio framework不存在,那么直接创建该效果,如果已经存在那么直接使用此效果。如果优先级高的对象要在低级别的对象使用该效果时,那么控制将转移到优先级高的对象上,否则继续停留在此对象上。在这种情况下,新的申请将被监听器通知。
Q2: Android 音频焦点(Audio Focus)
Android 音频焦点(Audio Focus)
引子
说 Audio Focus 前先说个很简单需求:来电时暂停正在播放的音乐,电话结束时恢复播放。
音频焦点
问题的解决方法就是:请求系统的音频焦点(Request the Audio Focus)。
官方文档指出Android 在处理音频播放是分了多个“音频流”的,如音乐流、音效流、电话声音流等,使控制音量时可以互不干涉。多数情况下我们播放音乐都是使用 STREAM_MUSIC 音频流。
另外,系统中可能会有多个应用程序会播放音频,所以需要考虑他们之间该如何协调,为了避免同时播放音乐,Android 系统使用音频焦点来进行统一管理,即只有获得了音频焦点的应用程序才可以播放音乐。
那么,播放音频应该这样来做:
获取音频焦点 requestAudioFocus
获取成功后,开始播放音频
处理音频焦点的丢失和“DUCK”
播放完毕后取消焦点
如此便可以完美的解决引子里的需求。
一个简单的示例
MusicService.java
public class MusicService extends Service {
private AudioManager mAm;
private boolean isPlaymusic;
private String url;
private MediaPlayer mediaPlayer;
@Override
public void onCreate() {
super.onCreate();
mAm = (AudioManager) getSystemService(AUDIO_SERVICE);
}
@Override
public void onStart(Intent intent, int startId) {
if (intent != null) {
Bundle bundle = intent.getExtras();
if (bundle != null) {
isPlaymusic = bundle.getBoolean("isPlay", true);
url = bundle.getString("url");
if (isPlaymusic)
play();
else
stop();
}
}
}
OnAudioFocusChangeListener afChangeListener = new OnAudioFocusChangeListener() {
public void onAudioFocusChange(int focusChange) {
if (focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT) {
// Pause playback
pause();
} else if (focusChange == AudioManager.AUDIOFOCUS_GAIN) {
// Resume playback
resume();
} else if (focusChange == AudioManager.AUDIOFOCUS_LOSS) {
// mAm.unregisterMediaButtonEventReceiver(RemoteControlReceiver);
mAm.abandonAudioFocus(afChangeListener);
// Stop playback
stop();
}
}
};
private boolean requestFocus() {
// Request audio focus for playback
int result = mAm.requestAudioFocus(afChangeListener,
// Use the music stream.
AudioManager.STREAM_MUSIC,
// Request permanent focus.
AudioManager.AUDIOFOCUS_GAIN);
return result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED;
}
private void resume() {
if (mediaPlayer != null) {
mediaPlayer.start();
}
}
private void pause() {
if (mediaPlayer != null mediaPlayer.isPlaying()) {
mediaPlayer.pause();
}
}
OnCompletionListener completionListener = new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer player) {
if(!player.isLooping()){
mAm.abandonAudioFocus(afChangeListener);
}
}
};
private void play() {
if (requestFocus()) {
if (mediaPlayer == null) {
try {
mediaPlayer = new MediaPlayer();
mediaPlayer.setDataSource(url);
mediaPlayer.prepare();
mediaPlayer.setOnCompletionListener(completionListener);
} catch (IOException e) {
e.printStackTrace();
}
}
if (!mediaPlayer.isPlaying()) {
mediaPlayer.start();
}
}
}
@Override
public void onDestroy() {
super.onDestroy();
if (mediaPlayer != null)
mediaPlayer.release();
}
private void stop() {
if (mediaPlayer != null) {
mediaPlayer.stop();
}
}
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
}
经模拟器测试,当来电时音频焦点会给到铃声流,并打出日志:
I/AudioService(1235): AudioFocus requestAudioFocus() from AudioFocus_For_Phone_Ring_And_Calls
此时MusicService中的afChangeListener会得到AUDIOFOCUS_LOSS_TRANSIENT,于是会暂停播放音频。
当通话结束或者挂掉电话,afChangeListener会得到AUDIOFOCUS_GAIN,于是恢复播放音频。
注意:
播放完毕一定要禁止掉请求的音频焦点abandonAudioFocus(afChangeListener),否则,如果播放完毕后的某个时段刚好有个通话结束,并且此时没有其他的应用占用了焦点,系统会重新通知服务里的afChangeListener,导致音频再次的播放。
如果丢失的短暂音频焦点允许DUCK状态AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK,在这种情况下,应用程序降低音量继续播放,不需要暂停。再次获取后,恢复原来的音量。
Q3: 安卓12怎么安装viper4h_f_
安装过程:安装V4AManager.apk。打开V4A管理器,并点击“安装/更新”按钮,安装ViPER4Android音效驱动程序。此时请授予V4A管理器的root权限。在执行此步骤时,V4A管理器会将系统内已经存在的音效驱动程序进行备份,然后安装ViPER4Android驱动。如不需要的话可以将V4AManager.apk卸载(不会影响将来还原驱动)。安装ViPER4Android.apk。在360、LBE等系统内存清理或禁止开机自启的管理软件中将ViPER4Android加入白名单。打开程序管理器,找到ViPER4AndroidFX,并选择清除数据。重启手机。打开ViPER4Android并进行偏好的音效设定。该音效会应用到系统内的所有声音上,包括自带/第三方播放器、游戏等(不包括通话)。
验证自动安装是否成功:
1、打开RootExplorer或其他文件浏览器。
2、定位至/system/lib/soundfx/。
3、查看是否存在libv4a_fx_ics.so。
4、不存在libviper4android_ics.so(若存在此文件则手动删除)。
若以上4点均满足,则可以以最大兼容性完美使用V4A音效。否则请参考手动安装进行安装。
Q4: 安卓最佳音效
1.
PowerAMP Music Player: 这个是android设备中一个非常好用的音频播放器,音质非常优秀,界面美观,用户体验好, 它可以支持MP3、WAV、WMA、APE、FLAC等格式。软件本身能够支持无损格式的播放,可以看出软件强大的解码能力,而且支持均衡器设置,可以让在听音乐时选择不同音效来达到最好的音乐播放效果。但是它也有缺点:正式版不是免费的,当然可以去下载破解版的,只不过不好找。
2.
天天动听: 我以前手机一直都用天天动听,感觉界面很酷,功能又多。酷狗和他差不多,半斤八两吧,他俩都支持自动下载歌手图片,歌词,待机桌面时可显示迷你歌词,挺好的。支持线控,用户界面与体验都不错。
3.
QQ音乐 估计你在电脑上用过QQ音乐播放器,QQ音乐,良好的播放体验和庞大的音乐库吸引了不少用户,在QQ音乐中搜索各种想听的中外歌曲,基本上没有找不
Q5: 如何在Android中整合立体声音效处理库
openCORE是Android的媒体功能实现的关键 ,使开发人员能在此之上构建新的应用,它支持音视频播放、音视频录制、可视电话、博客、实时流媒体服务等。
openCORE使用了引擎驱动,节点框架(Node architecture) ,它由C++语言编写。引擎接收应用层的命令来负责管理和控制整个节点链路(Node graph) 。节点和节点链路的选取和搭建取决于播放参数(音视频剪辑的类型、操作等)。
通常的节点链路的搭建为以下模式:
输入节点(Source Node) --- 多个处理节点(Decoder Node)或 Codecs ... --- 输出节点(Sink Node)
openCORE还包括一个开放源码的多媒体编解码器,视频(如MPEG- 4,H.264),音频(如MP3,AAC,MIDI), 以及语音(如AMRNB,AMR WB)等。OpenCORE 使用的OpenMAX IL 框架将编解码器整合到openCORE框架中 。 OpenMAX IL API在嵌入式移动领域非常有名,它为组件的移植提供了一个的抽象层。
将音效处理整合到Android多媒体播放器
主要的两大步骤:
1.在openCORE的后端添加对音效库的支持
2.在媒体播放器(应用层)中添加对openCORE中音效处理节点(Node)的支持
第一步、在openCORE的后端添加对音效库的支持
OpenCORE为编解码器的整合提供了多种可选方法,分别可以作为:OpenMAX编解码节点、OpenMAX IL组件、多媒体I/O 。多媒体I/O常常用在输出显示。在音效处理整合中可行的方法是将音效库“包装为”OpenMAX编解码节点 或 OpenMAX IL组件。以下分别说明这两种方式的用法。
1.OpenMAX编解码节点
这种方法要求播放器引擎支持多种音频效果。每个效果组件被实现为一个节点Node,当数据路链路创建后由引擎创建这些节点。数据流在路链的节点Node间“流动”,并有引擎进行管理和控制。同时,随着多个效果节点Node产生的线程增加,系统负荷也会增重。
2.OpenMAX IL组件
音频效果组件所处理的数据为解码组件的输出,所以最好将[音频解码]和[音效处理]组件放在同一层 。OpenCORE采用Open MAX IL为所有的Codec提供API操作,OpenCORE这种特性使得整合音效处理变得非常直接了当。
音效处理库被编译成为静态库 ,并用ARM的RVCT优化后,用OpenMAX IL 包装起来构成了OpenCORE组成部分。
[音频解码]和[音效处理]组件是通过API的IL层进行通信的,OMX音频解码节点Node在OpenCORE充当客户端的角色,这个Node节点负责创建、删除、数据流动 ,并将控制命令、数据Buffer传入到音频解码器中,音频解码器处理了数据Buffer后又将它们返回给Node节点。Node节点又将数据Buffer传递给[音效处理]组件。
这种方法与第一种方法相比带来系统负荷较小,但不是说它没有系统负荷。流数据要在两个组件和Node中传输两次(缺陷) ,并且需要协调组件之间的通信问题。






