Related:
如何使用python从视频文件中提取音频? https://stackoverflow.com/questions/19216450/how-to-extract-audio-from-a-video-file-using-python
从视频中提取音频为 wav https://stackoverflow.com/questions/2117488/extract-audio-from-video-as-wav
如何从视频中提取音频? https://stackoverflow.com/questions/5506651/how-to-rip-the-audio-from-a-video
我的问题是如何从视频文件中提取 wav 音轨,例如video.avi
?
我读了很多文章以及人们建议使用的地方(来自Python)ffmpeg
作为子进程(因为没有可靠的 python 绑定到 ffmpeg - 唯一的希望是PyFFmpeg
但我发现它现在无人维护了)。我不知道这是否是正确的解决方案,我正在寻找好的解决方案。
我查看了 gstreamer,发现它很好,但无法满足我的需求——我发现从命令行完成此任务的唯一方法如下
gst-launch-0.10 playbin2 uri=file://`pwd`/ex.mp4 audio-sink='identity single-segment=true ! audioconvert ! audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int)16000, channels=(int)1 ! wavenc ! filesink location=foo.wav’
但它效率不高,因为我在播放视频和同时写入 wav 文件时需要等待很长时间。
ffmpeg
好多了:
avconv -i foo.mp4 -ab 160k -ac 1 -ar 16000 -vn ffaudio.wav
但我无法从 python 启动它(不是作为命令行子进程)。您能否指出从 python 作为命令行实用程序启动 ffmpeg 的优点和缺点? (我的意思是使用 pythonmultiprocessing
模块或类似的东西)。
第二个问题。
有什么简单的方法可以将长 wav 文件切成碎片,这样我就不会打断任何单词?我的意思是 10-20 秒长度的片段,在句子/单词的暂停期间开始和结束?
我知道如何将它们任意分解:
import wave
win= wave.open('ffaudio.wav', 'rb')
wout= wave.open('ffsegment.wav', 'wb')
t0, t1= 2418, 2421 # cut audio between 2413, 2422 seconds
s0, s1= int(t0*win.getframerate()), int(t1*win.getframerate())
win.readframes(s0) # discard
frames= win.readframes(s1-s0)
wout.setparams(win.getparams())
wout.writeframes(frames)
win.close()
wout.close()