Python代碼批量把音樂專輯轉(zhuǎn)為視頻發(fā)布b站
一、使用場景:
我有一張音樂專輯,包含一張封面圖片和幾首歌。我想把這個(gè)專輯上傳到b站,需要把圖片轉(zhuǎn)為視頻,再和音頻拼接起來。
二、代碼成品:
三、事前準(zhǔn)備:
1、下載安裝Python,下載地址:https://www.python.org/
2、下載安裝PyCharm,下載地址:https://www.jetbrains.com/zh-cn/pycharm/download/
3、下載FFmpeg,Windows版下載地址:https://www.gyan.dev/ffmpeg/builds/ffmpeg-release-full.7z),
解壓到一個(gè)合適的位置,保證以后不會(huì)移動(dòng),
打開文件夾進(jìn)入bin文件夾,將bin文件夾添加到環(huán)境變量中。
4、打開PyCharm新建項(xiàng)目,將main.py中的代碼替換為上方代碼。
5、在main.py所在的文件夾中,新建3個(gè)文件夾,分別命名為1、2、3。
1用來存放原始圖片和音頻,2用來存放生成的視頻,3用來存放視頻拼接音頻后的成品。
6、把圖片重命名為1.jpg。
7、音頻的批量重命名從1開始遞增,比如1.flac、2.flac、……、9.flac、10.flac、11.flac、……
四、代碼講解:
1、math庫:用了向上取整的函數(shù)ceil
2、subprocess庫:用來啟動(dòng)命令行
3、num:有多少個(gè)音頻
4、audio_type:音頻格式,一般是flac或mp3
5、scale:圖片分辨率,
-1:1080是把圖片高設(shè)為1080、寬對(duì)應(yīng)縮放,
1920:-1是把圖片寬設(shè)為1920、高對(duì)應(yīng)縮放,
兩種分辨率都要試試,選擇寬不超過1920且高不超過1080的那個(gè)分辨率,
一般都選1080。
6、subprocess.run:啟動(dòng)子進(jìn)程執(zhí)行命令行
如果這個(gè)命令有輸出,就用out存放輸出結(jié)果:
out = subprocess.run(cmd1, stdout=subprocess.PIPE).stdout
如果這個(gè)命令沒輸出,直接執(zhí)行就行了:
subprocess.run(cmd2)
7、cmd1:原始命令可看上一行的注釋,這個(gè)命令的作用是輸出某個(gè)音頻的時(shí)間長度(以秒為單位),比如114.514秒。各個(gè)參數(shù)我不懂,就不講解了。
out:用來存放輸出的時(shí)間長度
seconds:用來存放這個(gè)時(shí)間長度向上取整的結(jié)果,比如114.514向上取整為115
8、cmd2:原始命令可看上一行的注釋,這個(gè)命令的作用是根據(jù)seconds(時(shí)長)和scale(分辨率)生成視頻,下面講解各個(gè)參數(shù):
(1)-loop 1:只循環(huán)一次(本來是可以多張圖片循環(huán)多次的,但沒必要,這里只需要1張圖片循環(huán)1次就行了)
(2)-i ./1/1.jpg:輸入(input)的是1文件夾下的1.jpg
(3)-r 30:生成30幀的視頻
(4)-t?seconds:生成seconds時(shí)長的視頻
(5)-vf "scale=-1:1080,pad=floor(iw/2)*2:floor(ih/2)*2":
vf是視頻濾鏡,scale在上面第5點(diǎn)已經(jīng)講過了,pad指生成視頻的分辨率,格式是寬:高,iw、ih是scale的寬(input width)和高(input height)。
那為什么寬和高要先除以2,再向下取整,再乘2呢?
這是因?yàn)?,pad的格式只能是能被2整除的數(shù)。而我們對(duì)scale的處理是,先確定了高1080或?qū)?920其中一個(gè)之后,另一個(gè)再對(duì)應(yīng)縮放。如果縮放后的結(jié)果是奇數(shù)或小數(shù),那就不行了。所以最后的乘2是為了保證能被2整除,向下取整是為了保證高不會(huì)超過1080或?qū)挷粫?huì)超過1920。
(6)'./2/' + str(i) + '.mp4':生成對(duì)應(yīng)名稱的mp4,并存放到指定路徑中
(7)\:命令太長了,用來換行
9、cmd3:原始命令可看上一行的注釋,這個(gè)命令的作用是把生成的視頻和原始的音頻拼接為成品,下面講解各個(gè)參數(shù):
(1)-i 1.mp4 -i 1.flac:輸入(input)的是生成的視頻和原始的音頻
(2)-map 0:v:0:第1個(gè)0表示第1個(gè)輸入文件,即生成的視頻,v表示選擇視頻軌(video),第2個(gè)0表示選擇視頻軌中的第1個(gè)流。
(3)-map 1:a:0:1表示第2個(gè)輸入文件,即原始的音頻,a表示選擇音頻軌(audio),0表示選擇音頻軌中的第1個(gè)流。
(4)-c copy:c表示編碼格式(code),copy表示復(fù)制(即不進(jìn)行任何壓制,只是拼接)
(5)1.mkv:輸出的成品名稱
朋友,都看到最后了,點(diǎn)個(gè)免費(fèi)的贊吧~