2017-01-27 30 views
6

Próbuję wykonać prostą aplikację GUI, która ma tylko jeden przycisk: Nagrywanie.Przepełnienie wejścia IOError: Nagrywanie dźwięku z interfejsem Tkintera

Po naciśnięciu przycisku rozpocznie się nagrywanie. Po zwolnieniu przycisku nagrywanie zostaje zatrzymane, a nagranie zostaje zapisane.

Jednak pojawia się następujący błąd po kliknięciu przycisku:

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 

Jednak nie mają problemy z nagraniem prosty dźwięk bez przycisku i Tkinter (na przykład kod dają here) .

Jest to kod:

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() 

Próbowałem zmienić self.CHUNK i self.RATE. Wewnętrzny mikrofon mojego iMaca mówi, że jest to 44100. W niektórych miejscach czytałem, że powinienem zmienić porcję lub wartość stawki, próbowałem obu, ale nikt nie pomógł. Innym miejscem, powiedział mi, aby dodać wersję except IOError as ex: (...)


PyAudio: 0.2.10

pyaudio.get_portaudio_version(): 1246720

pyaudio.get_portaudio_version_text(): PortAudio V19.6.0-devel, rewizja 396fe4b6699ae929d3a685b3ef8a7e97396139a4

Tkinter.__version__: $ Wersja: 81008 $


Byłbym wdzięczny za pomoc, dzięki!

+0

Po uruchomieniu nagrania wyłącz niektóre elementy/funkcje dla "ponownego wywołania". '__init__' wywołanie urządzenia i inne wywołanie funkcji do. 'self.stream = None' later (w funkcji)' self.stream = self.p.open (format = self.FORMAT, .............. ', Masz pojedynczą rurę na każdym procesie: – dsgdfg

+0

@dsgdfg Czy możesz wyjaśnić lepiej? Nie rozumiem, jak mogę to naprawić. –

Odpowiedz

1

Która wersja python/tk/portaudio/pyaudio?

Potwierdzam, że twój kod jest dobry (bez problemu) pod Ubuntu 14.04 LTS x64 (Python 2.7 z portaudio19-dev i PyAudio-0.2.10), więc zakładam, że problem może być względny w stosunku do twojego python, tk, pyaudio lub portaudio wersja ...

Czy na pewno masz zainstalowaną na komputerze najnowszą wersję dysku portaudio & tk?

+0

Wymagana aktualizacja wersji na portaudio (patrz tutaj: https://trac.macports.org/ticket/39150 => "Uaktualniłem dziś rano moja instalacja portaudio do nowej wersji 19.20140130 i naprawiła problem w moim systemie ") –

+0

Edytowałem moje pytanie dodając * wersje * wszystkiego, co cię zastanowiło. Co więcej, zaktualizowałem' portaudio' do 'V19.6.0- devel' i wciąż ten sam problem: –

+0

@ASTEFANI która aplikacja zarządza '' 'strumieniem dźwięku'? Na Ubuntu wymaga enumaratora procesu do utworzenia strumienia urządzenia.To pytanie oznacza 'otwarcie urządzenia skrętu lub gdzie mój identyfikator urządzenia?' – dsgdfg

Powiązane problemy