2017-01-27 34 views
6

我正试图做一个简单的GUI应用程序,只有一个按钮:记录IOError输入溢出:使用Tkinter接口录制音频

您按下按钮并开始录制。当您释放按钮时,停止录制并保存录制内容。

不过,我得到以下错误,当我按一下按钮:

Traceback (most recent call last): 
    ... 
    data = self.stream.read(self.CHUNK) 
    File (...), line 608, in read 
    return pa.read_stream(self._stream, num_frames, exception_on_overflow) 
IOError: [Errno -9981] Input overflowed 
Exception in Tkinter callback 

但是我不有记录简单的音频,而按钮的Tkinter(代码示例,他们给here)问题。

这是代码:

import Tkinter as tk 
import pyaudio, wave 

class AppRecording: 
    def __init__(self, root): 
     self.root = root 
     self.mouse_pressed = False 
     recordingButton = tk.Button(root, text = "Record") 
     recordingButton.pack() 
     recordingButton.bind("<ButtonPress-1>", self.OnMouseDown) 
     recordingButton.bind("<ButtonRelease-1>", self.OnMouseUp) 
     self.CHUNK = 1024 
     self.FORMAT = pyaudio.paInt16 
     self.CHANNELS = 2 
     self.RATE = 44100 
     self.WAVE_OUTPUT_FILENAME = "output.wav" 

     self.p = pyaudio.PyAudio() 

     try: self.stream = self.p.open(format=self.FORMAT, 
        channels=self.CHANNELS, 
        rate=self.RATE, 
        input=True, 
        frames_per_buffer=self.CHUNK) 
     except: 
      raise Exception("There is no connected microphone. Check that you connect to the left hole if you have a PC.") 
      return None 

     self.frames = [] 

    def recordFrame(self): 
     try: 
      data = self.stream.read(self.CHUNK) 
      print "after try" 
     except IOError as ex: 
      print "inside except" 
      if ex[1] != pyaudio.paInputOverflowed: 
       print "before raise" 
       raise 
       print "after raise" 

      data = '\x00' * self.CHUNK # or however you choose to handle it, e.g. return None 

     self.frames.append(data) 

    def finishRecording(self): 

     self.stream.stop_stream() 
     self.stream.close() 
     self.p.terminate() 

     wf = wave.open(self.WAVE_OUTPUT_FILENAME, 'wb') 
     wf.setnchannels(self.CHANNELS) 
     wf.setsampwidth(self.p.get_sample_size(self.FORMAT)) 
     wf.setframerate(self.RATE) 
     wf.writeframes(b''.join(self.frames)) 
     wf.close() 

    def OnMouseDown(self, event): 
     self.mouse_pressed = True 
     self.poll() 

    def OnMouseUp(self, event): 
     self.root.after_cancel(self.after_id) 
     print "Finished recording!" 
     self.finishRecording() 

    def poll(self): 
     if self.mouse_pressed: 
      self.recordFrame() 
      self.after_id = self.root.after(1, self.poll) 

root=tk.Tk() 
app = AppRecording(root) 
root.mainloop() 

我试图改变self.CHUNKself.RATE。我的iMac的内部麦克风说速率是44100.在一些地方我读到,我应该改变块或速率值,尝试两种,但没有人帮助。另一个地方叫我加except IOError as ex: (...)


PyAudio版本:0.2.10

pyaudio.get_portaudio_version():1246720

pyaudio.get_portaudio_version_text():PortAudio V19.6.0-devel的,修订396fe4b6699ae929d3a685b3ef8a7e97396139a4

Tkinter.__version__:$修订:81008 $


我会感谢您的帮助,谢谢!

+0

当运行记录禁用某些元素/功能'重新召回'。 '__init__'调用设备并调用另一个函数。 'self.stream = None'后面(在函数下)'self.stream = self.p.open(format = self.FORMAT,..............',你有单管道 – dsgdfg

+0

@dsgdfg你能解释得更好吗?我不知道该如何解决这个问题。 –

回答

1

哪个python/tk/portaudio/pyaudio版本?

我确认你的代码在Ubuntu 14.04 LTS x64(Python 2.7 with portaudio19-dev和PyAudio-0.2.10)下是好的(没问题),所以我认为这个问题可能与你的python,tk,pyaudio或portaudio版本...

您确定您的计算机上安装了最后一个portaudio & tk版本吗?

+0

portaudio version upgrade required(看到这里:https://trac.macports.org/ticket/39150 =>“我升级了今天早上我的portaudio安装到了新版本19.20140130,它解决了我的系统上的问题“) –

+0

我编辑了我的问题,添加了你想知道的所有内容*版本*此外,我更新了'portaudio'到'V19.6.0- devel'仍然是同样的问题 –

+0

@ASTEFANI哪个应用程序可以管理你的'sound stream pipe'?在Ubuntu上需要一个创建设备流的enumarator进程,这个问题意味着'打开设备的转向或者我的设备ID在哪里?' – dsgdfg