我有这种有趣的情况,我希望通过ffmpeg
使用subprocess.check_call()
转换大量音频片段,然后使用pygame.mixer.music.play()
播放它们。
但是因为在转换所有文件时会有很多小文件,我想每次都覆盖它,称之为tmp.wav
。
转换如下:
outfilename = "tmp.wav"
proc_args = ["ffmpeg"]
proc_args += ["-ss", str(begin / 1000)]
proc_args += ["-i", os.path.join(audiodir, infilename)]
proc_args += ["-to", str(duration / 1000)]
proc_args += ["-ar", str(AUDIORATE)] # sample frequency (audio rate)
proc_args += ["-y"]
proc_args += [outfilename]
DEVNULL = open(os.devnull, 'wb')
try:
subprocess.check_call(proc_args, stdout = DEVNULL, stderr = DEVNULL)
# print "Converting audio succeeded."
except subprocess.CalledProcessError as e:
print "Converting audio failed."
return 0.
播放如下:
pygame.mixer.music.load(outfilename)
pygame.mixer.music.play()
现在,出现了一个问题。第一个文件被转换并正确播放。但是当跳到下一个文件时,tmp.wav
无法覆盖。我认为这是因为文件仍然在音乐模块中打开,但是没有说明如何关闭文件。在转换新文件之前,我已经尝试了pygame.mixer.music.stop()
,pygame.mixer.quit()
和pygame.mixer.stop()
,但没有一个能够正常运行。
如何解决这个问题?