<p>mp3play模块<a href="https://github.com/michaelgundlach/mp3play/blob/master/mp3play/windows.py" rel="nofollow noreferrer">uses</a>似乎是Windows <a href="https://msdn.microsoft.com/en-us/library/vs/alm/dd743606(v=vs.85).aspx" rel="nofollow noreferrer">winmm</a>库。具体来说,它使用函数<a href="https://msdn.microsoft.com/en-us/library/vs/alm/dd757161(v=vs.85).aspx" rel="nofollow noreferrer">^{<cd1>}</a>来<a href="https://msdn.microsoft.com/en-us/library/vs/alm/dd743572(v=vs.85).aspx" rel="nofollow noreferrer">control</a>多媒体系统。在</p>
<p>实现您想要的效果的一个方法是使用<a href="https://msdn.microsoft.com/en-us/library/vs/alm/dd798683%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396" rel="nofollow noreferrer">^{<cd2>}</a>命令定期检索当前播放位置并按您的喜好显示它。在</p>
<p>从mp3play库修改<code>AudioClip</code>类的两个版本似乎是最合适的。在</p>
<hr/>
<h2>修改mp3play库</h2>
<h2>类音频剪辑windows.py</h2>
<p>首先,在<a href="https://github.com/michaelgundlach/mp3play/blob/master/mp3play/windows.py#L59" rel="nofollow noreferrer">59 of windows.py</a>行上可以看到一个使用status命令的函数</p>
<pre><code> def _mode(self):
err, buf = self._mci.directsend('status %s mode' % self._alias)
return buf
</code></pre>
<p>我们可以根据这个例子编写一个新函数,它将得到当前的回放位置:</p>
^{pr2}$
<p>此函数将返回一个字符串,该字符串编码表示当前位置(毫秒)的数字。在</p>
<h2>在<strong>init</strong>.py中初始化音频剪辑</h2>
<p>下一步是修改<a href="https://github.com/michaelgundlach/mp3play/blob/master/mp3play/__init__.py#L12" rel="nofollow noreferrer">12 of __init__py</a>行上的<code>AudioClip</code>类,添加以下函数:</p>
<pre><code> def current_position(self):
"""Get current position of clip in milliseconds."""
return int(self._clip.current_position())
</code></pre>
<hr/>
<h2>CLI示例</h2>
<p>现在我们可以用一个简单的脚本进行测试:</p>
<pre><code>import time
import mp3play
clip = mp3play.load(r'test.mp3')
clip.play()
for i in range(5):
print "Position: %d / %d" % (clip.current_position(), clip.milliseconds())
time.sleep(1)
clip.stop()
</code></pre>
<p>控制台输出如下所示:</p>
<pre><code>>python test.py
Position: 0 / 174392
Position: 905 / 174392
Position: 1906 / 174392
Position: 2906 / 174392
Position: 3907 / 174392
</code></pre>
<hr/>
<h2>GUI示例</h2>
<pre><code>import tkinter as tk
from tkinter import ttk
import mp3play
# ================================================================================
def format_duration(ms):
total_s = ms / 1000
total_min = total_s / 60
remain_s = total_s % 60
return "%0d:%02d" % (total_min, remain_s)
# ================================================================================
class SimplePlayer(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
# Variables we use to dynamically update the text of the labels
self.music_title = tk.StringVar()
self.music_progress = tk.StringVar()
self.fr=ttk.Frame()
self.fr.pack(expand=True, fill=tk.BOTH, side=tk.TOP)
# Label to display the song title
self.title_lbl = ttk.Label(self.fr, textvariable = self.music_title)
self.title_lbl.pack()
# Playback progress bar
self.progress_bar = ttk.Progressbar(self.fr, orient='horizontal', mode='determinate', length=500)
self.progress_bar.pack()
# Shows the progress numerically
self.progress_lbl = ttk.Label(self.fr, textvariable = self.music_progress)
self.progress_lbl.pack()
def start(self, music_file):
self.music = mp3play.load(music_file)
# Update the title
self.music_title.set(music_file)
# Start playback
self.music.play()
# Start periodically updating the progress bar and progress label
self.update_progress()
def update_progress(self):
pos_ms = self.music.current_position()
total_ms = self.music.milliseconds()
progress_percent = pos_ms / float(total_ms) * 100
# Update the label
label_text = "%s / %s (%0.2f %%)" % (format_duration(pos_ms), format_duration(total_ms), progress_percent)
self.music_progress.set(label_text)
# Update the progress bar
self.progress_bar["value"] = progress_percent
# Schedule next update in 100ms
self.after(100, self.update_progress)
# ================================================================================
app = SimplePlayer()
app.start('test.mp3')
app.mainloop()
</code></pre>
<p>截图:</p>
<p><img src="https://i.imgur.com/J8rmTgx.png" alt="Screenshot of running GUI example"/></p>