web-dev-qa-db-ja.com

Python動画ファイルからwavを抽出

関連:

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 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()
18
xolodec

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コード。

29
user1767754

オーディオクリップは、オーディオファイルまたはビデオファイルのサウンドトラックから作成できます。

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を使用して音声を他の形式に変更できます

4
programmer44

または例から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)
0
Nick Korolkov