在 Kotlin 上按下按钮时如何停止录制 AudioRecord

Posted

技术标签:

【中文标题】在 Kotlin 上按下按钮时如何停止录制 AudioRecord【英文标题】:How do I stop recording AudioRecord when button press out on Kotlin 【发布时间】:2021-08-13 14:01:52 【问题描述】:

我有三个问题。 首先:我必须停止向服务器录制音频和流数据。 第二:我想保存文件并将整个文件发送到服务器。 第三:我必须在接收器中播放这些块。

向服务器发送音频:

btn_send.setOnTouchListener(object : View.OnTouchListener 
        override fun onTouch(v: View?, event: MotionEvent?): Boolean 
            when (event?.action) 
                MotionEvent.ACTION_DOWN -> 
                    Log.i("tou7ch", "apertou")
                    val buffer = ByteArray(minBufSize)
                    val chunks = buffer.toByteString()
                    audiorecord!!.startRecording()

                    val number = audiorecord!!.read(buffer, 0, minBufSize)
                    for (i in 0 until number) 
                        webSocket.send(chunks)
                    
                
                MotionEvent.ACTION_UP -> 
                    Log.i("tou7ch", "soltou")
                    audiorecord?.stop();
                
            

            return v?.onTouchEvent(event) ?: true
        
    )

发送时效果很好,但我不知道如何停止发送。当从按钮上移开手指时,我有一个Log.i("tou7ch", "soltou"),它被完美地调用了。 如果我这样放一段时间:

                    while (true) 
                        val number = audiorecord!!.read(buffer, 0, minBufSize)
                        for (i in 0 until number) 
                            webSocket.send(chunks)
                        
                    

或任何其他要验证的变量,应用程序会永久停止运行。如何停止将其发送到服务器?如何停止录制?如何在接收器中播放这些块?如何将整个文件保存在 .wav 中?

感谢开发者!

【问题讨论】:

你应该为此实现协程! 谢谢!我去看看!我真的很高兴你的生活。祝福! 【参考方案1】:

如果您使用 kotlin,最佳方式是使用协程,但如果您不希望这是使用线程执行此操作的经典方式:

btn_send.setOnTouchListener(object : View.OnTouchListener 
override fun onTouch(v: View?, event: MotionEvent?): Boolean 
var thread?=null
                  when (event?.action) 
                   MotionEvent.ACTION_DOWN -> 
                   Log.i("tou7ch", "apertou")   
                    thread = Thread()
                    override fun run()
                   val buffer = ByteArray(minBufSize)
                        val chunks = buffer.toByteString()
                        audiorecord!!.startRecording()
    
                        val number = audiorecord!!.read(buffer, 0, minBufSize)
                        for (i in 0 until number) 
                            webSocket.send(chunks)
                        
                    
                    MotionEvent.ACTION_UP -> 
                        Log.i("tou7ch", "soltou")
                        audiorecord?.stop();
                        thread.interrupt();
                    
                
                  
               

  

            return v?.onTouchEvent(event) ?: true
        
    )

【讨论】:

谢谢!我会尝试协程。 高级Patel,使用协程,应用程序停止中断,但我在 while(isActive) 时仍然遇到问题。这使应用程序崩溃。如何停止发送块? 请将您的日志发布在应用程序崩溃的地方,有时当您安装错误版本的协程时会导致应用程序崩溃 在你的情况下,因为你没有经验,你可以使用经典线程方法

以上是关于在 Kotlin 上按下按钮时如何停止录制 AudioRecord的主要内容,如果未能解决你的问题,请参考以下文章

在父活动上按下后退按钮

win10怎么关闭xbox录制

如何通过在不同的视图控制器上按下按钮来更改 tableview 数据?

仅在 iOS 8+ 上按下 beginSeekingForward 时 MPMoviePlayerController 停止/冻结视频

在Android上按下后退按钮时Runnable线程会发生啥?

如果在对话框上按下按钮,如何启动活动