[ python音频处理 ] python使用pydub+ffmpeg进行音频视频处理(简单易用)

Song • 22869 次浏览 • 0 个回复 • 2018年01月17日

Pydub

Pydub可以让你用简单的方式处理音频。

你可以查看下面的内容

快速开始

打开一个wav文件

from pydub import AudioSegment
song = AudioSegment.from_wav("never_gonna_give_you_up.wav")

或者打开一个mp3文件

song = AudioSegment.from_mp3("never_gonna_give_you_up.mp3")

或者一个ogg或者flv,或者其他所有ffmpeg支持的格式

ogg_version = AudioSegment.from_ogg("never_gonna_give_you_up.ogg")
flv_version = AudioSegment.from_flv("never_gonna_give_you_up.flv")

mp4_version = AudioSegment.from_file("never_gonna_give_you_up.mp4", "mp4")
wma_version = AudioSegment.from_file("never_gonna_give_you_up.wma", "wma")
aac_version = AudioSegment.from_file("never_gonna_give_you_up.aiff", "aac")

切片音频:

# pydub does things in milliseconds
ten_seconds = 10 * 1000

first_10_seconds = song[:ten_seconds]

last_5_seconds = song[-5000:]

让开始更响亮,结束更安静

# boost volume by 6dB
beginning = first_10_seconds + 6

# reduce volume by 3dB
end = last_5_seconds - 3

连接音频即声音合成(将一个文件添加到另一个文件的末尾)

without_the_middle = beginning + end

查看音屏有多长时间?

without_the_middle.duration_seconds == 15.0

audiosegments是不变的

# song is not modified
backwards = song.reverse()

交叉淡入淡出(再次,开始和结束都不会被修改)

# 1.5 second crossfade
with_style = beginning.append(end, crossfade=1500)

重复音频(重复追加生成一个文件)

# repeat the clip twice
do_it_over = with_style * 2

