android中的AudioRecorder使用python

Posted

技术标签:

【中文标题】android中的AudioRecorder使用python【英文标题】:AudioRecorder in android using python 【发布时间】:2021-12-21 14:24:56 【问题描述】:

我有一个问题:

这是我点击kivy按钮后的运行功能

而且我知道 time.sleep 在这里使用不当,但我怎么可能 换吗?

from jnius import autoclass

    def run(self):
        self.r = MyRecorder()
        self.r.mRecorder.prepare()
        self.r.mRecorder.start()
        self.console.text += "Recording.."
        time.sleep(1)
        self.r.mRecorder.stop()
        self.r.mRecorder.release()
        self.console.text += "Recording stopped.."

这是记录器类(一切正常吗?)

class MyRecorder:
def __init__(self):
    '''Recorder object To access android Hardware'''
    self.MediaRecorder = autoclass('android.media.MediaRecorder')
    self.Audiosource = autoclass('android.media.MediaRecorder$AudioSource')
    self.OutputFormat = autoclass('android.media.MediaRecorder$OutputFormat')
    self.AudioEncoder = autoclass('android.media.MediaRecorder$AudioEncoder')

    # create out recorder
    self.mRecorder = self.MediaRecorder()
    self.mRecorder.setAudioSource(self.AudioSource.MIC)
    self.mRecorder.setOutputFormat(self.OutputFormat.THREE_GPP)
    self.mRecorder.setAudioEncoder(self.AudioEncoder.AMR_NB)
    self.mRecorder.setOutputFile('./MYAUDIO.3gp')

这是我得到的错误:

if child.dispatch('on_touch_down', touch):    File "kivy/_event.pyx", line 709, in kivy._event.EventDispatcher.dispatch    File "/data/user/0/ru.iiec.pydroid3/files/aarch64-linux-android/lib/python3.9/site-packages/kivy/uix/behaviors/button.py", line 151, in on_touch_down
     self.dispatch('on_press')    File "kivy/_event.pyx", line 705, in kivy._event.EventDispatcher.dispatch    File "kivy/_event.pyx", line 1248, in kivy._event.EventObservers.dispatch    File "kivy/_event.pyx", line 1132, in kivy._event.EventObservers._dispatch  File "/data/user/0/ru.iiec.pydroid3/files/aarch64-linux-android/lib/python3.9/site-packages/kivy/lang/builder.py", line 57, in custom_callback
     exec(kvlang.co_value, idmap)    File "/storage/emulated/0/python/my.kv", line 6, in <module>
     on_press: root.run()    File "/storage/emulated/0/python/main.py", line 51, in run
     startRecording(self)    File "/storage/emulated/0/python/main.py", line 139, in init
     self.mRecorder.setOutputFile('./MYAUDIO.3gp')    File "jnius/jnius_export_class.pxi", line 857, in jnius.jnius.JavaMethod.call    File "jnius/jnius_export_class.pxi", line 954, in jnius.jnius.JavaMethod.call_method    File "jnius/jnius_utils.pxi", line 91, in jnius.jnius.check_exception  jnius.jnius.JavaException: JVM exception occurred: setAudioSource failed. java.lang.RuntimeException

谁能帮帮我?谢谢!

【问题讨论】:

【参考方案1】:

我在 Kivy 方面没有太多经验,但根据我开发一些原生 Android 应用程序的经验,您似乎没有要求对您的代码进行录制音频权限。

Based on this video(从 27:48 开始),您需要在您的代码上请求访问权限,例如:

from android.permissions import Permission, request_permissions
def callback_func(permission, results):
  if all([res for res in results):
    print("All permissions granted")
  else:
    print("Did not get all permissions")

request_permissions([Permission.RECORD_AUDIO], callback_func)

记得在使用麦克风之前请求录音权限。

你可以读取here的所有权限。

【讨论】:

以上是关于android中的AudioRecorder使用python的主要内容,如果未能解决你的问题,请参考以下文章

APICloud开发者进阶之路 |audioRecorder录音模块Demo

如何在android中录制质量更好的音频文件?

AudioRecorder.getMinBufferSize() 返回 -2

dsp.Audiorecorder的Matlab傅里叶变换实时

MediaRecorder和AudioRecorder,录音和获取分贝

Android音频API