我读过已回答的类似问题:
这是我的窗口:
问题是当计数器还有 20% 的时候歌曲结束。我知道原因主要是由于系统调用检查进程是否仍然pgrep ffplay
每秒运行 10 次。次要原因仅仅是 Python 和 Tkinter 开销。
为了“创可贴修复”问题,我使用了1.24
分秒而不是1
每分秒,正如我的代码现在说明的那样:
def play_to_end(self):
'''
Play single song, checking status every decisecond
Called from:
self.play_forever() to start a new song
self.pp_toggle() to restart song after pausing
'''
while True:
if not self.top2_is_active: return # Play window closed?
root.update() # Process other events
if self.pp_state is "Paused":
time.sleep(.1) # Wait until playing
continue
PID = os.popen("pgrep ffplay").read() # Get PID for ffplay
if len(PID) < 2: # Has song ended?
return # Song has ended
#self.current_song_time += .1 # Add decisecond
self.current_song_time += .124 # Add 1.24 deciseconds
# compensatation .24
self.current_progress.set(str('%.1f' % self.current_song_time) + \
" seconds of: " + str(self.DurationSecs))
root.update() # Process other events
root.after(100) # Sleep 1 decisecond
这个创可贴修复的问题是它高度依赖机器。例如,我的机器是 Skylake。此外,它高度依赖于同时运行的其他进程。测试我的机器负载相对较轻:
我如何以编程方式计算损失的时间,以便准确地增加经过的时间?
也许有更好的方法来简单地查询ffplay
歌曲进度?
顺便说一句(我知道一次问两个问题是不受欢迎的)为什么我不能简单地检查是否PID
为空?我尝试过检查等于.rstrip()
或.strip()
之后.read()
无济于事。如果每个程序下都有一个进程 ID,则会行为不端。PID
""
None
ffplay
10