2014-10-04 1 views
3

Android에서 MediaPlayer 또는 SoundPool로 사운드를 재생할 수 있습니다. Android 기기 두 대가 MediaPlayer 사용시 동일한 소리를 훨씬 크게 재생합니다. 세 번째 장치에서 볼륨이 동일하게 들립니다.Android : MediaPlayer가 SoundPool보다 큰 소리를 재생하는 이유는 무엇입니까?

이유를 알고 계십니까? SoundPool에서 MediaPlayer처럼 소리를 재생하도록 설정할 수 있습니까?

코드 : SoundPool와 재생 MP3 사운드 문제

장치

private void playSoundPool() { 
    int MAX_STREAMS = 2; 
    SoundPool soundPool = new SoundPool(MAX_STREAMS, AudioManager.STREAM_MUSIC, 0); 
    soundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() { 
     @Override 
     public void onLoadComplete(SoundPool soundPool, int soundId, int status) { 
      int loop = 0; 
      int priority = 0; 
      float rate = 1.f; 
      soundPool.play(soundId, 1, 1, priority, loop, rate);      
     } 
    }); 
    soundPool.load(this, R.raw.test, 1); 
} 

코드 : 당신은 download test project에 오신 것을 환영합니다 MediaPlayer를

private void playMediaPlayer() { 
    MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.test); 
    mediaPlayer.setVolume(1, 1); 
    mediaPlayer.start(); 
} 

와 MP3 사운드를 재생할 수 있습니다.

+0

'soundfool.play'의 볼륨으로'1.0f'를 사용하면 어떻게 될까요? 같은 볼륨을 원한다면 같은 볼륨 레벨을 사용하고 싶을 것입니다. – ianhanniballake

+0

그것은 단지 동일합니다. 나는 0.99f를 넣었습니다. 왜냐하면 누군가 2010 년 SoundPool 볼륨을 [0, 0.99f] 범위로 유지하도록 조언했기 때문입니다. 코드를 간단하게 유지하기 위해 "1"로 코드를 업데이트했습니다. – Pavel

+0

어쩌면 MediaPlayer.setAudioStreamType과 관련이 있습니까? – pskink

답변

0

가능한 해결 방법 : 당신은, 점점 휴대폰 사용자가 설정 한 글로벌 미디어 볼륨을 변경하고 soundPool에서 스트림 볼륨을 변경하여 독립적으로 우리 자신의 응용 프로그램의 볼륨을 변경 AudioManager를 만들 필요가

.

AudioManager mgr = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE); 

int streamVolume = mgr.getStreamVolume(AudioManager.STREAM_MUSIC); 

streamVolume = streamVolume/AudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC); 

mSoundPool.play(mSoundPoolMap.get(index), streamVolume, streamVolume, 1, 0, 1f); 

참고 :

