簡體   English   中英

Pyaudio錄音多個小時

[英]Pyaudio recording for multiple hours

我正在嘗試一次錄制我的麥克風多個(~12)小時。 當我嘗試關閉 stream 時出現結構錯誤,但它僅在長時間錄制后發生。

這是我的代碼:

import pyaudio
import wave

import sys

import keyboard


if __name__ == '__main__':
    print('recording')

    CHUNK = 1024
    FORMAT = pyaudio.paInt16
    CHANNELS = 2
    RATE = 44100
    RECORD_SECONDS = 5
    WAVE_OUTPUT_FILENAME = "raw_radio.wav"

    p = pyaudio.PyAudio()

    stream = p.open(format=FORMAT,
                    channels=CHANNELS,
                    rate=RATE,
                    input=True,
                    frames_per_buffer=CHUNK)

    frames = []

    flag = False
    try:
        while(not flag and sys.getsizeof(frames) < sys.maxsize * .8):
            for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
                try:
                    data = stream.read(CHUNK)
                    frames.append(data)
                except Exception as e:
                    print(e)
                    flag=True
    except KeyboardInterrupt:
        print('ended recording, now saving')
        pass

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

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

這是標准輸出:

recording
ended recording, now saving
Traceback (most recent call last):
  File ".\record_mic.py", line 54, in <module>
    wf.writeframes(b''.join(frames))
  File "C:\Users\Ben\AppData\Local\Programs\Python\Python36\lib\wave.py", line 427, in writeframes
    self.writeframesraw(data)
  File "C:\Users\Ben\AppData\Local\Programs\Python\Python36\lib\wave.py", line 416, in writeframesraw
    self._ensure_header_written(len(data))
  File "C:\Users\Ben\AppData\Local\Programs\Python\Python36\lib\wave.py", line 457, in _ensure_header_written
    self._write_header(datasize)
  File "C:\Users\Ben\AppData\Local\Programs\Python\Python36\lib\wave.py", line 474, in _write_header
    self._sampwidth * 8, b'data'))
struct.error: argument out of range
Exception ignored in: <bound method Wave_write.__del__ of <wave.Wave_write object at 0x000001CA028A5FD0>>
Traceback (most recent call last):
  File "C:\Users\Ben\AppData\Local\Programs\Python\Python36\lib\wave.py", line 316, in __del__
  File "C:\Users\Ben\AppData\Local\Programs\Python\Python36\lib\wave.py", line 434, in close
  File "C:\Users\Ben\AppData\Local\Programs\Python\Python36\lib\wave.py", line 457, in _ensure_header_written
  File "C:\Users\Ben\AppData\Local\Programs\Python\Python36\lib\wave.py", line 474, in _write_header
struct.error: argument out of range

我在想,因為我必須按兩次 Ctrl+C 才能引發 KeyboardInput 錯誤,所以我正在做一些錯誤編輯幀列表的事情。

您正在嘗試編寫一個比波形格式可以在一個 WAVE 塊中表示的更長的波形文件。

(我不確定是否允許 RIFF 文件包含多個 WAVE 塊,也不確定是否允許支持具有多個 WAVE 塊的 RIFF 文件。但是 wave 模塊可以讀取它們。它只是不能寫入它們。如果那時就是這樣,波形文件的長度沒有實際限制。)

您正在嘗試一次寫入 2*44100*2*(12*3600)==7620480000 或 7.3GB。

發生異常的代碼是:

        self._file.write(struct.pack('<L4s4sLHHLLHH4s',
            36 + self._datalength, b'WAVE', b'fmt ', 16,
            WAVE_FORMAT_PCM, self._nchannels, self._framerate,
            self._nchannels * self._framerate * self._sampwidth,
            self._nchannels * self._sampwidth,
            self._sampwidth * 8, b'data'))

這將寫入波形塊 header。 第一個 L 是數據長度加上 header 將數據限制為 4294967259 字節。 這是 4GB - 36 字節

將文件分塊寫入到單獨的文件中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM