Czym są kawałki, próbki i ramki podczas korzystania z pyaudio

Po przejrzeniu dokumentacji pyaudio i przeczytaniu kilku innych artykułów w Internecie, jestem zdezorientowany, jeśli moje zrozumienie jest poprawne.

To jest kod do nagrywania audio znaleziony na stronie pyaudio:

import pyaudio
import wave

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

p = pyaudio.PyAudio()

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

print("* recording")

frames = []

for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
    data = stream.read(CHUNK)
    frames.append(data)

print("* done recording")

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

A jak dodam te linijki to jestem w stanie odtworzyć to co nagrałem:

play=pyaudio.PyAudio()
stream_play=play.open(format=FORMAT,
                      channels=CHANNELS,
                      rate=RATE,
                      output=True)
for data in frames: 
    stream_play.write(data)
stream_play.stop_stream()
stream_play.close()
play.terminate()
  1. "szybkość" oznacza liczbę próbek pobranych na sekundę.
  2. "CHUNK" to liczba ramek w buforze.
  3. każda ramka będzie miała 2 próbki jako "Kanały=2".
  4. wielkość każdej próbki wynosi 2 bajty, obliczana za pomocą funkcji: pyaudio.get_sample_size(pyaudio.paInt16).
  5. dlatego rozmiar każdej klatki wynosi 4 bajty.
  6. na liście" ramki " rozmiar każdego elementu musi wynosić 1024*4 bajty, na przykład rozmiar frames[0] musi wynosić 4096 bajtów. Jednakże, sys.getsizeof(frames[0]) zwraca 4133, ale len(frames[0]) zwraca 4096.
  7. for loop wykonuje int(RATE / CHUNK * RECORD_SECONDS) razy, nie rozumiem dlaczego. tutaj jest to samo pytanie odpowiedział "Ruben Sanchez", ale nie mogę być pewien, czy to poprawne jak mówi CHUNK=bytes. I zgodnie z jego wyjaśnieniem, musi to być int(RATE / (CHUNK*2) * RECORD_SECONDS), ponieważ (CHUNK*2) jest liczbą próbek odczytywanych w buforze przy każdej iteracji.
  8. W końcu, kiedy piszę print frames[0], wypisuje bełkot, gdy próbuje traktować łańcuch jako zakodowany ASCII, czym nie jest, jest tylko strumieniem bajtów. Jak więc wydrukować ten strumień bajtów w systemie szesnastkowym za pomocą modułu struct? A jeśli później, zmienię każdy z wartości szesnastkowych z wartościami mojego wyboru, będzie nadal produkować grywalne dźwięk?

Cokolwiek napisałem powyżej było moim zrozumieniem rzeczy i wiele z nich może się mylić.

Author: Community, 2016-03-13

1 answers

  1. " szybkość "to" częstotliwość próbkowania", tzn. liczba klatek na sekundę
  2. "CHUNK" to (dowolnie wybrana) liczba ramek (potencjalnie bardzo długie) sygnały są podzielone na w tym przykładzie
  3. Tak, każda ramka będzie miała 2 próbki jako "CHANNELS=2", ale termin "samples" jest rzadko używany w tym kontekście (ponieważ jest mylący)
  4. Tak, rozmiar każdej próbki wynosi 2 bajty (= 16 bitów) w tym przykładzie
  5. Tak, rozmiar każdej klatki jest 4 bajty
  6. tak, każdy element "ramek" powinien mieć 4096 bajtów. sys.getsizeof() zgłasza przestrzeń dyskową potrzebną interpreterowi Pythona, która zazwyczaj jest nieco większa niż rzeczywisty rozmiar nieprzetworzonych danych.
  7. RATE * RECORD_SECONDS jest liczbą klatek , które należy zapisać. Ponieważ pętla fornie jest powtarzana dla każdej klatki , ale tylko dla każdego fragmentu , liczba pętli musi być podzielona przez rozmiar fragmentu CHUNK. To nie ma nic wspólnego z próbkami , nie ma więc żadnego czynnika 2.
  8. jeśli naprawdę chcesz zobaczyć wartości szesnastkowe, możesz spróbować czegoś takiego jak [hex(x) for x in frames[0]]. Jeśli chcesz uzyskać rzeczywiste liczby 2-bajtowe, użyj formatu string '<H' z modułem struct.

Być może zainteresuje cię mój tutorial o czytaniu plików WAV z modułem wave, który szczegółowo omawia niektóre z twoich pytań: http://nbviewer.jupyter.org/github/mgeier/python-audio/blob/master/audio-files/audio-files-with-wave.ipynb

 14
Author: Matthias,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-20 16:18:10