Android MediaPlayer 사운드 페이드 효과 구현

6879 단어 Android
Android MediaPlayer 사운드 페이드 효과 구현
1. 요구 사항 설명
최근 회사 제품은 사용자 체험을 향상시켜야 한다. 음성 메시지를 재생할 때 현재 다른 오디오 파일을 재생하고 있으면 한 소리가 멈추는 효과까지 점점 낮아진다.음성 메시지 재생이 완료되면 이전의 오디오를 복원하고 재생을 계속하며 한 소리가 원래의 음량으로 점점 커지는 효과가 있습니다.
2. 솔루션
온라인 Google은 스레드를 만들고 시스템 볼륨을 최소화한 다음 재생을 중지하는 과정을 반복합니다. 핵심 코드는 대략 이렇게 깁니다.
final int volume = audioManager.getStreamVolume(AudioManager.STREAM_ALARM);
new Thread(){
    @Override
    public void run() {
        super.run();
        for (int i=1; i<= volume; i++) {
            audioManager.setStreamVolume(AudioManager.STREAM_ALARM, i, 0);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

}.start();

우리는 이 방안이 효율적이지 못하다고 생각한다. 시스템의 set Stream Volume () 방법을 호출할 필요가 없고, 미디어플레이어가 자체로 가지고 있는 set Volume () 방법을 직접 호출하여 음량을 조절하고, 시스템이 자체로 가지고 있는 타이머인 Count Down Timer를 사용하여 음량 크기를 순환적으로 조절할 수 있다.핵심 코드는 다음과 같습니다.
//     ,  :  ;  2 
final long duration = 2000;
//         
long interval = duration / 10;
new CountDownTimer(duration, interval){

    @Override
    public void onTick(long millisUntilFinished) {
        float volume = 1f - millisUntilFinished * 1.0f / duration;
        mediaPlayer.setVolume(volume, volume);
    }

    @Override
    public void onFinish() {
        mediaPlayer.setVolume(1f, 1f);
    }
}.start();

죄송합니다. 최근에 계속 Kotlin을 사용하고 있습니다. 지금도 반관수를 하고 있지만 자바도 익숙하지 않습니다. 눈물이 펑펑 쏟아집니다. 다음은 Kotlin 버전 코드입니다.
/**
 *     
 *
 * @param duration       ,  :  ;  2 
 * @param completed     
 */
fun fadeIn(duration: Long = 2000, completed: () -> Unit = {}) {
    object : CountDownTimer(duration, duration / 10) {
        override fun onFinish() {
            mediaPlayer?.setVolume(0f, 0f)
            mediaPlayer?.pause()
            completed()
        }

        override fun onTick(millisUntilFinished: Long) {
            val volume = millisUntilFinished * 1.0f / duration
            mediaPlayer?.setVolume(volume, volume)
            info("player controller fade in volume = $volume")
        }
    }.start()
}

/**
 *     
 *
 * @param duration       ,  :  ;  2 
 * @param completed     
 */
fun fadeOut(duration: Long = 2000, completed: () -> Unit = {}) {
    object : CountDownTimer(duration, duration / 10) {
        override fun onFinish() {
            mediaPlayer?.setVolume(1f, 1f)
            completed()
        }

        override fun onTick(millisUntilFinished: Long) {
            val volume = 1f - millisUntilFinished * 1.0f / duration
            mediaPlayer?.setVolume(volume, volume)
        }
    }.start()
    mediaPlayer?.start()
}

MediaPlayer가 자체로 가지고 있는 음량 설정 방법인 setVolume()의 매개 변수 문제를 설명해야 한다.android시스템은 음량을 [0~현재 음량]에서 축소(scale)하여 [0f~1f]까지의 구간을 설정하기 때문에 음량을 설정하는 매개 변수도 0에서 1이고 최대 음량은 현재 시스템의 음량이다.
3. 요약
코드는 간단하지만 신경을 많이 썼어요. 다들 둘러보고 블로그를 쓰는 좋은 습관을 길렀으면 좋겠어요.

좋은 웹페이지 즐겨찾기