Python извлекает wav из видеофайла [закрыто]Python

Программы на Python
Anonymous
Python извлекает wav из видеофайла [закрыто]

Сообщение Anonymous »

Связано:
Как извлечь аудио из видеофайла с помощью Python?
Извлечь аудио из видео в формате wav
Как вырезать звук из видео?
Мой вопрос: как я могу извлечь звуковую дорожку 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 (не как подпроцесс командной строки). Не могли бы вы указать на плюсы и минусы запуска ffmpeg из Python в качестве утилиты командной строки? (Я имею в виду использование модуля многопроцессорной обработки Python или чего-то подобного).
И второй вопрос.
Каков простой способ разрезать длинный 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()

Вернуться в «Python»