안드로이드 녹음+데시벨 측정

나고수·2022년 6월 26일
0

1일1공부

목록 보기
48/68
//manifest.xml
//녹음 권한 매니페스트 요청
<uses-permission android:name="android.permission.RECORD_AUDIO" />
//.kt
//녹음 권한 런타임 요청

private val recoredLauncher =
    registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
        if (result.resultCode == RESULT_OK) {
            //granted
        } else {
            //deny
        }
    }

 recoredLauncher.launch(Manifest.permission.RECORD_AUDIO)
//녹음 시작 

   private var recorder: MediaRecorder? = null
   private var isRecording = false
   private var job: Job? = null
   private var filePath = ""
   
   private fun startRecord() {
        recorder = MediaRecorder()
        //외부 저장소 내 개별앱 공간에 저장하기
        val basePath = requireContext().getExternalFilesDir(null)?.absolutePath

        recorder?.apply {
            setAudioSource(AudioSource.MIC) //외부에서 들어오는 소리를 녹음
            setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP) // 출력 파일 포맷을 설정
            setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB) // 오디오 인코더를 설정
            filePath = "${basePath}/myRecord.3gp"
            setOutputFile(filePath) //출력 파일 이름을 설정
        }
        try {
            recorder?.prepare() //초기화를 완료
        } catch (e: IOException) {
            Log.e(LOG_TAG, "prepare() failed")
            return
        }

        recorder?.start() //녹음기를 시작
        getDb() //데시벨 측정 
    }
//데시벨 측정 
      private fun getDb() {
        recorder?.let {
            isRecording = true
            job = CoroutineScope(Dispatchers.Default).launch {
                while (isRecording) {
                    delay(3000L) //3초에 한번씩 데시벨을 측정
                    val amplitude = it.maxAmplitude
                    val db = 20 * kotlin.math.log10(amplitude.toDouble()) //진폭 to 데시벨
                    //데시벨은 기준 값을 기준으로 결정되는 것이라 한다.
                    //그래서 기준값을 넣고싶다면 아래와 같이 기준값으로 나눠주면 된다.
                    //val db = 20 * kotlin.math.log10(amplitude.toDouble()/기준값)
                    //아무것도 안 넣는다면 우리가 흔히 생각하는 데시벨값이 된다. > https://www.joongang.co.kr/article/23615791#home
                    if (amplitude > 0) {
                        //진폭이 0 보다 크면 .. toDoSomething
                        //진폭이 0이하이면 데시벨이 -무한대로 나옵니다.
                    }
                }
            }
        }
    }
//녹음 중지 

    override fun onStop() {
        super.onStop()
        isRecording = false
        job?.cancel() //job cancle
        if (recorder != null) {
            recorder?.stop() // 녹음기 중지
            recorder?.release() //리소스 확보
            recorder = null
        }
    }    

공식문서

profile
되고싶다

0개의 댓글