相关:
我的问题是如何从视频文件(例如video.avi)中提取wav音频轨道?我阅读了很多文章,并且人们到处建议使用(从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的利弊吗?(我的意思是使用Python multiprocessing
模块或类似的东西)。
第二个问题。
有没有简单的方法将长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()
ffmpeg
, 但你正在使用的是avconv
。 - llogan