淡入淡出(请注意,您可以链接操作,因为一切都返回一个AudioSegment

# 2 sec fade in, 3 sec fade out
awesome = do_it_over.fade_in(2000).fade_out(3000)

保存结果(所有ffmpeg支持的都支持)

awesome.export("mashup.mp3", format="mp3")

用标签保存结果(元数据)

awesome.export("mashup.mp3", format="mp3", tags={'artist': 'Various artists', 'album': 'Best of 2011', 'comments': 'This album is awesome!'})

您可以传递一个可选的比特率参数来使用ffmpeg支持的所有语法进行输出。

awesome.export("mashup.mp3", format="mp3", bitrate="192k")

所有ffmpeg支持的进一步的参数都可以在参数中以列表形式传递,其中第一个参数是转变论证第二。请注意,这些参数不会进行验证,而且您可能受到ffmpeg/avlib支持的特定版本的限制。

# Use preset mp3 quality 0 (equivalent to lame V0)
awesome.export("mashup.mp3", format="mp3", parameters=["-q:a", "0"])

# Mix down to two channels and set hard output volume
awesome.export("mashup.mp3", format="mp3", parameters=["-ac", "2", "-vol", "150"])

调试

人们遇到的大多数问题都与使用ffmpeg/avlib格式之间的转换有关。Pydub提供了一个输出子进程调用的记录器来帮助您追踪问题:

>>> import logging

>>> l = logging.getLogger("pydub.converter")
>>> l.setLevel(logging.DEBUG)
>>> l.addHandler(logging.StreamHandler())

>>> AudioSegment.from_file("./test/data/test1.mp3")
subprocess.call(['ffmpeg', '-y', '-i', '/var/folders/71/42k8g72x4pq09tfp920d033r0000gn/T/tmpeZTgMy', '-vn', '-f', 'wav', '/var/folders/71/42k8g72x4pq09tfp920d033r0000gn/T/tmpK5aLcZ'])
<pydub.audio_segment.AudioSegment object at 0x101b43e10>

不要担心在转换中使用的临时文件。他们自动清理。

错误和问题

您可以在github进行问题跟进中提交错误,也可以提问题在Stack Overflow使用pydub标签 。我们两个都会关注。

在windos,mac,linux安装pydub

安装pydub很简单,但是不要忘记安装ffmpeg/avlib

pip install pydub

或者从github安装最新的dev版本(或者在发行版本@v0.12.0版本替换@master)...

pip install git+https://github.com/jiaaro/pydub.git@master

或者

git clone https://github.com/jiaaro/pydub.git

或者复制pydub目录到你的python path. Zip这里

依赖

你可以用纯Python打开和保存WAV文件。对于打开和保存非wav文件 - 如mp3- 你需要ffmpeglibav

在windos,mac,linux获取ffmpeg并且设置

主要用于学习Pydub,我们将从各个方面介绍Pydub模块处理的过程

Pydub的安装

您可以使用libavffmpeg。 Mac(使用homebrew ):

# libav
brew install libav --with-libvorbis --with-sdl --with-theora

####    OR    #####

# ffmpeg
brew install ffmpeg --with-libvorbis --with-sdl2 --with-theora

Linux(使用apt):

# libav
apt-get install libav-tools libavcodec-extra-53

####    OR    #####

# ffmpeg
apt-get install ffmpeg libavcodec-extra-53

Windows:

  • 1、从此处提供的Windows二进制文件下载并解压libav
  • 2、将libav /bin文件夹添加到PATH envvar
  • 3、pip install pydub

重要笔记

AudioSegment对象是不可变

Ogg导出和默认编解码器

Ogg规范(http://tools.ietf.org/html/rfc5334)没有指定要使用的编解码器,这个选择留给用户。Vorbis和Theora只是一些可用于封装数据的潜在编解码器(参见rfc的第3页)中的一部分

如果没有指定编解码器导出到ogg会默认使用vorbisconvinence。那是:

from pydub import AudioSegment
song = AudioSegment.from_mp3("test/data/test1.mp3")
song.export("out.ogg", format="ogg")  # Is the same as:
song.export("out.ogg", format="ogg", codec="libvorbis")

使用示例

加入你有一个mp4flv视频的目录,并且你想把它们全部转换成mp3,所以你可以在你的mp3播放器上聆听它们。

import os
import glob
from pydub import AudioSegment

video_dir = '/home/johndoe/downloaded_videos/'  # Path where the videos are located
extension_list = ('*.mp4', '*.flv')

os.chdir(video_dir)
for extension in extension_list:
    for video in glob.glob(extension):
        mp3_filename = os.path.splitext(os.path.basename(video))[0] + '.mp3'
        AudioSegment.from_file(video).export(mp3_filename, format='mp3')

另一个例子呢?

from glob import glob
from pydub import AudioSegment

playlist_songs = [AudioSegment.from_mp3(mp3_file) for mp3_file in glob("*.mp3")]

first_song = playlist_songs.pop(0)

# let's just include the first 30 seconds of the first song (slicing
# is done by milliseconds)
beginning_of_song = first_song[:30*1000]

playlist = beginning_of_song
for song in playlist_songs:

    # We don't want an abrupt stop at the end, so let's do a 10 second crossfades
    playlist = playlist.append(song, crossfade=(10 * 1000))

# let's fade out the end of the last song
playlist = playlist.fade_out(30)

# hmm I wonder how long it is... ( len(audio_segment) returns milliseconds )
playlist_length = len(playlist) / (1000*60)

# lets save it!
out_f = open("%s_minute_playlist.mp3" % playlist_length, 'wb')

playlist.export(out_f, format='mp3')

常见问题:

一、cannot import name AudioSegment

出现cannot import name AudioSegment首先你要查看是否安装pydub,如果安装了还报这个错,代表你的文件名错误了,不要把这个文件命名为pydub.py,否则报错


原创文章,转载请注明 :[ python音频处理 ] python使用pydub+ffmpeg进行音频视频处理(简单易用) - pytorch中文网
原文出处: https://ptorch.com/news/112.html
问题交流群 :168117787
提交评论
要回复文章请先登录注册
用户评论
  • 没有评论
Pytorch是什么?关于Pytorch! pytorch中快速生成与实现WaveNet深度神经网络