OPENGL相关 音效

Posted xzj_2013

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OPENGL相关 音效相关的知识,希望对你有一定的参考价值。

1.1 音效

按照作用可以将音效划分为两类:即时音效和背景音效。这两种音效在android中的实现技术是不同的。
  1. 即时音效
    即时音效的特点是短暂、可以重复、可以同时播放。比如游戏中的枪炮声碰撞声等。
    由于Android提供的mediaplay会占用大量的系统资源而且在播放时还存在缓冲较大的延时,因此用mediaplay无法实现即时音效。
    android的设计者为即时音效的实现提供了SoundPool类,用于管理和播放程序中的声音资源。
    需要注意由于SoundPool设计的初衷是用于无延时的播放短暂音效,因此实际开发中应该只将长度小雨7s的声音资源放入SoundPool,否则可能会出现加载失败或者占用内存过大。

    实现代码

 //初始化
 private int initSoundPool()
        soundPool = new SoundPool.Builder().build();
        return soundPool.load(this,R.raw.musictest,1);
 

//播放
   private void play()
        AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
       int maxVolume =  am.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
        int currentVolume = am.getStreamVolume(AudioManager.STREAM_MUSIC);
        float volume = currentVolume/maxVolume;
        soundPool.play(initSoundPool(),volume,volume,1,4,1.0f);
    
  1. 背景音效
    其实现可以通过SoundPool循环播放也可以通过MediaPlayer来进行播放。
    使用MediaPlayer播放必须熟悉其生命周期

    ①IDLE 使用new方法创建一个mediaplayer对象或者调用reset方法时,该MediaPlayer对象处于IDLE状态,区别在:在这种状态下如果调用getDurtion等方法,如果是reset进入会触发OnError进入onError状态,如果是new出新对象则不会触发也不会进入onError
    ②END 通过率release方法进入该状态,只要MediaPlayer不再使用就应该尽快的将其通过release方法释放掉,以释放去其占用的软硬件资源。如果进入了END状态就不会进入其他状态
    ③Intialized 通过setDataSource进入该状态,表示此时要播放的资源文件设置好了
    ④Prepared 与prepareAsyn()配合,准备完成会回调onPrepareListener
    ⑤Start prepare后调用start方法进入,可以通过isPlaying测试是否处于start状态
    ⑥Pause 暂停状态
    ⑦Stop状态
    ⑧PlaybackCompleted 播放完成状态
    ⑨Error状态

以上是关于OPENGL相关 音效的主要内容,如果未能解决你的问题,请参考以下文章

音效的设计选择

opengl getUniformLocation

转:SoundPool的一些注意(可能会导致没声音)

OpenGL 六 - 3D数学基础 - 向量矩阵及OpenGL中的变换

JavaScript / HTML5 中的音效

当我移动或旋转相机时,OpenGL 雾效果会发生变化