2014-09-01 4 views
1

모바일 앱에서 사운드 파일을 재생해야합니다. 볼륨 버튼을 누르면, 내 애플 리케이션을 통해 볼륨을 늘리거나 줄일 필요가있다. 미디어 플레이어를 사용하여 볼륨을 설정하기 위해 SetVolume (왼쪽, 오른쪽) 기능을 재생하고 사용하고 있습니다.내 Android 모바일 애플리케이션을 사용하여 볼륨을 데시벨로 설정하는 방법은 무엇입니까?

MediaPlayer mp; 
float left = 0.0f; 
float right = 0.6f; 

public void OnPlay(View v){ 
    mp = MediaPlayer.create(this, R.raw.twofiftybeep); 
    audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); 

    mp.start(); 


    mp.setOnCompletionListener(new OnCompletionListener() { 

     @Override 
     public void onCompletion(MediaPlayer mp) { 
      // Playing the file continuously 
      mp.setVolume(left, right); 

      mp.start(); 

     } 
    }); 
} 

public void OnStop(View v){ 
    mp.stop(); 
} 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 


} 

@Override 
public boolean dispatchKeyEvent(KeyEvent event) { 
    int action = event.getAction(); 
    int keyCode = event.getKeyCode(); 
    switch (keyCode) { 
    case KeyEvent.KEYCODE_VOLUME_UP: 
     left= left + 0.05f; 
     return true; 
    case KeyEvent.KEYCODE_VOLUME_DOWN: 
     left = left - 0.05f; 
     return true; 
    default: 
     return super.dispatchKeyEvent(event); 
    } 

} 

그러나 SetVolume 0.0f를 파라미터는 최소이고 1.0F가 최대이고와 1.0f 0.0f를 내지.

하지만 40dB, 50dB, 60dB 등을 설정하고 싶습니다. 모든 볼륨 버튼을 누른 상태에서 5dB를 증가 또는 감소시키고 싶습니다.

어떻게 0.0f - 1.0f 범위를 dB 값 변환으로 할 수 있습니까?

다른 방법이 있습니까?

답변

2

디지털 신호의 경우 dB은 일반적으로 전체 스케일 진폭에 상대적으로 표현됩니다.

1.0 == 0dB 
0.5 == -6dB 
0.25 == -12dB 
... 
0.0 == -inf dB 

등등. , ampl = 10^(dB/20)

다음 목표를 달성하는 가장 간단한 방법은 당신의 가치 dB의 leftright를 저장하는 것입니다 모두를 초기화 : dB = 20*log10(ampl)

진폭 dB로 변환하려면

는 dB로 진폭을 변환하려면 0으로. 값을 0 이상으로 증가시키지 않는 것을 제외하고는 게시 된 코드는 정확히 동일하게 유지 될 수 있습니다. 그런 다음 setVolume을 호출 할 때 값을 선형으로 변환하십시오. 예 : mp.setVolume(Math.pow(10,left/20), Math.pow(10,right/20))

+0

안녕 Jaket, 나는이 전환으로 약간 혼동 스럽다. 어떻게 1.0이 0dB로 변환 될 것입니까? 왜냐하면 내가 (1.0f, 1.0f)의 볼륨을 설정하면 0dB 일 수없는 모바일 사운드를들을 수 있기 때문입니다. 예를 들어 Samsung S3 폰은 최대 81dB의 사운드를 제공합니다. API 설명에 따라 MediaPlayer.SetVolume (1.0f, 1.0f)은 휴대 전화로 최대 볼륨을 제공합니다. 모바일 하드웨어 설계에 따라 모바일마다 다를 수 있습니다. 그래서 삼성 S3 폰에서이 API를 사용한다면 ~ 81dB 정도 가깝습니다. 나는 여전히 수학적 전환 이상으로 혼란 스럽다. 내가 몇 가지 기본을 놓치면 변명해라. –

+0

dB는 항상 상대적인 값입니다. 디지털에서는 1.0 (20 * log10 (1) == 0) 인 전체 스케일 진폭에 상대적입니다. 휴대 전화로 스피커의 출력까지 변환하려면 이득을 알아야합니다. 만약 당신이 말했듯이, S3가 풀 스케일 (0dBFS)에서 81dB의 최대 출력 (dBSPL I는 추정)을 가졌다면 당신은 간단히 81을 더할 수 있습니다 - 그래서 -5dBFS == + 76dBSPL – jaket

1

프로그래밍 방식으로 절대 데시벨 등급을 설정할 수 없습니다. 이러한 개념은 실제로 오디오와 함께 존재하지 않습니다. 스피커, 실내 음향, 사용자의 귀에 얼마나 가깝게 있는지, 사운드 파일에서 샘플을 측정하는 등의 물리적 구성을 알아야합니다.

MediaPlayer.setVolume은 소리 크기 또는 볼륨이 아닌 감쇠를 설정합니다.

MediaPlayer.setVolume으로 지정된 볼륨은 하드웨어 볼륨 설정을 기준으로합니다. 장치 볼륨을 조정하지 않으면 실제로 미디어 소스를 "크게"만들 수 없습니다. MediaPlayer 자체만으로는 사용자가 어떤 소리를 "크게"들리는 지 실제로 알 수 없습니다.

최고 설정 : player.setvolume(1.0, 1.0) - 출력 스트림의 볼륨이 장치의 전체 볼륨과 일치하도록 설정합니다. 이것이 기본값입니다.

짐작할 수 있듯이 - player.setvolume(0.0, 0.0) - 절대적인 침묵입니다. 당신이 원하는 이유

전역 볼륨을 설정하려면, 당신은 장치와 안드로이드 볼륨 버튼은 개발자가 버튼 누름을 처리 할 필요없이 완벽하게 잘 작동하는지 고려 AudioManager.setStreamVolume

을 사용할 수 있습니다, 잘 모르겠어요 기본 동작을 무시합니다.

+0

안녕하세요, 귀하의 게시물에 대단히 감사합니다. 내 질문에 대한 답변입니다. 내 모바일 앱은 사용자에게 어떤 dB가 작동하는지 알려야합니다. 그 요구 사항.그래서 나는 사운드 파일의 원시 데이터를 읽고 대안을 찾아 볼륨 판독 값을 다양하게해야합니다. –

관련 문제