Python从视频文件中提取wav

Posted

技术标签:

【中文标题】Python从视频文件中提取wav【英文标题】:Python extract wav from video file 【发布时间】:2014-12-31 16:41:39 【问题描述】:

相关:

How to extract audio from a video file using python?

Extract audio from video as wav

How to rip the audio from a video?

我的问题是如何从视频文件中提取 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 启动它(不是作为命令行子进程)。您能否指出从 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,但您使用的是avconv 请参阅***.com/questions/9477115/…。它们是不同的项目,并且相互替代。 avconv if fork of ffmpeg 这样做是为了与 FFmpeg project 保持距离。 如果您在 ubuntu 中启动 ffmeg,您将看到如下消息:The ffmpeg program is only provided for script compatibility and will be removed in a future release. It has been deprecated in the Libav project to allow for incompatible command line syntax improvements in its replacement called avconv. Please use avconv instead. 按照这里的建议探索moviepy库by Daweo 【参考方案1】:

使用 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 是一个已知任务,因此在您的系统环境变量中,在 path 下,应列出 ffmpeg.exe 的路径,或者您可以在 python 代码中使用 exe 的完整路径.

【讨论】:

非常感谢。但我对 Python 并不陌生,并且知道如何使用 subprocessmultiprocessing 模块来完成此任务。我在询问这种方法可能存在的缺点。除了系统中ffmpeg/aconv 的未知路径(我可以自己轻松找到)之外,我对它们一无所知。所以我问了这个问题,希望有人能指出这种方法的另一个缺点。 老实说,如果您尝试使用免费的可用库,我认为您不会找到比 ffmpeg 更好、更容易使用的东西。 如果我们的.py文件位于不同的位置,我们是否必须在这段代码中指定指向videofileaudiofile的绝对路径? 无论你从哪里启动 python 会话都是基本路径。我建议使用绝对路径,如果你正在调试,你可以复制粘贴命令并在 shell 中运行它。 很好,答案也适用于 webm 作为源文件!【参考方案2】:

这个比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中使用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 将音频更改为任何其他格式

【讨论】:

【参考方案3】:

可以从音频文件或视频文件的配乐创建音频剪辑

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

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

【讨论】:

【参考方案4】:

或示例从

中提取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)

【讨论】:

【参考方案5】:

FFmpeg 是最著名的多媒体框架之一,广泛用于处理视频。为了对视频进行编码,当然必须使用视频编码器。欲了解更多信息,请使用:http://machinelearninguru.com/computer_vision/video_processing/ffmpeg_extract_audio/ffmpeg_audio_extract.html

【讨论】:

请解释一下,这是如何回答这两个问题的?

以上是关于Python从视频文件中提取wav的主要内容,如果未能解决你的问题,请参考以下文章

在 django 中使用 FFMPEG 在网络上上传后从视频中提取 WAV 音频文件

从python中的视频中提取音频

如何使用 python 和 openCV 从 .yuv 视频文件 (YUV420) 中提取帧?

从 wav 文件 python 中提取频率

如何使用 ffmpeg 提取 8khz 的音频

视频去除杂音教程