前言
近端時(shí)間看了一個(gè)短視頻,覺(jué)得視頻的背景音樂(lè)片段很不錯(cuò),想把這個(gè)背景音樂(lè)得到,雖然小編運(yùn)用Python爬蟲(chóng)肯定能得到這首音樂(lè),但是這個(gè)音樂(lè)片段肯定是得不到的,于是網(wǎng)上看一下相關(guān)官方文檔,沒(méi)想到python真的有模塊可以滿(mǎn)足要求,這又讓我想起自己CSDN界面的那段話(huà)了,“在Python面前,只有你想不到的,沒(méi)有Python做不到的”。
1.需要下載的Python模塊和ffmpeg多媒體處理工具
需要的Python模塊是標(biāo)題上提到的那個(gè),pydub,這個(gè)模塊可以實(shí)現(xiàn)對(duì)音頻文件的剪輯、轉(zhuǎn)換音頻格式等。pydub是python的高級(jí)一個(gè)音頻處理庫(kù),自帶的wave模塊只能處理 wav 格式的音頻文件,如果要想處理類(lèi)似MP3格式的文件,就得要裝 ffmpeg或者libav了。pydub依賴(lài)于ffmpeg,這里選擇安裝ffmpeg。
下載命令,在cmd上輸入pip install pydub即可
除了下載pydub這個(gè)模塊之外,還需要下載ffmpeg這個(gè)多媒體處理工具,否則,即使在代碼中指定音頻文件路徑?jīng)]有錯(cuò)誤,運(yùn)行結(jié)構(gòu)也會(huì)報(bào)錯(cuò)。如下:
下載這個(gè)之后,就不會(huì)報(bào)這個(gè)錯(cuò)誤了,下載網(wǎng)址為:ffmpeg
在這個(gè)網(wǎng)址下面找一個(gè)和自己電腦系統(tǒng)一樣的版本下載即可,下載完成之后,解壓,好像不配置環(huán)境變量,程序也可以正常執(zhí)行,不過(guò),最好還是配置環(huán)境變量。
2.實(shí)現(xiàn)音頻剪輯和轉(zhuǎn)換音頻格式代碼
其實(shí),實(shí)現(xiàn)音頻剪輯和轉(zhuǎn)換音頻格式的代碼總共就幾行代碼,只不過(guò)需要輸入一些參數(shù)值,因此代碼量相對(duì)而言多了起來(lái)。
關(guān)鍵代碼為:
from pydub import AudioSegment
sound=AudioSegment.from_file(file='./music/刺客.mp3',format='mp3')
sound=sound[start:end] # start,end兩個(gè)參數(shù)用于對(duì)音頻進(jìn)行剪輯
sound.export(out_f='./music/刺客.wav', format='wav') # 用于保存剪輯之后的音頻文件
當(dāng)然讀者想了解更多有關(guān)這個(gè)模塊的使用,可以來(lái)看看官方文檔??!
文檔連接為:pydub
文檔中講了有關(guān)音頻合并、音頻重復(fù)等知識(shí)點(diǎn)喔!。
最終實(shí)現(xiàn)代碼:
from pydub import AudioSegment
import sys
class Music(object):
def __init__(self,file,file_type,start,end,save_file,save_file_type):
self.sound = AudioSegment.from_file(file=file, format=file_type)
self.start=start # 剪輯音頻文件開(kāi)始時(shí)間
self.end=end # 剪輯音頻文件的結(jié)束時(shí)間
self.save_file=save_file # 保存音頻文件的路徑
self.save_file_type=save_file_type # 保存音頻文件的類(lèi)型
def editedMusic(self): # 定義方法用于剪輯音頻
# 對(duì)于傳入的start,end參數(shù)進(jìn)行一些字符串處理
## 對(duì)傳入的開(kāi)始時(shí)間進(jìn)行字符串處理
if self.start=='0' or self.start=='': # 從頭開(kāi)始處理音頻文件
start_time=0
elif ":" in self.start:# 從音頻中間處理
list_1=self.start.split(":")
start_time=int(list_1[0])*60+int(list_1[1])
else: # 如果是其他情況,提示錯(cuò)誤,并退出程序
print("你輸入的初始截取時(shí)間有問(wèn)題")
sys.exit()
start_time*=1000 # 毫秒作為單位,需要在原來(lái)秒數(shù)的基礎(chǔ)上再乘以1000
if start_time>=len(self.sound): # 如果初始截取時(shí)間大于或等于音頻文件總時(shí)間
print('你輸入的初始截取時(shí)間大于該音頻文件總時(shí)間,故無(wú)法進(jìn)行剪輯操作')
sys.exit()
## 對(duì)傳入的結(jié)束時(shí)間進(jìn)行字符串處理
if self.end=='':
end_time=len(self.sound) # 如果輸入結(jié)束時(shí)間為空,表示截取到音頻文件最后
elif ':' in self.end:
list_2=self.end.split(':')
end_time=int(list_2[0])*60+int(list_2[1])
else:
print("你輸入的結(jié)束截取時(shí)間有問(wèn)題")
sys.exit()
end_time*=1000
self.sound=self.sound[start_time:end_time] # 對(duì)音頻文件進(jìn)行剪輯
self.saveFile()
def saveFile(self):
self.sound.export(out_f=self.save_file,format=self.save_file_type)
# 保存已經(jīng)進(jìn)行剪輯的音頻文件
print('已成功轉(zhuǎn)換!')
if __name__ == '__main__':
print('1.可以將音頻文件轉(zhuǎn)換其他格式的音頻文件\n2.可用剪輯音頻文件\n')
print('='*50)
file=input('建議:\n(1.音頻文件和運(yùn)行文件在同一個(gè)文件夾下面,最好使用相對(duì)路徑)\n(2.音頻文件和運(yùn)行文件不在同一個(gè)文件夾下面,最好用絕對(duì)路徑)\n請(qǐng)輸入要剪輯的文件路徑:')
file_type=file[file.rfind('.')+1:] # 音頻文件類(lèi)型 mp3、wav
start=input("(可用輸入0,空格,(1:1,1分1秒):)\n輸入開(kāi)始截取時(shí)間:")
end=input("(可用輸入空格,(1:1,1分1秒):)\n輸入結(jié)束截取時(shí)間:")
save_file=input("請(qǐng)輸入剪輯之后保存的文件路徑:")
save_file_type=save_file[save_file.rfind('.')+1:]
music=Music(file,file_type,start,end,save_file,save_file_type)
music.editedMusic() # 1:12 1:36
當(dāng)然,這個(gè)模塊好像還可以滿(mǎn)足一些用戶(hù)改變音樂(lè)音質(zhì)的需求,export()方法里面有一個(gè)參數(shù)bitrate比特率,百度了一下這個(gè)東西,好像對(duì)音頻音質(zhì)有一定影響。
3.總結(jié)
到此這篇關(guān)于Python使用pydub模塊轉(zhuǎn)換音頻格式以及對(duì)音頻進(jìn)行剪輯的文章就介紹到這了,更多相關(guān)Python轉(zhuǎn)換音頻格式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- python用moviepy對(duì)視頻進(jìn)行簡(jiǎn)單的處理
- MoviePy常用剪輯類(lèi)及Python視頻剪輯自動(dòng)化
- MoviePy簡(jiǎn)介及Python視頻剪輯自動(dòng)化
- Python視頻編輯庫(kù)MoviePy的使用
- Python竟然能剪輯視頻
- 用python進(jìn)行視頻剪輯
- python基于moviepy實(shí)現(xiàn)音視頻剪輯