Pydub


关于 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

音频段是不可变的

# 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问题跟踪器中归档错误,并使用pydub标签在Stack Overflow上询问任何技术问题。


安装

安装pydub很容易,但不要忘记安装ffmpeg/avlib(本文档的下一节)

pip install pydub

或者从github安装最新的开发版本(或者将@master替换为发布版本,如@v0.12.0)…

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

-OR-

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

-OR-

将pydub目录复制到您的python路径中。压缩在这里


依赖性

您可以使用纯 python打开和保存WAV文件。要打开和保存非wav文件,如mp3,您需要ffmpeglibav


回放

如果您安装了其中一个,您可以播放音频(强烈建议使用simpledio,即使您正在安装ffmpeg/libav):

  • 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。

Mac(使用自制软件):

# libav
brew install libav
***
####    OR    #####

# ffmpeg
brew install ffmpeg

Linux (using aptitude):

# libav
apt-get install libav-tools libavcodec-extra
***
####    OR    #####

# ffmpeg
apt-get install ffmpeg libavcodec-extra

Windows:

  1. 此处提供的Windows二进制文件中下载和提取libav。
  2. 将libav/bin文件夹添加到PATH环境中
  3. 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')

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值