Python从视频文件中提取wav

xol*_*dec 20 python audio video ffmpeg gstreamer

有关:

如何使用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’ 
Run Code Online (Sandbox Code Playgroud)

但它效率不高,因为我需要在播放视频和同时写入wav文件时等待多年.

ffmpeg 好多了:

avconv  -i foo.mp4  -ab 160k -ac 1 -ar 16000 -vn ffaudio.wav
Run Code Online (Sandbox Code Playgroud)

但是我无法从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()
Run Code Online (Sandbox Code Playgroud)

use*_*754 32

使用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)
Run Code Online (Sandbox Code Playgroud)

您必须确保ffmpeg是一个已知任务,因此在您的系统环境变量中,在path下,应列出ffmpeg.exe的路径,或者您可以在python代码中使用exe的完整路径.


pro*_*r44 5

这可能比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")
Run Code Online (Sandbox Code Playgroud)

转换器模块从视频中提取音频并将其保存为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")
Run Code Online (Sandbox Code Playgroud)

子剪辑功能中的数字以秒为单位指定音频的开始和结束。然后您可以使用mpg123将音频更改为任何其他格式


小智 5

可以从音频文件或视频文件的配乐中创建音频片段

from moviepy.editor import *
audioclip = AudioFileClip("some_audiofile.mp3")
audioclip = AudioFileClip("some_video.avi")
Run Code Online (Sandbox Code Playgroud)

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


归档时间:

查看次数:

36049 次

最近记录:

7 年,1 月 前