Python如何精确的播放一段时间范围内的音频

比如我希望播放一个音频文件的1234毫秒-7890毫秒之间的音频
目前我试过QMediaPlayer只有setPosition能设置开始时间,不能设置停止时间,测试了一下positionChanged信号,精度太低了,只有100ms 我需要更高的精度
目前我用的是ffmpeg-python,但是需要新建一个线程,避免阻塞了QT界面,先裁切再播放,代码写得挺磨叽的,啰啰嗦嗦一大堆

请问有没有更优的方案

好的,这是一个使用pydub库来播放音频文件特定部分的Python代码。请确保已经安装了pydubsimpleaudio库。如果没有安装,你可以使用pip来安装:pip install pydub simpleaudio

from pydub import AudioSegment
import simpleaudio as sa

# 加载音频文件
song = AudioSegment.from_file("your_audio_file.mp3")

# 截取1234毫秒到7890毫秒的音频
extract = song[1234:7890]

# 播放截取的音频
play_obj = sa.play_buffer(extract.raw_data, 2, 2, 44100)

# 等待音频播放完毕
play_obj.wait_done()

请将"your_audio_file.mp3"替换为你的音频文件路径。这段代码将会播放该音频文件1234毫秒到7890毫秒之间的部分。注意,这段代码只适用于.mp3格式的音频文件,如果你的音频文件是其他格式,你需要将from_file函数中的.mp3改为相应的格式。例如,对于.wav格式的文件,你应该使用AudioSegment.from_wav("your_audio_file.wav")

此外,这段代码使用了simpleaudio库来播放音频,这个库只支持WAV格式的音频。因此,如果你的音频文件不是WAV格式,可能需要先将其转换为WAV格式才能播放。你可以使用AudioSegment.export()函数来实现这一点。

以上,灵活运用AI。

还有你既然尝试过FFmpeg,为什么不考虑一起的ffplay?

当然可以,你可以使用ffplay来播放音频文件的一部分。以下是一个使用ffplay的命令行示例:

ffplay -ss 1.234 -t 6.656 input.mp3

在这个命令中:

  • input.mp3是你的源音频文件,
  • 1.234是开始时间(以秒为单位),
  • 6.656是播放长度(以秒为单位)。

这个命令将会播放原始音频文件从1.234秒开始的6.656秒的音频。注意,-t参数指定的是播放长度,而不是结束时间,所以这里的值应该是结束时间减去开始时间(7.890 - 1.234 = 6.656)。

我也用chatgpt了 但是pydub实际使用的时候会把所有音频都读进去才能继续操作,从长音频中读取的话太慢了,ffplay这个就是我现在的方法了…

前段时间也在用 python 播放音频,但也遇到不少问题。试了好几个库,都或多或少有些 bug。有些也不能跨平台。在 Windows 上播放,有时可以,有时过一会就突然不能播放了。感觉这些陈年老库都没什么人维护了。

试试vlc 不过需要本地装一个vlc便携包才能调用

那就是并非不能实现,而只是嫌弃性能?

那就别指望py,换一种更高效率的语言写