【问题标题】:Issue With Sound Manager Playing Random Files声音管理器播放随机文件的问题
【发布时间】:2012-04-16 04:48:00
【问题描述】:

我正在尝试使用 SoundManager 随机播放 30 秒的声音片段,同时启动由 onTouch 事件触发的动画序列(闪烁图形)。无论出于何种原因,在播放大约 5 秒后,声音片段就会被剪掉,我不知道为什么。有什么想法吗?

同样经过测试,似乎直到最初的 onTouch 事件后一分钟左右才会播放。

public class Soundboard extends Activity {
    private SoundManager mSoundManager;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        mSoundManager = new SoundManager();
        mSoundManager.initSounds(getBaseContext());
        mSoundManager.addSound(0, R.raw.sound0);
        mSoundManager.addSound(1, R.raw.sound1);
        mSoundManager.addSound(2, R.raw.sound2);
        mSoundManager.addSound(3, R.raw.sound3);
    };

    public boolean onTouchEvent(MotionEvent evt){

        Random r = new Random();
        int x = r.nextInt(3);

        switch (evt.getAction()) 
        {
            case MotionEvent.ACTION_DOWN:
            mSoundManager.playSound(x);
            startAnimating();
            return super.onTouchEvent(evt);

            case MotionEvent.ACTION_UP:
            break;
            default:
            break;
        }
        return true;
    }

    private void startAnimating() {

        ImageView wiub_screen01 = (ImageView) findViewById(R.id.wiub_screen01);
        Animation fadein01 = AnimationUtils.loadAnimation(this, R.anim.fade_in01);
        wiub_screen01.startAnimation(fadein01);

        ImageView wiub_screen00 = (ImageView) findViewById(R.id.wiub_screen00);
        Animation fadein00 = AnimationUtils.loadAnimation(this, R.anim.fade_in00);
        wiub_screen00.startAnimation(fadein00);
    }

}

【问题讨论】:

  • 您尝试播放的文件格式是什么?

标签: java android touch-event


【解决方案1】:

很有可能没有加载音频。如果你真的想播放一些短片,一定要看看 SoundPool。 (改编自 Google SoundPool 示例)

试试这个:

public class Soundboard extends Activity {
    private SoundPool mSoundPool;
    boolean loaded = false;
    private int[] soundIDs;
    private int[] resIDs;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        mSoundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
        mSoundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() {
            @Override
            public void onLoadComplete(SoundPool soundPool, int sampleId,
                            int status) {
                    loaded = true;
            }
        });
        resIDs = new int[]{R.raw.sound0,R.raw.sound1,R.raw.sound2.R.raw.sound3 };

        for(int i=0; i<resIDs.length; i++){
            soundIDs[i] = mSoundPool.load(this, resIDs[i], 1);              
        }
    };

    public boolean onTouchEvent(MotionEvent evt){

        Random r = new Random();
        int x = r.nextInt(resIDs.length);

        switch (evt.getAction()) 
        {
            case MotionEvent.ACTION_DOWN:
                AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
                float actualVolume = (float) audioManager
                                .getStreamVolume(AudioManager.STREAM_MUSIC);
                float maxVolume = (float) audioManager
                                .getStreamMaxVolume(AudioManager.STREAM_MUSIC);
                float volume = actualVolume / maxVolume;
                // Is the sound loaded already?
                if (loaded) {
                        mSoundPool.play(soundIDs[x], volume, volume, 1, 0, 1f);
                        Log.i("Test", "Played sound");
                }
            startAnimating();
            return super.onTouchEvent(evt);

            case MotionEvent.ACTION_UP:
            break;
            default:
            break;
        }
        return true;
    }

    private void startAnimating() {

        ImageView wiub_screen01 = (ImageView) findViewById(R.id.wiub_screen01);
        Animation fadein01 = AnimationUtils.loadAnimation(this, R.anim.fade_in01);
        wiub_screen01.startAnimation(fadein01);

        ImageView wiub_screen00 = (ImageView) findViewById(R.id.wiub_screen00);
        Animation fadein00 = AnimationUtils.loadAnimation(this, R.anim.fade_in00);
        wiub_screen00.startAnimation(fadein00);
    }
}

【讨论】:

  • 在使用 AudioManager / SoundPool 时,声音文件的长度也很重要吗?现在我的音频剪辑大约是 30 秒,但使用原始的 AudioManager 方法只能播放 5 秒左右。
  • 我稍后会看看,但 soundpool 通常用于短声音。你绝对应该看看你的情况:stealthcopter.com/blog/2010/08/…
  • 我已开始更改代码以使用 MediaPlayer 并解决了我的空指针异常问题。我会继续测试和更新代码。
  • 切换到使用 MediaPlayer 解决了我遇到的问题。
【解决方案2】:

尝试将 raw 文件夹中的文件转换为 ogg 格式。

【讨论】:

  • 在进行任何代码更改之前,我会尝试将文件转换为 .ogg
  • 我现在可以确认转换为 .ogg 并不能解决问题。
  • hmm.. 我曾经为媒体播放器安装过这个,但它在怯场播放器中有一个错误。需要使用音轨并自己进行解码。也许这会对你有所帮助或使用 soundpool。
  • 我最终更改了代码以利用 MediaPlayer 解决了我遇到的问题。
猜你喜欢
  • 2020-09-12
  • 1970-01-01
  • 1970-01-01
  • 2020-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-13
  • 2011-12-08
相关资源
最近更新 更多