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()
- "szybkość" oznacza liczbę próbek pobranych na sekundę.
- "CHUNK" to liczba ramek w buforze.
- każda ramka będzie miała 2 próbki jako "Kanały=2".
- wielkość każdej próbki wynosi 2 bajty, obliczana za pomocą funkcji:
pyaudio.get_sample_size(pyaudio.paInt16)
. - dlatego rozmiar każdej klatki wynosi 4 bajty.
- 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])
zwraca4133
, alelen(frames[0])
zwraca4096
. -
for
loop wykonujeint(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ówiCHUNK=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. - 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łustruct
? 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ć.
8
1 answers
- " szybkość "to" częstotliwość próbkowania", tzn. liczba klatek na sekundę
- "CHUNK" to (dowolnie wybrana) liczba ramek (potencjalnie bardzo długie) sygnały są podzielone na w tym przykładzie
- 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)
- Tak, rozmiar każdej próbki wynosi 2 bajty (= 16 bitów) w tym przykładzie
- Tak, rozmiar każdej klatki jest 4 bajty
- 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. -
RATE * RECORD_SECONDS
jest liczbą klatek , które należy zapisać. Ponieważ pętlafor
nie jest powtarzana dla każdej klatki , ale tylko dla każdego fragmentu , liczba pętli musi być podzielona przez rozmiar fragmentuCHUNK
. To nie ma nic wspólnego z próbkami , nie ma więc żadnego czynnika2
. - 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łemstruct
.
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
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