用python代码编写播放并且切割wav音频且带有进度条的代码
时间: 2023-12-25 14:23:32 浏览: 150
python 实现播放wav文件
由于进度条的实现方式与具体的GUI框架相关,这里提供一种基于tkinter实现的简单进度条,同时使用wave库来播放和切割wav音频文件。代码如下:
```python
import tkinter as tk
from tkinter import ttk
import wave
import threading
import time
class AudioPlayer:
def __init__(self, file_path, start_time=0, end_time=None):
self.file_path = file_path
self.start_time = start_time
self.end_time = end_time
self.playing = False
self.thread = None
def play(self):
self.playing = True
self.thread = threading.Thread(target=self._play_thread)
self.thread.start()
def stop(self):
self.playing = False
def _play_thread(self):
with wave.open(self.file_path, 'rb') as f:
frames = f.readframes(f.getnframes())
framerate = f.getframerate()
if self.end_time is not None:
end_frame = int(self.end_time * framerate)
frames = frames[:end_frame]
if self.start_time > 0:
start_frame = int(self.start_time * framerate)
frames = frames[start_frame:]
with wave.open('/dev/dsp', 'wb') as out:
out.setnchannels(f.getnchannels())
out.setsampwidth(f.getsampwidth())
out.setframerate(f.getframerate())
out.writeframes(frames)
def get_duration(self):
with wave.open(self.file_path, 'rb') as f:
return f.getnframes() / f.getframerate()
class AudioPlayerUI:
def __init__(self, file_path):
self.player = AudioPlayer(file_path)
self.duration = self.player.get_duration()
self.window = tk.Tk()
self.window.title('Audio Player')
self.progress_bar = ttk.Progressbar(self.window, orient='horizontal', length=300, mode='determinate')
self.progress_bar.pack(pady=10)
self.play_button = tk.Button(self.window, text='Play', command=self._play_button_click)
self.play_button.pack(side='left', padx=10)
self.stop_button = tk.Button(self.window, text='Stop', command=self._stop_button_click)
self.stop_button.pack(side='left', padx=10)
self.window.protocol('WM_DELETE_WINDOW', self._on_window_close)
def _play_button_click(self):
self.player.play()
self._update_progress_bar()
def _stop_button_click(self):
self.player.stop()
def _on_window_close(self):
self.player.stop()
self.window.destroy()
def _update_progress_bar(self):
if self.player.playing:
current_time = self.player.start_time + time.time() - self.player.thread.start_time()
self.progress_bar['value'] = current_time / self.duration * 100
self.window.after(100, self._update_progress_bar)
def run(self):
self.window.mainloop()
if __name__ == '__main__':
player_ui = AudioPlayerUI('test.wav')
player_ui.run()
```
这个代码包含了两个类:`AudioPlayer`和`AudioPlayerUI`。`AudioPlayer`类负责实际的音频播放和切割,而`AudioPlayerUI`类则继承了`AudioPlayer`类,并在其基础上实现了一个简单的GUI界面,包括进度条和播放/停止按钮。
具体来说,`AudioPlayer`类的`play`方法会启动一个新的线程,调用`_play_thread`方法来实现音频的播放和切割。`_play_thread`方法会使用wave库打开音频文件,并根据指定的起始时间和结束时间来读取需要播放的音频数据。然后,它使用wave库打开系统音频设备`/dev/dsp`,并将读取的音频数据写入该设备,从而实现音频的播放。
`AudioPlayerUI`类则使用tkinter库实现了一个基本的GUI界面。在构造函数中,它创建了一个进度条和两个按钮:播放按钮和停止按钮。播放按钮的回调函数会调用`AudioPlayer`对象的`play`方法,从而启动音频播放。停止按钮的回调函数会调用`AudioPlayer`对象的`stop`方法,从而停止音频播放。此外,`AudioPlayerUI`类还实现了一个`_update_progress_bar`方法,用于实时更新进度条的进度。该方法会使用`after`方法在100毫秒后再次调用自身,从而实现定时更新进度条的功能。
最后,在`if __name__ == '__main__'`语句块中,我们创建了一个`AudioPlayerUI`对象,并调用其`run`方法来启动GUI界面。你可以将`test.wav`替换为你自己的音频文件路径。
阅读全文