从视频文件提取wav音频

38 投票
5 回答
92881 浏览
提问于 2025-05-01 14:43

相关内容:

如何用Python从视频文件中提取音频?

将视频中的音频提取为wav格式

如何从视频中提取音频?

我的问题是,如何从视频文件中提取wav音轨,比如说video.avi?我看了很多文章,大家都建议用ffmpeg这个工具在Python中作为一个子进程来使用(因为没有可靠的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()
暂无标签

5 个回答

0

使用librosa和soundfile

你可以使用像librosa和soundfile这样的包,下面的代码可以帮助你从视频文件中提取音频。

import librosa
import soundfile as sf
def extract_audio_from_video(video_path,audio_save_path):
   audio , sr = librosa.load(video_path)
   sf.write(audio_path,audio,sr)
extract_audio_from_video("video.mp4","audio.wav")

librosa soundfile

1

比如说,从中提取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)
9

音频片段可以从音频文件或者视频文件的声音轨道中创建。

from moviepy.editor import *
audioclip = AudioFileClip("some_audiofile.mp3")
audioclip = AudioFileClip("some_video.avi")

https://zulko.github.io/moviepy/getting_started/audioclips.html

10

这个工具比ffmpeg更好用,叫做python-video converter,可以用来从视频中提取音频,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中的moviepy模块,https://github.com/Zulko/moviepy

    import moviepy.editor as mp
    clip = mp.VideoFileClip("video.avi").subclip(0,20)
    clip.audio.write_audiofile("theaudio.mp3")

subclip函数中的数字表示音频的开始和结束时间,单位是秒。然后你可以用mpg123把音频转换成其他格式。

62

使用ffmpegpython的子进程来完成这个任务非常简单,这也是大家推荐这个方法的原因。

下面是从一个视频文件中提取音频的基本命令:

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代码中直接使用ffmpeg.exe的完整路径。

撰写回答