Java 如何使用python/kivy在Android上获得音频(麦克风)输入

Java 如何使用python/kivy在Android上获得音频(麦克风)输入,java,python,android,kivy,pyjnius,Java,Python,Android,Kivy,Pyjnius,来自访问者的编辑:目前关于这种情况的共识似乎是,Kivy目前不支持麦克风,我们请求人们帮助将“audiostream”附加组件向前移植,以便再次工作。任何微小的工作,以帮助这是非常感谢。更多信息见下文 我试着让麦克风在android上工作,我主要使用kivy和buildozer 我用audiostream获得了工作音频,但是该模块太过时了,如果使用输入“录制”,它将无法再工作。我无法在pc上进行录制,因为我使用录制功能时,它会说“不受支持”,文档中只提到移动设备,所以没问题。在这些平台上,它可以

来自访问者的编辑:目前关于这种情况的共识似乎是,Kivy目前不支持麦克风,我们请求人们帮助将“audiostream”附加组件向前移植,以便再次工作。任何微小的工作,以帮助这是非常感谢。更多信息见下文

我试着让麦克风在android上工作,我主要使用kivy和buildozer 我用audiostream获得了工作音频,但是该模块太过时了,如果使用输入“录制”,它将无法再工作。我无法在pc上进行录制,因为我使用录制功能时,它会说“不受支持”,文档中只提到移动设备,所以没问题。在这些平台上,它可以用pyaudio替换

我试着搜索我可以使用的其他选项,所以我遇到了pyjnius和MediaRecorder,我对java非常熟悉,(并且尝试学习python atm,在那里也是新手),所以我无法让它工作。 问题在于,我需要将所有麦克风数据转换成字节,这对于pyaudio来说很容易,而且可以正常工作。我在这里的原因是,pyaudio在android上不起作用(至少我还没有尝试将库编译到android上,我知道这可能是可能的,但有很多工作要做。)

下面是我必须尝试使其工作的代码:

            MediaRecorder = autoclass('android.media.MediaRecorder')
            AudioSource = autoclass('android.media.MediaRecorder$AudioSource')
            OutputFormat = autoclass('android.media.MediaRecorder$OutputFormat')
            AudioEncoder = autoclass('android.media.MediaRecorder$AudioEncoder')
            FileOutputStream = autoclass('java.io.FileOutputStream')
            gaindata = io.BytesIO()
    
            mRecorder = MediaRecorder()
            mRecorder.setAudioSource(AudioSource.MIC)
            mRecorder.setOutputFormat(OutputFormat.THREE_GPP)

            mRecorder.setOutputFile(gaindata.getBytes())
            mRecorder.setAudioEncoder(AudioEncoder.AMR_NB)
            mRecorder.prepare()
我知道FileDescriptor有一些东西,有一些例子,但它们都在字符串上有空格,所以我不知道如何将它们转换为python。。我想要的就是setOutputFile->Gainanda

如果还有其他选择,我需要麦克风的bytesIO数据(首选8000、单声道、无头原始wav或GSM6.10),我将使用声音文件(是的,我编译了libsndfile.so到arm)将其转换为GSM6.10,并将其放入socket,这是一个VoIP应用程序。

audiostream audiostream也使用pyjnius

我认为最好的方法是修复audiostream,这样其他人也可以使用它,因为在kivy的文档中提到了使用它:

或者提取项目的核心功能以便使用

pyaudio 我发现使用麦克风的另一个项目是 它使用pyaudio

但我不知道这在android上是否有效。如果没有你的评论,我会认为它是有效的,因为有人创建了一个kivy应用程序来使用它

audiostream audiostream也使用pyjnius

我认为最好的方法是修复audiostream,这样其他人也可以使用它,因为在kivy的文档中提到了使用它:

或者提取项目的核心功能以便使用

pyaudio 我发现使用麦克风的另一个项目是 它使用pyaudio

但我不知道这在android上是否有效。如果没有你的评论,我会认为它是有效的,因为有人创建了一个kivy应用程序来使用它


谢谢你的回答。audiostream,嗯,它出错了导入错误:dlopen失败:找不到符号“SDL\u ANDROID\u GetJNIEnv”不知道从那里开始修复什么。。pyaudio:我们需要portaudio,portaudio没有配方。但我可能可以像在sndfile.so上那样将arm库二进制文件编译到android上。关于安卓系统,我们没有提到过外观识别。。只有kivy。为了修复
SDL\u ANDROID\u GetJNIEnv
错误,我会尝试将audiostream迁移到SDL2,如果它在深入研究后工作正常,它将使用SDL2和recipe,也可以只使用SDL2编译它。所以这不是问题。但是我查看了android_ext.h,这里有
void audiostream_jni_register(){if(!audiostream_jni_registed){JNIEnv*env=SDL_android_GetJNIEnv();jclass cls=(*env)->FindClass(env,“org/audiostream/AudioIn”);(*env)->注册表项(env,cls,methods,sizeof(methods)/sizeof(方法[0]);audiostream_jni_registed=1;}
org/audi。。尝试添加android,可能无法找到AudioIn或其他文件。。嗯,修改你的问题,这样更容易帮助。谢谢你的回答。audiostream,嗯,它出错了导入错误:dlopen失败:找不到符号“SDL\u ANDROID\u GetJNIEnv”不知道从那里开始修复什么。。pyaudio:我们需要portaudio,portaudio没有配方。但我可能可以像在sndfile.so上那样将arm库二进制文件编译到android上。关于安卓系统,我们没有提到过外观识别。。只有kivy。为了修复
SDL\u ANDROID\u GetJNIEnv
错误,我会尝试将audiostream迁移到SDL2,如果它在深入研究后工作正常,它将使用SDL2和recipe,也可以只使用SDL2编译它。所以这不是问题。但是我查看了android_ext.h,这里有
void audiostream_jni_register(){if(!audiostream_jni_registed){JNIEnv*env=SDL_android_GetJNIEnv();jclass cls=(*env)->FindClass(env,“org/audiostream/AudioIn”);(*env)->注册表项(env,cls,methods,sizeof(methods)/sizeof(方法[0]);audiostream_jni_registed=1;}
org/audi。。尝试添加android,可能无法找到AudioIn或其他文件。。嗯,修改你的问题,这样更容易帮助你
from jnius import autoclass
    AudioIn = autoclass('org.audiostream.AudioIn') 
Note
The core audio library does not support recording audio. If you require this functionality, please refer to the audiostream extension.