PANnarrow 2015-08-15 03:01 采纳率: 0%
浏览 2643

SoundPool.Builder使用

搜到一些SoundPool用法,但是这个好像现在用不了了,然后折腾了SoundPool.Builder报NoClassDefFound异常,网上下了一些Demo,导入eclisps都提示我没导包,有没有大神可以给我些指导,万分感谢

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-04 05:23
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    我找到了一个可以正确使用的demo:

    public class SoundPlayer {
        private static final String TAG = "SoundPlayer";
        private static final int MAX_VOLUME = 100;
        private static final int DEFAULT_SAMPLE_RATE = 44100;
    
        private SoundPool mSoundPool;
        private int mSampleRate;
        private int mVolume;
    
        public SoundPlayer(Context context) {
            this.mSoundPool = new SoundPool(MAX_VOLUME, AudioManager.STREAM_MUSIC, 0);
            mSampleRate = DEFAULT_SAMPLE_RATE;
            mVolume = 0;
        }
    
        //播放音频文件
        public void playAudioFile(String filePath) {
            try {
                AudioFormat audioFormat = new AudioFormat(AudioFormat.CHANNEL_IN_MONO, 
                        AudioFormat.ENCODING_PCM_16BIT, 
                        DEFAULT_SAMPLE_RATE,
                        DEFAULT_SAMPLE_RATE / 2, 
                        DEFAULT_SAMPLE_RATE * 2,
                        8, 
                        16);
                AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(context.getAssets().open(filePath));
                DataLine.Info dataLineInfo = new DataLine.Info(SourceDataLine.class, audioFormat);
                SourceDataLine sourceDataLine = (SourceDataLine) AudioSystem.getLine(dataLineInfo);
    
                sourceDataLine.open(audioFormat);
                sourceDataLine.start();
    
                float[] buffer = new float[audioFormat.getFrameSize()];
                while (true) {
                    if (!sourceDataLine.isRunning()) break;
                    int availableBytes = sourceDataLine.read(buffer, 0, audioFormat.getFrameSize());
                    if (availableBytes > 0)
                        mSoundPool.play(mSoundPool.load(context, R.raw.sound_effect, mSampleRate), 
                                mSoundPool.load(context, R.raw.sound_effect, mSampleRate),
                                mSoundPool.load(context, R.raw.sound_effect, mSampleRate),
                                1, 1, 1);
                }
            } catch (Exception e) {
                Log.e(TAG, "playAudioFile", e);
            }
        }
    
        //暂停音频
        public void pauseAudio() {
            try {
                if (mSoundPool != null && mSoundPool.isPlaying())
                    mSoundPool.pause();
            } catch (Exception e) {
                Log.e(TAG, "pauseAudio", e);
            }
        }
    
        //结束播放
        public void stopAudio() {
            try {
                if (mSoundPool != null && mSoundPool.isPlaying())
                    mSoundPool.stop();
            } catch (Exception e) {
                Log.e(TAG, "stopAudio", e);
            }
        }
    
        //恢复音量
        public void setVolume(int volume) {
            mVolume = volume;
        }
    
        //获取当前音量
        public int getVolume() {
            return mVolume;
        }
    
        public void release() {
            mSoundPool.release();
        }
    }
    

    注意:以上代码为简化版本,实际开发中可能需要根据实际情况进行调整。

    评论

报告相同问题?