Pydub 是一款简单、方便且强大的 Python 音频处理库
日常音频剪辑处理工具,都可以使用它来完成,比如:提取音频、音频切断、音效处理、响度控制、声道配置、音频合成等
快速开始
打开一个 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
淡入淡出(请注意,您可以连锁操作,因为一切都会返回 一个音频段)
# 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 问题跟踪器中提交错误, 并提出任何技术问题 使用 pydub 标签的堆栈溢出。 我们密切关注两者。
安装
安装 pydub 很容易,但不要忘记安装 ffmpeg/avlib (本文档的下一部分)
pip install pydub
或者从 github 安装最新的开发版本(或者将 @master 替换为 发布版本,例如 @v0.12.0)…
pip install git+https://github.com/jiaaro/pydub.git@master
-或者-
git clone https://github.com/jiaaro/pydub.git
-或者-
将 pydub 目录复制到您的 python 路径中。压缩 这里
依赖关系
您可以使用纯Python打开和保存WAV文件。用于打开和保存非 wav 文件 – 例如 mp3 – 您需要 ffmpeg 或 libav。
回顾
如果您安装了其中之一,则可以播放音频(simpleaudio 强烈推荐,即使您正在安装 ffmpeg/libav):< /span>
- simpleaudio
- pyaudio
- ffplay(通常与 ffmpeg 捆绑在一起,请参阅下一节)
- avplay(通常与 libav 捆绑在一起,请参阅下一节)
from pydub import AudioSegment
from pydub.playback import play
sound = AudioSegment.from_file("mysound.wav", format="wav")
play(sound)
设置 ffmpeg
你需要安装 libav 或 ffmpeg,才能正常使用 pydub。
Mac(使用 homebrew):
# libav
brew install libav
#### OR #####
# ffmpeg
brew install ffmpeg
Linux(使用 aptitude):
# libav
apt-get install libav-tools libavcodec-extra
#### OR #####
# ffmpeg
apt-get install ffmpeg libavcodec-extra
Windows:
- 从此处提供的 Windows 二进制文件下载并解压 libav。
- 将 libav/bin 文件夹添加到您的 PATH envvar
- pip install pydub
重要笔记
AudioSegment 对象是不可变的
Ogg 导出和默认编解码器
Ogg 规范 (http://tools.ietf.org/html/rfc5334) 未指定 要使用的编解码器,此选择由用户决定。 Vorbis 和 Theora 只是 一些潜在的编解码器(参见 rfc 第 3 页)可用于 封装数据。
未指定编解码器时,导出到 ogg 将默认 使用 vorbis 作为一种方便。即:
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")
使用示例
假设您有一个目录,其中包含 mp4
和 flv
视频,并且您想要将它们全部转换为 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!
with open("%s_minute_playlist.mp3" % playlist_length, 'wb') as out_f:
playlist.export(out_f, format='mp3')
最后编辑:Jeebiz 更新时间:2024-11-16 21:49