Python中操作各種多媒體,視頻、音頻到圖片的代碼詳解
我們經(jīng)常會(huì)遇到一些對(duì)于多媒體文件修改的操作,像是對(duì)視頻文件的操作:視頻剪輯、字幕編輯、分離音頻、視頻音頻混流等。又比如對(duì)音頻文件的操作:音頻剪輯,音頻格式轉(zhuǎn)換。再比如我們最常用的圖片文件,格式轉(zhuǎn)換、各個(gè)屬性的編輯等。因?yàn)槎嗝襟w文件的操作眾多,本文選取一些極具代表性的操作,以代碼的形式實(shí)現(xiàn)各個(gè)操作。
一、圖片操作
操作圖片的模塊有許多,其中比較常用的兩個(gè)就是 Pillow
和 opencv
,兩個(gè)模塊各有優(yōu)勢(shì)。其中 opencv
是計(jì)算機(jī)視覺(jué)處理的開(kāi)源模塊,應(yīng)用的范圍更加廣泛,從圖像處理到視頻處理,再到物體檢測(cè)等。而 pillow
相比直線(xiàn)就單純的多,其大多數(shù)操作都是圍繞圖像而展開(kāi)的。
1.1、格式轉(zhuǎn)換
圖片格式有多種多樣,最直觀(guān)的感受就是圖片后綴。而格式之間的差異不僅僅是后綴的差異,最為明顯的就是 png
格式圖片,同其它圖片有著最為直觀(guān)的區(qū)別。下面我們就看看在Python中如何轉(zhuǎn)換格式,我們先安裝 pillow
模塊:
pip install pillow
然后看看如何導(dǎo)入模塊以及如何讀取圖像:
from PIL import Image # 讀取圖像 img = Image.open('ycjc.jpg') # 顯示圖像 img.show()
我們有了上面的基礎(chǔ)操作之后,就可以開(kāi)始進(jìn)行格式轉(zhuǎn)換了,我們用有村大妹子的圖片作為素材:
我們可以看到這是一張白色背景的圖片,我們將它轉(zhuǎn)成 png
看看效果:
from PIL import Image # 讀取圖像 img = Image.open('ycjc.jpg') # 格式轉(zhuǎn)換,其中A為透明度 png = img.convert('RGBA') # 保存圖像,因?yàn)槭荝GBA格式,所以后綴應(yīng)該為png png.save('ycjc.png')
輸出的圖片我就不放了,我們觀(guān)察輸出圖片會(huì)發(fā)現(xiàn),白色背景好像變透明了。不要懷疑,這只是心理作用,其實(shí)圖片看上去是不會(huì)有任何變化的。但是實(shí)際上圖片從原來(lái)的 RGB
三個(gè)色道變成了 RGBA
四個(gè)色道,我們會(huì)發(fā)現(xiàn),圖片變大了:
雖然 A
色道的透明度全部都是0,但是實(shí)際上還是存在這個(gè)色道,所以大小方面有了明顯的增加。更多轉(zhuǎn)換模式可以參考超全Python圖像處理講解(多圖預(yù)警)。
1.2、圖片裁剪
圖片裁剪的操作也非常常用,我們來(lái)看看 pillow
如何裁剪圖片:
from PIL import Image # 讀取圖像 img = Image.open('ycjc.jpg') # 裁剪圖像,調(diào)用crop方法,傳入裁剪區(qū)域的元組 img_crop = img.crop((100, 100, 400, 400)) # 保存裁剪后的圖像 img_crop.save('ycjc_crop.jpg')
我們調(diào)用 crop
方法,傳入裁剪區(qū)域的元組進(jìn)行裁剪,元組的內(nèi)容為左上角的坐標(biāo)(前兩個(gè)參數(shù))即右下角的坐標(biāo)(后兩個(gè)參數(shù))。效果圖如下:
1.3、截屏
雖然算不上是圖像操作,但是還是個(gè)非常實(shí)用的操作。我們實(shí)現(xiàn)截屏是通過(guò)ImageGrap類(lèi)實(shí)現(xiàn)的:
from PIL import ImageGrab # 截取全屏 im = ImageGrab.grab() # 保存圖像 im.save('win.png')
除了截取全屏我們也可以區(qū)域截屏:
im =ImageGrab.grab((300, 100, 1400, 600))
參數(shù)元組含義與 crop
方法一致。
除了上述操作,還有更多像是添加濾鏡、對(duì)比度調(diào)節(jié)、亮度調(diào)節(jié)、色彩調(diào)節(jié)等,由于內(nèi)容眾多,所以不在本文詳細(xì)討論。
二、音頻操作
音頻的操作也比較繁多,我們最常用到的就是音頻剪輯和音量調(diào)節(jié)了。我們這里使用 pydub
模塊來(lái)進(jìn)行音頻文件的操作。
2.1、pydub的安裝以及讀取音頻
安裝我們還是使用pip:
pip install pydub
然后我們來(lái)讀取一個(gè) wav
文件:
from pydub import AudioSegment # 讀取wav格式的音頻文件 music = AudioSegment.from_wav('百年孤獨(dú).wav')
這樣我們就完成了音頻文件的讀取, wav
文件是一種未經(jīng)壓縮的文件,我們可以通過(guò) pydub
直接讀取。讀取其它類(lèi)型的文件 pydub
同樣提供了相應(yīng)的方法:
music = AudioSegment.from_mp3('music.mp3') music = AudioSegment.from_ogg("music.ogg") music = AudioSegment.from_flv("music.flv")
因?yàn)樵趯?shí)際操作過(guò)程中遇到了一個(gè)未找明緣由的錯(cuò)誤,所以本文的音頻操作只針對(duì) wav
格式。
2.2、音頻剪切
音頻剪輯的實(shí)現(xiàn)我們是通過(guò)類(lèi)似ndarray的中括號(hào)操作的:
# 截取前20秒 clip = music[:20*1000] # 截取后20秒 clip = music[-20000:] # 從第20秒截取到第40秒 clip = music[20*1000:40*1000]
剪切好的片段我們可以另外存一個(gè)文件:
# 保存文件為clip.mp3,格式為mp3 clip.export('clip.mp3', format='mp3')
3.3、增加/減少音量
音量的控制我們只需要用音頻對(duì)象加一個(gè)常數(shù)即可:
# 音量減5 music -= 5 # 音量加5 music += 5
3.4、音頻拼接
我們先看看重復(fù)拼接:
# 在音頻文件末尾重復(fù)拼接該音頻 music = music*2
拼接后的音頻的效果就是原音頻循環(huán)兩次。接下來(lái)我們看看拼接不同的音頻:
# 裁剪前20秒音頻 clip1 = music[:20*1000] # 裁剪后20秒音頻 clip2 = music[-20*1000:] # 拼接音頻 clip = clip1 + clip2
3.5、 交叉漸入漸出
交叉漸入漸出是一種比較柔和的音頻轉(zhuǎn)場(chǎng)方式,在兩個(gè)音頻切換的間歇會(huì)有一個(gè)重合,用代碼實(shí)現(xiàn)如下:
# 截取前20秒 begin = music[20*1000:40*1000] # 截取后20秒 end = music[-20*1000:] # 添加交叉漸入漸出 效果 clip = begin.append(end, crossfade=1500)
我們可以看到我們一共裁剪了40秒,在生成的文件我們可以看到只有38秒,因?yàn)檗D(zhuǎn)場(chǎng)的時(shí)候有個(gè)重合的效果。當(dāng)然還有更多的操作,大家可以自己去了解。
三、視頻操作
視頻的操作可以通過(guò) moviepy
和 opencv
進(jìn)行,我們先分別安裝兩個(gè)模塊:
pip install opencv-python pip install moviepy
3.1、視頻剪輯
相比之下 moviepy
操作視頻要更便利,我們看看使用 moviepy
如何剪輯視頻:
from moviepy.editor import * # 剪切視屏bws.mp4中第50秒到第60秒 clip = VideoFileClip('bws.mp4').subclip(50, 60) # 將剪切的片段保存 clip.write_videofile("clip.mp4")
3.2、提取音頻文件
在 VideoFileClip
類(lèi)中,音頻文件作為其中的一個(gè)參數(shù),我們可以直接獲?。?/p>
from moviepy.editor import * # 讀取視頻文件 video = VideoFileClip('bws.mp4') # 獲取其中音頻 audio = video.audio # 保存音頻文件 audio.write_audiofile('audio.mp3')
3.3、混流
我們還可以將音頻同視頻混流,在moviepy中,提供了一個(gè)讀取音頻文件的類(lèi),我們?cè)O(shè)置視頻的音頻需要?jiǎng)?chuàng)建這個(gè)類(lèi)的對(duì)象:
from moviepy.editor import * # 讀取視頻 video = VideoFileClip('bws.mp4') # 讀取音頻 audio = AudioFileClip('百年孤獨(dú).mp3') # 設(shè)置視頻的音頻 video = video.set_audio(audio) # 保存新的視頻文件 video.write_videofile('bws_audio.mp4')
3.4、逐幀提取畫(huà)面
我們都知道,視頻是由一幀一幀的圖片組成的,我們也可以將畫(huà)面一幀一幀提取出來(lái):
import cv2 # 讀取視頻 video = cv2.VideoCapture('bws.mp4') # 逐幀讀取,當(dāng)還有畫(huà)面時(shí)ret為T(mén)rue,frame為當(dāng)前幀的ndarray對(duì)象 ret, frame = video.read() i = 0 # 循環(huán)讀取 while ret: i += 1 cv2.imwrite('v'+str(i) + '.jpg', frame) ret, frame = video.read()
上述代碼就能將視屏的每一幀以圖片的形式保存下來(lái)。
3.5、截取gif
截取gif和截取視頻沒(méi)有什么區(qū)別,不過(guò)為了減少gif的大小,我們通常會(huì)對(duì)視頻進(jìn)行尺寸縮放:
from moviepy.editor import * # 讀取視頻 video = VideoFileClip('bws.mp4') # 裁剪視頻,并縮小一半 video = video.subclip(20, 30).resize((0.5)) # 保存gif圖片 video.write_gif('bws.gif')
在上面subclip方法中,我們可以傳入元組,例如:
video.subclip((1, 20), (2, 30))
其含義為從1分20秒截取到2分30秒。
總結(jié)
到此這篇關(guān)于Python中操作各種多媒體,視頻、音頻到圖片的代碼詳解的文章就介紹到這了,更多相關(guān)python多媒體視頻音頻圖片內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實(shí)現(xiàn)GIF動(dòng)圖加載和降幀的方法詳解
這篇文章主要為大家詳細(xì)介紹了如何利用Python和Pygame實(shí)現(xiàn)GIF動(dòng)圖加載和降幀的效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-02-02一文深入了解Python中的繼承知識(shí)點(diǎn)
Python?是面向?qū)ο蟮木幊陶Z(yǔ)言,因此支持面向?qū)ο蟮娜筇匦灾唬豪^承。本文就帶大家了解了解Python中繼承的相關(guān)知識(shí)點(diǎn),感興趣的可以了解一下2022-11-11matplotlib grid()設(shè)置網(wǎng)格線(xiàn)外觀(guān)的實(shí)現(xiàn)
這篇文章主要介紹了matplotlib grid()設(shè)置網(wǎng)格線(xiàn)外觀(guān)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02pycharm通過(guò)ssh連接遠(yuǎn)程服務(wù)器教程
今天小編就為大家分享一篇pycharm通過(guò)ssh連接遠(yuǎn)程服務(wù)器教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02利用Pycharm將python文件打包為exe文件的超詳細(xì)教程(附帶設(shè)置文件圖標(biāo))
在日常使用pycharm寫(xiě)好程序后,如何將程序打包為exe文件呢,下面這篇文章主要給大家介紹了關(guān)于利用Pycharm將python文件打包為exe文件的超詳細(xì)教程,附帶設(shè)置文件圖標(biāo),需要的朋友可以參考下2022-08-08