내가 soundpool에 볼륨 0.5를 설정 한 경우, 실제 볼륨이 항상 글로벌 한의 절반이 될 것입니다. - soundpool에서 플레이 사운드

  • 세트 볼륨 활동이 최대로 전화 설정에서

    • 설정 글로벌 미디어 볼륨
    • 세트 볼륨을 0.5 soundpool.play를 사용 : 재생 아주 쉽게 .play to 1 - 재생 소리, 그것은 두 번 될 것입니다 큰 소리

    그래서 볼륨이 SoundPool.play 메서드에 전달되어 실제로 전역 볼륨에 대한 배율이 적용됩니다! ** 현재 볼륨 설정에서 사운드를 재생하려면 "1"을 볼륨으로 보내거나 요구 사항에 따라 변경하십시오 **

    은 오디오 재생을위한 글로벌 미디어 볼륨을 사용하는 미디어 플레이어 클래스 일 수 있습니다 파일. 하드 코딩 된 soundPool.play (soundId, , , priority, loop, rate)를 사용하고 있습니다. 가치!

    가 SoundPool :

    SoundPool 메모리 에서 유지 될 수 짧은 클립을 위해 설계되었습니다

    을 압축 해제

    우리는

    MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.test); 
    mediaPlayer.setVolume(streamVolume,streamVolume); 
    mediaPlayer.start(); 
    

    좀 더있는 텍스트와 노력이 필요 빠른 액세스가 가능하며 앱 또는 게임의 음향 효과에 가장 적합합니다. 사운드 보드와 함께이 방법을 사용하면 아이디어가 좋으며 많은 "중간"크기의 사운드를 메모리에로드하면 (16Mb) 한도를 초과 할 수 있으며 OutOfMemoryException이 발생할 수 있습니다. SoundPool은 별도의 스레드를 사용하여 음악 파일을로드하지만 기본 스레드의 작동으로 UI가 차단되지 않습니다. 게임 중에 총 소리처럼 짧은 사운드 클립을 재생하는 데 사용할 수 있습니다 (길이가 3 초 미만인 것). 좋은 특징은 소리 풀이 함께 제공됩니다 많은 소리를 동시에들을 수 있다는 것입니다. 게임을 생각할 때 많이 발생합니다. 따라서 먼저 모든 미디어 파일을로드하는 사운드 풀 개체를 빌드하십시오. MediaPlayer를 "

    MediaPlayer를이 파일은 각각의 시간이라고 만들 디스크에서 을로드 할이 음악 파일이나 큰 파일에 대한 가장 적합한 긴 사운드 파일 또는 스트림을 위해 설계

    ,이 메모리 공간에 저장됩니다. 하지만 약간의 지연 (정말 눈에 띄는되지 않음)를 소개

    참조 :. 당신 때문에 압축 및 decompressi에 그런 말을 수 SO

  • +0

    솔루션을 이해하지 못했습니다. 죄송합니다. – Pavel

    -1

    메커니즘의 차이가있다 음질과 음량에 관해서는 실제 음량과 음량이 MediaPlayer와 비교할 때 낮아질 수 있습니다. 따라서 더 나은 음질과 볼륨을 위해 MediaPlayer를 사용하는 것이 좋습니다.

    SoundPool

    SoundPool가 빠른 액세스를 위해 압축 해제 메모리에 유지 될 수 짧은 클립을 위해 설계되었습니다,이 앱이나 게임에서 사운드 효과에 가장 적합합니다. 사운드 보드에이 방법을 사용하는 것은 나쁜 "중간"크기의 사운드를 메모리에로드하고 제한 (16Mb)을 초과하여 OutOfMemoryException을 얻을 수 있기 때문에 바람직하지 않습니다.

    MediaPlayer를

    MediaPlayer를이 이상 사운드 파일 또는 스트림을 위해 설계,이 음악 파일이나 대용량 파일에 가장 적합합니다. 파일이 생성 될 때마다 디스크에서로드됩니다. 메모리 공간은 절약되지만 약간의 지연이 발생합니다 (실제로는 눈에 띄지 않습니다).

    +0

    SoundPool은 두 가지 이유에서 저희 앱에서 사용되었습니다. 1. 잡음없는 사운드 루프 - MediaPlayer가 아닙니다. 2. 언급 한 이유로 - 신속하게 재생해야하는 많은 작은 사운드 효과 왜 SoundPool이 압축/압축 해제를 사용한다고 생각 하 고 MediaPlayer가 ' t? – Pavel

    +0

    SoudPool에서 사운드 lound를 재생 해 보았습니까? : AudioManager audioManager = (AudioManager) getSystemService (Context.AUDIO_SERVICE); audioManager.setStreamVolume (AudioManager.STREAM_MUSIC, AudioManager.getStreamMaxVolume(), 0); – Hamad

    +0

    SoundPool 너무 다른 문제가 있습니다! http://stackoverflow.com/questions/7266298/android-sound-api-deterministic-low-latency – Hamad

    관련 문제