Android Kivy和audiostream,can';t记录

Android Kivy和audiostream,can';t记录,android,python,kivy,Android,Python,Kivy,我正在使用,但无法通过麦克风录制任何内容 def mic_callback(buf): print('got', len(buf)) frames.append(buf) print('size of frames: ' + len(frames)) def bcallback(instance): mic = get_input(callback=mic_callback, source='mic') mic.start() #mic.poll

我正在使用,但无法通过麦克风录制任何内容

def mic_callback(buf):
    print('got', len(buf))
    frames.append(buf)
    print('size of frames: ' + len(frames))

def bcallback(instance):
    mic = get_input(callback=mic_callback, source='mic')
    mic.start()
    #mic.poll()
    time.sleep(5)
    mic.stop()

class MyApp(App):
    def build(self):
        btn1 = Button(text='Audio Record')
        btn1.bind(on_press=bcallback)
        return btn1

if name == 'main':
    MyApp().run()
运行这段代码并使用
logcat
我可以看到
mic\u callback
没有工作,因为
logcat
上没有任何打印


我也尝试将源代码更改为
默认值
,但也不起作用。

我有一段代码片段,用于在android上用kivy录制音频。 我没有使用audiostream,但它可能对您的情况很有用。 不幸的是,它没有记录在wav和你 需要安装jnius才能使用代码段

在Player()和Recorder()中传递给play()和start()的按钮只是一个字符串,其中包含Player()和Recorder()正在访问的文件名

import os
from jnius import autoclass

if not os.path.isdir("/sdcard/kivyrecords/"):
    os.mkdir("/sdcard/kivyrecords/")

PATH = "/sdcard/kivyrecords/rec{0}.mp4"

class Player(object):
    def __init__(self):
        # get the MediaPlayer java class
        self.MediaPlayer = autoclass('android.media.MediaPlayer')

    def play(self, button):
        # create our player
        mPlayer = self.MediaPlayer()
        mPlayer.setDataSource(PATH.format(button))
        mPlayer.prepare()
        mPlayer.start()
        if not mPlayer.isPlaying():
            mPlayer.release()

class Recorder(object):
    def __init__(self):
        # get the needed Java classes
        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')

        self.mRecorder = self.MediaRecorder()       

    def start(self, button):
        self.mRecorder.setAudioSource(self.AudioSource.MIC)
        self.mRecorder.setOutputFormat(self.OutputFormat.MPEG_4)
        self.mRecorder.setOutputFile(PATH.format(button))
        self.mRecorder.setAudioEncoder(self.AudioEncoder.HE_AAC)
        self.mRecorder.prepare()

        self.mRecorder.start()

    def stop(self, button):
        time.sleep(0.5)
        self.mRecorder.stop()
        self.mRecorder.release()
        self.mRecorder = self.MediaRecorder()   
编辑:

整个剧本:

#qpy:kivy
'''
Created on 20.06.2015

@author: jan
'''
import kivy
kivy.require('1.0.7') # replace with your current kivy version !

from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.uix.gridlayout import GridLayout        

#from kivy.core.audio import SoundLoader 

from jnius import autoclass

import os
import time

if not os.path.isdir("/sdcard/kivyrecords/"):
    os.mkdir("/sdcard/kivyrecords/")

PATH = "/sdcard/kivyrecords/rec{0}.mp4"

class Player(object):
    def __init__(self):
        # get the MediaPlayer java class
        self.MediaPlayer = autoclass('android.media.MediaPlayer')

    def play(self, button):
        # create our player
        mPlayer = self.MediaPlayer()
        mPlayer.setDataSource(PATH.format(button))
        mPlayer.prepare()
        mPlayer.start()
        if not mPlayer.isPlaying():
            mPlayer.release()

class Recorder(object):
    def __init__(self):
        # get the needed Java classes
        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')

        self.mRecorder = self.MediaRecorder()       

    def start(self, button):
        self.mRecorder.setAudioSource(self.AudioSource.MIC)
        self.mRecorder.setOutputFormat(self.OutputFormat.MPEG_4)
        self.mRecorder.setOutputFile(PATH.format(button))
        self.mRecorder.setAudioEncoder(self.AudioEncoder.HE_AAC)
        self.mRecorder.prepare()

        self.mRecorder.start()

    def stop(self, button):
        time.sleep(0.5)
        self.mRecorder.stop()
        self.mRecorder.release()
        self.mRecorder = self.MediaRecorder()       

PLAY = Player()
REC = Recorder()
RECORDED = {1 : False, 2 : False, 3 : False, 
                        4 : False, 5 : False, 6 : False,
                        7 : False, 8 : False, 9 : False}

class MyGrid(GridLayout):
    def __init__(self):
        super(MyGrid, self).__init__(cols=3, rows=3)

        global REC
        global RECORDED
        global PLAY

        for i in range(1, 10):
            b = Button(text=str(i))
            b.bind(on_press=self.recorplay)
            b.bind(on_release=self.stop)
            self.add_widget(b, i)

    def recorplay(grid, button):
        if not RECORDED[int(button.text)]:
            REC.start(button.text)
        else:
            PLAY.play(button.text)

    def stop(grid, button):
        if not RECORDED[int(button.text)]:
            REC.stop(button.text)   
            RECORDED[int(button.text)] = True

class MyApp(App):
    def build(self):
        return MyGrid()

if __name__ == '__main__':
    MyApp().run()

好的,经过多次尝试和错误,我已经设法让这件事工作。不确定是什么修复了它,可能是缓冲区大小。所以我发现实际上没有调用“mic_回调”,因为队列中没有任何内容。所以问题应该出在音频输入的配置上。这对我很有用(因为我在这里发布了我将使用pastebin的代码):

对于那些在2021年苦苦寻找这个问题答案的人来说,看看kivy的知识库,尤其是与当前问题相关的知识库。

我正在重新格式化你的代码--
如果name=='main'
是错误的,语法是
\uu name.\u=''\ uu main'
。我想知道唯一的问题是你的应用程序甚至没有启动。应用程序启动很好,只生成一个44字节的文件(当然是空的),因为列表帧是空的。我想我已经尝试过这种方法,但我在导入java类时遇到了jnius错误,但是我会尝试一下你的代码并报告结果。这个例子应该在使用qpython的android设备上运行。我编辑我的答案,并将下载链接放到我的原始脚本中。它仍然有一点缺陷,但如果你在安卓设备上运行它,你应该能够录制按下按钮的声音。释放它会停止记录,再次点击按钮会播放记录。希望能有帮助。另外,我通常在Qpython中测试我的kivy脚本。所以,就我所知,在Linux、Windows和Mac上安装jnius是不可能的。我已经测试了你的脚本,它在我的android设备上运行得完美无缺!我更希望跨平台使用audiostream方法,但这比完全不工作要好。谢谢你BigZ:)希望其他人能对你的问题给出一个真实的答案,因为我也想使用audiostream来录制wave。但我很高兴能帮上忙。:)