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。但我很高兴能帮上忙。:)