Android MediaPlayer 사운드 페이드 효과 구현
6879 단어 Android
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. 요약
코드는 간단하지만 신경을 많이 썼어요. 다들 둘러보고 블로그를 쓰는 좋은 습관을 길렀으면 좋겠어요.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.