Last active
September 1, 2023 21:35
-
-
Save THeK3nger/3624478 to your computer and use it in GitHub Desktop.
Python Wave Audio Loop
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import os | |
import wave | |
import threading | |
import sys | |
# PyAudio Library | |
import pyaudio | |
class WavePlayerLoop(threading.Thread) : | |
""" | |
A simple class based on PyAudio to play wave loop. | |
It's a threading class. You can play audio while your application | |
continues to do its stuff. :) | |
""" | |
CHUNK = 1024 | |
def __init__(self,filepath,loop=True) : | |
""" | |
Initialize `WavePlayerLoop` class. | |
PARAM: | |
-- filepath (String) : File Path to wave file. | |
-- loop (boolean) : True if you want loop playback. | |
False otherwise. | |
""" | |
super(WavePlayerLoop, self).__init__() | |
self.filepath = os.path.abspath(filepath) | |
self.loop = loop | |
def run(self): | |
# Open Wave File and start play! | |
wf = wave.open(self.filepath, 'rb') | |
player = pyaudio.PyAudio() | |
# Open Output Stream (basen on PyAudio tutorial) | |
stream = player.open(format = player.get_format_from_width(wf.getsampwidth()), | |
channels = wf.getnchannels(), | |
rate = wf.getframerate(), | |
output = True) | |
# PLAYBACK LOOP | |
data = wf.readframes(self.CHUNK) | |
while self.loop : | |
stream.write(data) | |
data = wf.readframes(self.CHUNK) | |
if data == b'' : # If file is over then rewind. | |
wf.rewind() | |
data = wf.readframes(self.CHUNK) | |
stream.close() | |
player.terminate() | |
def play(self) : | |
""" | |
Just another name for self.start() | |
""" | |
self.start() | |
def stop(self) : | |
""" | |
Stop playback. | |
""" | |
self.loop = False |
@leamu no you have to use it outside the class like this:
import os
import wave
import threading
import sys
# PyAudio Library
import pyaudio
class WavePlayerLoop(threading.Thread):
CHUNK = 1024
def __init__(self, filepath, loop=True):
"""
Initialize `WavePlayerLoop` class.
PARAM:
-- filepath (String) : File Path to wave file.
-- loop (boolean) : True if you want loop playback.
False otherwise.
"""
super(WavePlayerLoop, self).__init__()
self.filepath = os.path.abspath(filepath)
self.loop = loop
def run(self):
# Open Wave File and start play!
wf = wave.open(self.filepath, 'rb')
player = pyaudio.PyAudio()
# Open Output Stream (based on PyAudio tutorial)
stream = player.open(format=player.get_format_from_width(wf.getsampwidth()),
channels=wf.getnchannels(),
rate=wf.getframerate(),
output=True)
# PLAYBACK LOOP
data = wf.readframes(self.CHUNK)
while self.loop:
stream.write(data)
data = wf.readframes(self.CHUNK)
if data == b'': # If file is over then rewind.
wf.rewind()
data = wf.readframes(self.CHUNK)
stream.close()
player.terminate()
def play(self):
"""
Just another name for self.start()
"""
self.start()
def stop(self):
"""
Stop playback.
"""
self.loop = False
player = WavePlayerLoop("sounds/1.wav")
player.play()
I also wanted to ask that, how can we play all the songs from a particular folder, in python because as a beginner I'm facing a problem with that,
currently, I'm using the code -
elif 'play some music' in query:
music_dir = 'D:\Music'
songs = os.listdir(music_dir)
print(songs)
os.startfile(os.path.join(music_dir, songs[0]))
But this only plays the 1st song, [0]
if anyone knows - how to play all the songs then, please help,
thanks
insta - im__ace_
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Hello, i have the same problem:
Do I have to insert the file AND my local file path here?
def run(self):
# Open Wave File and start play!
wf = wave.open(self.filepath, 'rb')
player = pyaudio.PyAudio()
I tried different options but nothing is working..