[英]Python extract wav from video file
有关的:
我的问题是如何从视频文件中提取 wav 音轨,比如video.avi
? 我读了很多文章,到处都有人建议使用(来自 Python) ffmpeg
作为子PyFFmpeg
(因为没有可靠的 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和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 是一个已知任务,所以在你的系统环境变量中,在路径下,应该列出 ffmpeg.exe 的路径,或者你可以在你的 python 代码中使用 exe 的完整路径。
这可能比 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")
subclip 函数中的数字指定音频的开始和结束,以秒为单位。 然后您可以使用 mpg123 将音频更改为任何其他格式
可以从音频文件或视频文件的配乐创建音频剪辑
from moviepy.editor import *
audioclip = AudioFileClip("some_audiofile.mp3")
audioclip = AudioFileClip("some_video.avi")
https://zulko.github.io/moviepy/getting_started/audioclips.html
或例如从中提取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)
FFmpeg 是最著名的多媒体框架之一,广泛用于处理视频。 为了对视频进行编码,当然必须使用视频编码器。 有关更多信息,请使用: http : //machinelearninguru.com/computer_vision/video_processing/ffmpeg_extract_audio/ffmpeg_audio_extract.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.