関連:
pythonを使用してビデオファイルからオーディオを抽出する方法
私の質問は、どうすればビデオファイルから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 multiprocessing
モジュールまたは類似のものを使用することを意味します)。
そして2番目の質問
単語を壊さないように長い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 with pythonサブプロセスを使用する非常に簡単なタスクであり、人々がこのソリューションを良いソリューションとして指し示しているのには理由があります。
これは、指定されたビデオファイルからオーディオを抽出する基本的なコマンドです。
ffmpeg -i test.mp4 -ab 160k -ac 2 -ar 44100 -vn audio.wav
Pythonコードはこのコマンドをラップしているだけです:
import subprocess
command = "ffmpeg -i C:/test.mp4 -ab 160k -ac 2 -ar 44100 -vn audio.wav"
subprocess.call(command, Shell=True)
Ffmpegが既知のタスクであることを確認する必要があります。そのため、システム環境変数のpathの下に、ffmpeg.exeへのパスをリストするか、pythonコード。
オーディオクリップは、オーディオファイルまたはビデオファイルのサウンドトラックから作成できます。
from moviepy.editor import *
audioclip = AudioFileClip("some_audiofile.mp3")
audioclip = AudioFileClip("some_video.avi")
https://zulko.github.io/moviepy/getting_started/audioclips.html
これはffmpegよりも使いやすく、python-videoコンバーターと呼ばれ、ビデオからオーディオを抽出するために使用できます https://github.com/senko/python-video-converter =、次のようにmpg123と組み合わせて使用できます
from converter import Converter
import os
c = Converter()
clip = 'clip.avi'
conv = c.convert(clip, 'audio.mp3', {'format':'mp3','audio':{'codec': 'mp3','bitrate':'22050','channels':1}})
for timecode in conv:
pass
os.system("mpg123 -w audio.wav audio.mp3")
コンバーターモジュールはビデオからオーディオを抽出し、mp3ファイルとして保存します。mpg123はmp3ファイルをmp4に変換します。
別の解決策は次のとおりです:python https://github.com/Zulko/moviepy でmoviepyモジュールを使用する
import moviepy.editor as mp
clip = mp.VideoFileClip("video.avi").subclip(0,20)
clip.audio.write_audiofile("theaudio.mp3")
サブクリップ関数内の数字は、オーディオの開始と終了を秒単位で指定します。その後、mpg123を使用して音声を他の形式に変更できます
または例からmp3を抽出
import os
VIDEOS_PATH = '/Users/****/videos'
VIDEOS_EXTENSION = '.webm' # for example
AUDIO_EXT = 'wav'
EXTRACT_VIDEO_COMMAND = ('ffmpeg -i "{from_video_path}" '
'-f {audio_ext} -ab 192000 '
'-vn "{to_audio_path}"')
os.chdir(VIDEOS_PATH)
files = os.listdir(VIDEOS_PATH)
for f in files:
if not f.endswith(VIDEOS_EXTENSION):
continue
audio_file_name = '{}.{}'.format(f, AUDIO_EXT)
command = EXTRACT_VIDEO_COMMAND.format(
from_video_path=f, audio_ext=AUDIO_EXT, to_audio_path=audio_file_name,
)
os.system(command)