Ce sont des morceaux, des échantillons et des images lors de l'utilisation de pyaudio
Après la documentation de pyaudio et de la lecture de certains articles sur le web, je suis confus si ma compréhension est correcte.
C'est le code pour l'enregistrement audio trouvé sur pyaudio du site:
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()
et si j'ajoute ces lignes alors que je suis en mesure de jouer tout ce que j'ai enregistré:
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()
- "TAUX" est le nombre d'échantillons prélevés par seconde.
- "BLOC" est le nombre d'images dans la mémoire tampon.
- Chaque image aura 2 échantillons comme des "CANAUX=2".
- La taille de chaque échantillon est de 2 octets, calculée à l'aide de la fonction:
pyaudio.get_sample_size(pyaudio.paInt16)
. - Donc la taille de chaque image est de 4 octets.
- Dans les "cadres" de la liste, la taille de chaque élément doit être de 1024*4 octets, par exemple, la taille de
frames[0]
doit être de 4096 octets. Cependant,
sys.getsizeof(frames[0])
retourne4133
, maislen(frames[0])
retourne4096
. for
boucle s'exécuteint(RATE /CHUNK * RECORD_SECONDS)
fois, je ne peux pas comprendre pourquoi. Ici est la même réponse à la question par "Ruben Sanchez" mais je ne peux pas être sûr si son correct comme il le ditCHUNK=bytes
. Et selon ses explications, il doit êtreint(RATE /(CHUNK*2) * RECORD_SECONDS)
comme(CHUNK*2)
est le nombre d'échantillons lire dans un tampon à chaque itération.- Enfin, quand j'écris
print frames[0]
, il imprime le charabia qu'il essaie de traiter la chaîne ASCII codé qui elle ne l'est pas, c'est juste un flux d'octets. Alors, comment puis-je imprimer ce flux d'octets en hexadécimal en utilisantstruct
module? Et si plus tard, j'ai chaque changement de la valeur hexadécimale avec les valeurs de mon choix, il sera toujours produire un jouable de son?
Ce que j'ai écrit ci-dessus a été ma compréhension des choses et beaucoup d'entre eux peut-être tort.
OriginalL'auteur shiva | 2016-03-13
Vous devez vous connecter pour publier un commentaire.
sys.getsizeof()
rapports à l'espace de stockage requis par l'interpréteur Python, qui est généralement un peu plus que la taille réelle des données brutes.RATE * RECORD_SECONDS
est le nombre de cadres qui doit être enregistré. Depuis lefor
boucle n'est pas répétée pour chaque cadre mais seulement pour chaque morceau, le nombre de boucles doit être divisé par la taille de segmentCHUNK
. Cela n'a rien à voir avec échantillons, donc il n'y a pas de facteur de2
impliqués.[hex(x) for x in frames[0]]
. Si vous voulez obtenir le réel 2 octets utiliser la chaîne de format'<H'
avec lestruct
module.Vous pourriez être intéressé à mon tutoriel sur la lecture des fichiers WAV avec la
wave
module, qui couvre certaines de vos questions dans plus de détail: http://nbviewer.jupyter.org/github/mgeier/python-audio/blob/master/audio-files/audio-files-with-wave.ipynbAvec PyAudio les échantillons sont entrelacés. Le sous-jacent PortAudio bibliothèque prend en charge un drapeau paNonInterleaved pour changer les choses, mais ce n'est généralement pas disponible dans les wrappers Python. Notez que
paNonInterleaved
utilise distinct des pointeurs pour chaque canal, c'est à dire l'ensemble des données audio n'est pas nécessairement contenue dans un seul bloc contigu de mémoire.OriginalL'auteur Matthias