基于Python實(shí)現(xiàn)音樂(lè)節(jié)奏可視化效果
國(guó)外有個(gè)網(wǎng)友分享了他的python音樂(lè)節(jié)奏可視化方案。上方的視頻就是用他的方案可視化得到的結(jié)果,大家可以欣賞一下。
歌曲節(jié)奏越強(qiáng),顏色變化越絢麗?,F(xiàn)在很多舞蹈視頻制作需要背景變色,拍攝時(shí)可以用燈光布景,另一種方式可以用“色卡”,比如用上面python做出來(lái)的“色卡”做背景,我們看看剪輯效果:
開(kāi)場(chǎng)的“這夏天”文字顏色變幻,中間天空的顏色變化,都是跟著音樂(lè)節(jié)奏走的,豐富了視頻的表現(xiàn)力。
如果這里不用python,靠自己剪輯去卡音樂(lè)節(jié)奏和添加顏色,很容易將人勸退。
下面給大家介紹一下怎么使用這份代碼。
首先安裝我們所需要的依賴模塊:
pip?install?matplotlib pip?install?librosa pip?install?numpy pip?install?pygame
代碼架構(gòu)分為兩個(gè)部分,一個(gè)是用于計(jì)算頻譜的 AudioAnalyzer.py,一個(gè)用于渲染生成動(dòng)態(tài)視頻的 main.py
它是基于pygame實(shí)現(xiàn)的,pygame.draw.polygon(surface, color, points, width)畫(huà)多邊形。參數(shù)width控制顏色填充范圍,默認(rèn)為0,我們用一個(gè)代碼設(shè)置30試一下:
import?pygame import?sys pygame.init() ? display?=?pygame.display.set_mode((300,?300)) display.fill((255,?255,?255)) ? pygame.draw.polygon(display,?(0,?0,?255),? ??????????????????[(120,120),?(40,160),?(40,220),? ??????????????????(200,?220),?(200,160)],?width=0) ? while?True: ????for?event?in?pygame.event.get(): ????????if?event.type?==?pygame.QUIT: ????????????pygame.quit() ????????????sys.exit() ????pygame.display.update()
回到本案例,部分代碼如下:
pygame.mixer.music.load(filename) pygame.mixer.music.play(0) running?=?True while?running: ????avg_bass?=?0 ????poly?=?[] ????#?ticks ????t?=?pygame.time.get_ticks() ????deltaTime?=?(t?-?getTicksLastFrame)?/?1000.0 ????getTicksLastFrame?=?t
首先,通過(guò)pygame加載(load)音樂(lè)文件并播放(play).
然后,通過(guò)while循環(huán)和ticks對(duì)畫(huà)面中的圖像進(jìn)行實(shí)時(shí)渲染。
渲染的代碼比較長(zhǎng),就是一些計(jì)算柱體長(zhǎng)度的過(guò)程,這里就不贅述了。
如果你想要將你的音樂(lè)用這份代碼進(jìn)行可視化,僅需要修改main.py的第5行代碼:
from?AudioAnalyzer?import?* import?random import?colorsys filename?=?"D:\桌面\m1.MP3"
如果你想優(yōu)化生成的動(dòng)態(tài)圖像的顏色,可以修改rnd_color函數(shù),該函數(shù)控制圖形顏色的變化:
def?rnd_color(): ????h,?s,?l?=?random.random(),?0.5?+?random.random()?/?2.0,?0.4?+?random.random()?/?5.0 ????return?[int(256?*?i)?for?i?in?colorsys.hls_to_rgb(h,?l,?s)]
如果你想修改生成的動(dòng)態(tài)圖像的形狀,比如說(shuō)去掉中間那個(gè)圓,僅需要這么改:
pygame.draw.circle(screen,?circle_color,?(circleX,?circleY),?int(radius))
將radius直接設(shè)為0,或者直接將這行代碼注釋掉即可:
pygame.draw.circle(screen,?circle_color,?(circleX,?circleY),?0)
最后,我們換一首歌看看效果:
到此這篇關(guān)于基于Python實(shí)現(xiàn)音樂(lè)節(jié)奏可視化效果的文章就介紹到這了,更多相關(guān)Python可視化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
pytorch實(shí)現(xiàn)梯度下降和反向傳播圖文詳細(xì)講解
這篇文章主要介紹了pytorch實(shí)現(xiàn)梯度下降和反向傳播,反向傳播的目的是計(jì)算成本函數(shù)C對(duì)網(wǎng)絡(luò)中任意w或b的偏導(dǎo)數(shù)。一旦我們有了這些偏導(dǎo)數(shù),我們將通過(guò)一些常數(shù)α的乘積和該數(shù)量相對(duì)于成本函數(shù)的偏導(dǎo)數(shù)來(lái)更新網(wǎng)絡(luò)中的權(quán)重和偏差2023-04-04Python對(duì)小數(shù)進(jìn)行除法運(yùn)算的正確方法示例
這篇文章主要介紹了Python對(duì)小數(shù)進(jìn)行除法運(yùn)算的正確方法示例,正確的方法是需要轉(zhuǎn)換成浮點(diǎn)數(shù),否則永遠(yuǎn)不會(huì)得到正確結(jié)果,需要的朋友可以參考下2014-08-08python開(kāi)發(fā)之基于thread線程搜索本地文件的方法
這篇文章主要介紹了python開(kāi)發(fā)之基于thread線程搜索本地文件的方法,以完整實(shí)例形式分析了Python基于多線程處理搜索問(wèn)題的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2015-11-11Python實(shí)現(xiàn)通過(guò)文件路徑獲取文件hash值的方法
這篇文章主要介紹了Python實(shí)現(xiàn)通過(guò)文件路徑獲取文件hash值的方法,結(jié)合實(shí)例形式分析了Python針對(duì)文件進(jìn)行hash運(yùn)算的實(shí)現(xiàn)方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-04-04Python中shutil模塊的學(xué)習(xí)筆記教程
shutil模塊是一種高層次的文件操作工具,類似于高級(jí)API,主要強(qiáng)大之處在于其對(duì)文件的復(fù)制與刪除操作更是比較支持好。下面這篇文章主要介紹了Python中shutil模塊的相關(guān)教程,需要的朋友可以參考學(xué)習(xí),下面來(lái)一起看看吧。2017-04-04python如何實(shí)現(xiàn)異步調(diào)用函數(shù)執(zhí)行
這篇文章主要介紹了python如何實(shí)現(xiàn)異步調(diào)用函數(shù)執(zhí)行,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07