比如我希望播放一个音频文件的1234毫秒-7890毫秒之间的音频
目前我试过QMediaPlayer只有setPosition能设置开始时间,不能设置停止时间,测试了一下positionChanged信号,精度太低了,只有100ms 我需要更高的精度
目前我用的是ffmpeg-python,但是需要新建一个线程,避免阻塞了QT界面,先裁切再播放,代码写得挺磨叽的,啰啰嗦嗦一大堆
请问有没有更优的方案
比如我希望播放一个音频文件的1234毫秒-7890毫秒之间的音频
目前我试过QMediaPlayer只有setPosition能设置开始时间,不能设置停止时间,测试了一下positionChanged信号,精度太低了,只有100ms 我需要更高的精度
目前我用的是ffmpeg-python,但是需要新建一个线程,避免阻塞了QT界面,先裁切再播放,代码写得挺磨叽的,啰啰嗦嗦一大堆
请问有没有更优的方案
好的,这是一个使用pydub
库来播放音频文件特定部分的Python代码。请确保已经安装了pydub
和simpleaudio
库。如果没有安装,你可以使用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,换一种更高效率的语言写