moviepy音視頻剪輯:使用fl_time進(jìn)行諸如快播、慢播、倒序播放等時(shí)間特效處理的原理和可能遇到的坑
一、引言
在《音視頻剪輯:中的剪輯基類Clip的屬性和方法詳解》介紹了方法返回一個(gè)新剪輯,新剪輯是調(diào)用剪輯的一個(gè)淺拷貝,但新剪輯的時(shí)間線被調(diào)整,實(shí)際上這個(gè)方法就是對(duì)剪輯進(jìn)行一個(gè)基于時(shí)間特效的處理,如快播、慢播、倒序播放等。
二、時(shí)間特效處理的基本原理
時(shí)間特效處理其實(shí)非常簡單,就是對(duì)時(shí)間的一個(gè)變換,變換時(shí),假設(shè)t1是剪輯的時(shí)間線,從0開始一直到剪輯的最后end地方的一個(gè)線性坐標(biāo),而時(shí)間特效是通過調(diào)用函數(shù)或方法得到t2,t2 = (t1),然后特效處理后的剪輯時(shí)間線t1對(duì)應(yīng)的幀被替換為原剪輯t2位置的幀。
n倍速變換,其實(shí)是新剪輯t1時(shí)刻的幀對(duì)應(yīng)原剪輯n*t1時(shí)刻的幀,慢速播放則是新剪輯t1時(shí)刻的幀對(duì)應(yīng)原剪輯t1/n時(shí)刻的幀,倒序播放則是將新剪輯t1時(shí)刻的幀對(duì)應(yīng)原剪輯end-t1時(shí)刻的幀。
在中,時(shí)間特效處理是通過方法來進(jìn)行變換處理的,變換的函數(shù)則通過的參數(shù)來傳遞。關(guān)于的詳細(xì)介紹請(qǐng)參考《音視頻剪輯:中的剪輯基類Clip的屬性和方法詳解》。
參數(shù)指定的函數(shù)要求一個(gè)入口參數(shù)t,返回一個(gè)經(jīng)過函數(shù)處理后的新的時(shí)間值。
三、時(shí)間變換的坑
時(shí)間變換講清楚以后,看起來很簡單,但具體實(shí)現(xiàn)時(shí)會(huì)存在稍不留神就會(huì)被坑,我們來看幾個(gè)筆者遭遇的坑。
3.1、: : to read the of file
在進(jìn)行變換處理時(shí)報(bào)如下錯(cuò)誤信息:
OSError: MoviePy error: failed to read the first frame of video file F:\video\WinBasedWorkHard_src.mp4. That might mean that the file is corrupted. That may also mean that you are using a deprecated version of FFMPEG. On Ubuntu/Debian for instance the version in the repos is deprecated. Please update to a recent version from the website.
之所以出現(xiàn)這個(gè)報(bào)錯(cuò),估計(jì)是因?yàn)槭褂脤?duì)時(shí)間變換時(shí),從原剪輯的0-end時(shí)間段讀取幀時(shí),原剪輯end這個(gè)時(shí)間位置已經(jīng)到視頻結(jié)尾,可能沒有有效的幀,導(dǎo)致讀取視頻時(shí)報(bào)錯(cuò)。解決方案就是將end位置稍微往后退一點(diǎn),退一個(gè)幀就夠了。
3.2、: ‘’ not set情況1
這是因?yàn)檎{(diào)用時(shí),默認(rèn)值為,只要該值為,就會(huì)將設(shè)置為None,解決辦法是設(shè)置 = True 或者手工設(shè)置剪輯的。
3.3、: ‘’ not set情況2
下面的案例是倍速播放,由于是倍速播放,視頻的時(shí)長時(shí)間上只有原視頻的一半,此時(shí)使用=True已經(jīng)不合適,只能自行設(shè)定的值。示例代碼如下:
from moviepy.editor import *
clipVideo = VideoFileClip(r"F:\video\WinBasedWorkHard_src.mp4")
newclip = clipVideo.fl_time(lambda t: 2*t , apply_to=['mask'])
newclip.set_duration(clipVideo.duration/2)
newclip.write_videofile(r"F:\video\WinBasedWorkHard_new.mp4")
執(zhí)行時(shí)還是報(bào)錯(cuò),這是因?yàn)榧糨嫷慕^大多數(shù)set方法,基本上都不是對(duì)調(diào)用者的直接修改,而是對(duì)調(diào)用者進(jìn)行淺拷貝后,對(duì)淺拷貝剪輯進(jìn)行修改,且這些方法返回值都是一個(gè)剪輯。只需要將調(diào)用返回的剪輯記錄下來作為后續(xù)處理才行。
3.4、: in file xxxx, time
上面的案例沒有調(diào)整音頻只調(diào)整了視頻,會(huì)導(dǎo)致視頻播完之后,音頻還只播放一半,要保持音頻完整播放,有3個(gè)辦法,一是不同步改變音頻,但視頻保持不變,這時(shí)出來的效果就是視頻播放到一半后,后續(xù)畫面不再變化,第二種是將音頻同步變換減半,只是音頻播放速度也翻倍了;第三種是保持不變但同樣變換音頻。前面兩種方式處理都沒有問題,但第三種方式會(huì)遇到問題。此時(shí)執(zhí)行時(shí)會(huì)報(bào)如下錯(cuò)誤:
OSError: Error in file F:\video\WinBasedWorkHard_src.mp4, Accessing time t=54.84-54.93 seconds, with clip duration=54 seconds,
這個(gè)報(bào)錯(cuò)信息應(yīng)該是訪問的音頻超出了剪輯的時(shí)長導(dǎo)致,但如果不變換音頻不會(huì)報(bào)錯(cuò),且自動(dòng)置為最后一個(gè)視頻幀,而音頻沒有這樣處理,且不停重復(fù)最后的音頻感知不好。這種問題最好的解決是按前兩種方式處理。
更多的介紹請(qǐng)參考《PyQt+音視頻剪輯實(shí)戰(zhàn)文章目錄》或《音視頻開發(fā)專欄》。
關(guān)于收費(fèi)專欄
老猿的付費(fèi)專欄《使用PyQt開發(fā)圖形界面應(yīng)用》專門介紹基于的PyQt圖形界面開發(fā)基礎(chǔ)教程,付費(fèi)專欄《音視頻開發(fā)專欄》詳細(xì)介紹音視頻剪輯合成處理的類相關(guān)方法及使用相關(guān)方法進(jìn)行相關(guān)剪輯合成場(chǎng)景的處理,兩個(gè)專欄加起來只需要19.9元,都適合有一定基礎(chǔ)但無相關(guān)專利知識(shí)的小白讀者學(xué)習(xí)。
對(duì)于缺乏基礎(chǔ)的同仁,可以通過老猿的免費(fèi)專欄《專欄:基礎(chǔ)教程目錄》從零開始學(xué)習(xí)。
如果有興趣也愿意支持老猿的讀者,歡迎購買付費(fèi)專欄。
跟老猿學(xué)、學(xué)5G!
聲明:本站所有文章資源內(nèi)容,如無特殊說明或標(biāo)注,均為采集網(wǎng)絡(luò)資源。如若本站內(nèi)容侵犯了原著者的合法權(quán)益,可聯(lián)系本站刪除。