1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        三行Python程序代碼實(shí)現(xiàn)MP4視頻轉(zhuǎn)GIF動(dòng)畫文件

        共 5319字,需瀏覽 11分鐘

         ·

        2021-04-02 17:21

        點(diǎn)擊上方AI算法與圖像處理”,選擇加"星標(biāo)"或“置頂”

        重磅干貨,第一時(shí)間送達(dá)

        一、引言


        最近看到好幾篇類似“n行Python代碼…”的博文,看起來還挺不錯(cuò),簡潔、實(shí)用,傳播了知識(shí)、帶來了閱讀量,撩動(dòng)了老猿的心,決定跟風(fēng)一把,寫個(gè)視頻轉(zhuǎn)動(dòng)畫的三行代碼的極簡實(shí)現(xiàn)。


        二、moviepy


        2.1、moviepy介紹


        要實(shí)現(xiàn)視頻轉(zhuǎn)動(dòng)畫,老猿使用了moviepy庫。


        MoviePy是一個(gè)用于視頻編輯的Python模塊,可用于進(jìn)行視頻的基本操作(如剪切、連接、標(biāo)題插入)、視頻合成(也稱非線性編輯)、視頻處理或創(chuàng)建高級(jí)效果。


        它可以讀寫最常見的視頻格式,包括GIF。MoviePy能處理的視頻是ffmpeg格式的,老猿理解支持的文件類型至少包括:*.mp4 *.wmv *.rm *.avi *.flv *.webm *.wav *rmvb 。


        MoviePy使用ffmpeg讀取、導(dǎo)出視頻和音頻文件,使用ImageMagick生成文本和輸出GIF文件。Python的快速數(shù)字庫Numpy保證了不同媒體的處理。高級(jí)效果和增強(qiáng)使用了Python的許多圖像處理庫(PIL、Scikit-image、scipy等)。


        moviepy的核心對象是剪輯(clips),包括AudioClips 和VideoClips。它們可以修改(剪切、減速、變暗…)或與剪輯混合以形成新剪輯,可以使用PyGame或IPython Notebook預(yù)覽,并可以輸出到對應(yīng)類型的文件(如MP4、GIF、 MP3等)。例如,VideoClips可以從視頻文件、圖像、文本或自定義動(dòng)畫創(chuàng)建。VideoClips可以有一個(gè)音頻軌道(這是一個(gè)AudioClip)和一個(gè)mask(一個(gè)特殊的VideoClip,指示當(dāng)剪輯與其他剪輯混合時(shí)要隱藏哪些部分)。


        2.2、moviepy安裝


        MoviePy安裝非常簡單,使用pip安裝時(shí),請將站點(diǎn)指向國內(nèi)的鏡像站點(diǎn),否則下載很慢或者下載不下來,老猿使用清華的鏡像,指令是:

        pip install -i https://pypi.tuna.tsinghua.edu.cn/simple moviepy


        注意:

        1、moviepy全小寫,安裝時(shí)會(huì)自動(dòng)安裝相關(guān)依賴包;

        2、建議安裝最新的版本1.0.3,因?yàn)?.0.2中有個(gè)比較大的bug,請見《在Python中使用moviepy進(jìn)行視頻剪輯時(shí)輸出文件報(bào)錯(cuò) ‘NoneType’ object has no attribute 'stdout’問題》;

        3、如果沒有安裝最新版本,可以執(zhí)行版本升級(jí),指令:

        pip install -i https://pypi.tuna.tsinghua.edu.cn/simple moviepy --upgrade


        關(guān)于Moviepy更多的介紹,請參考老猿的免費(fèi)專欄《https://blog.csdn.net/laoyuanpython/category_9991887.html PyQt+moviepy音視頻剪輯實(shí)戰(zhàn)》。


        三、三行代碼實(shí)現(xiàn)視頻轉(zhuǎn)GIF


        from  moviepy.editor import *

        clipVideo = VideoFileClip(r"F:\video\WinBasedWorkHard_src.mp4").crop(0, 278, 540, 580)clipVideo.write_gif(r"F:\video\WinBasedWorkHard.gif")

        上面三行代碼加載moviepy相關(guān)模塊,讀入視頻文件,然后輸出到動(dòng)畫文件中,整個(gè)工作就這么簡單。

        結(jié)果文件

        這個(gè)視頻是老猿在進(jìn)行視頻剪輯處理時(shí)經(jīng)常用到的,斯人已逝,一路走好!


        他和星爺帶來的歡笑永存!


        四、涉及相關(guān)函數(shù)


        上述代碼涉及到的相關(guān)函數(shù)包括VideoFileClip、crop和write_gif。


        4.1、VideoFileClip函數(shù)

        VideoFileClip實(shí)際上是一個(gè)類,其構(gòu)造方法如下:


        __init__(self, filename, has_mask=False,                 audio=True, audio_buffersize=200000,                 target_resolution=None, resize_algorithm='bicubic',                 audio_fps=44100, audio_nbytes=2, verbose=False,                 fps_source='tbr')



        參數(shù)說明:

         filename:視頻文件名,可以帶路徑

         has_mask:是否有遮罩 ,如果視頻文件帶遮罩,則設(shè)置has_mask為True。視頻文件一般很少帶遮罩,但有些視頻編碼支持遮罩功能。例如如果moviepy合成了一個(gè)帶遮罩的剪輯,則可以使用《moviepy音視頻剪輯:視頻剪輯基類VideoClip的屬性及方法詳解》介紹的VideoClip.write_videofile將剪輯和遮罩、音頻信息一起保存到視頻文件中

         audio:如果視頻文件不帶音頻或者不希望加載視頻文件的音頻,可以將audio參數(shù)設(shè)置為False

         audio_buffersize:音頻文件讀取緩沖區(qū)大小,字節(jié)為單位,一般用缺省值足夠,如果audio_buffersize比一個(gè)音頻幀的大小還要小,會(huì)自動(dòng)使用音頻幀的大小代替

         target_resolution:設(shè)置為加載后需要變換到的分辨率,類型為列表或元組,第一個(gè)元素為分辨率的高,第二個(gè)為寬,如果高或?qū)捰幸粋€(gè)為None,則保持現(xiàn)有縱橫比調(diào)整幀的大小。如果保持原分辨率不變,則不需要設(shè)置本參數(shù)或設(shè)置為None。如果設(shè)置了新的分辨率,則在調(diào)用ffmpeg 返回視頻剪輯的幀之前會(huì)按新的分辨率調(diào)整幀的大小。這比使用轉(zhuǎn)換為高分辨率流然后再調(diào)整分辨率會(huì)快很多

         resize_algorithm:要改變加載后的視頻分辨率,可以通過resize_algorithm指定調(diào)整分辨率的算法,缺省值為 “bicubic”,還可以是 “bilinear” 、"fast_bilinear"等。關(guān)于算法的更多信息請參考:https://ffmpeg.org/ffmpeg-scaler.html

         audio_fps:聲音的采樣頻率

         audio_nbytes:聲音采樣的位數(shù)

         verbose:是否在標(biāo)準(zhǔn)輸出設(shè)備上顯示處理信息

         fps_source:從視頻的元數(shù)據(jù)metadata哪個(gè)數(shù)據(jù)中獲取fps值,默認(rèn)設(shè)置為’tbr’,但可以設(shè)置為’fps’,這可能有助于導(dǎo)入慢動(dòng)作視頻,否則可能會(huì)出意外。

        4.2、crop函數(shù)

        crop函數(shù)從剪輯中獲取一個(gè)矩形區(qū)域的剪輯內(nèi)容作為新的剪輯。本案例中使用是因?yàn)樵曨l是從某短視頻中下載的,帶有短視頻的特定框架,使用crop保留了核心的視頻圖像。


        調(diào)用語法:

        crop( clip, x1=None, y1=None, x2=None, y2=None, width=None, height=None, x_center=None, y_center=None)


        參數(shù):

        x1、y1:代表矩形區(qū)域左上角坐標(biāo)

        x2、y2:代表矩形區(qū)域右下角坐標(biāo)

        width、height:是寬度和高度

        x_center、y_center:表示x1的坐標(biāo)為x_center-width/2,x2的坐標(biāo)為x_center+width/2,y_center類似處理

        數(shù)據(jù)計(jì)算邏輯

        下面以橫坐標(biāo)系數(shù)據(jù)為例來說明矩形位置坐標(biāo)(單位:像素)的計(jì)算邏輯:


        橫坐標(biāo)系數(shù)據(jù) x1、x2、width只要出現(xiàn)任意2個(gè)就能算出另外1個(gè)

        x_center如果出現(xiàn),則可以計(jì)算出x1和x2

        如果 x1、x2、width只出現(xiàn)1個(gè)或者都未出現(xiàn),則x1、x2其中未出現(xiàn)的則取原剪輯的左上角或右下角的橫坐標(biāo),因此單獨(dú)出現(xiàn)width沒有意義

        以上計(jì)算過程是有順序的,只有前面的不滿足才會(huì)執(zhí)行后面的??v坐標(biāo)系數(shù)據(jù)同樣如此。

        4.3、write_gif方法

        write_gif將剪輯轉(zhuǎn)換成gif動(dòng)畫輸出到文件中,調(diào)用語法:


        def write_gif(self, filename, fps=None, program='imageio',                  opt='nq', fuzz=1, verbose=True,                  loop=0, dispose=False, colors=None, tempfiles=False,                  logger='bar')



        參數(shù)說明如下:

         program:用于轉(zhuǎn)換的軟件,可以是“imageio”(這將通過imageio使用FreeImage庫),或者是“ImageMagick”,或者是“ffmpeg”

         opt:應(yīng)用優(yōu)化的選項(xiàng),如果program參數(shù)是’imageio’,opt必須是’wu’(Wu)或“nq”(Neuquant),。如果program=‘ImageMagick’,opt可以是“optimizeplus”或“OptimizeTransparency”

         fuzz:僅當(dāng)program='ImageMagick’時(shí)需要,通過考慮小于fuzz%的顏色差異實(shí)際上是相同的來壓縮GIF文件大小

         loop:表示GIF文件播放時(shí)循環(huán)播放多少次,如果為0就一直不停地播放,否則播放設(shè)定次數(shù)后就停止,該參數(shù)由GIF文件頭控制

         dispose:表示播放動(dòng)畫時(shí)渲染當(dāng)前幀時(shí),如何處理前一幀,該參數(shù)由GIF文件頭控制,moviepy沒有說明該參數(shù)怎么使用,缺省值為False,老猿查閱了相關(guān)資料,才基本確認(rèn)該參數(shù)的作用,但GIF中該控制參數(shù)有四個(gè)取值,不知道是否都支持,取值及含義如下:

        為0表示繪制一個(gè)完整大小的、不透明的GIF幀來替換上一幀,就算連續(xù)的兩幀只在局部上有細(xì)微的差異,每一幀依然是完整獨(dú)立的繪制

        為1表示未被當(dāng)前幀覆蓋的前一幀像素將繼續(xù)顯示,這種方式常用于對GIF動(dòng)畫進(jìn)行優(yōu)化,當(dāng)前幀只需在上一幀的基礎(chǔ)上做局部刷新,上一幀中沒有被當(dāng)前幀覆蓋的像素區(qū)域?qū)⒗^續(xù)展示。這種方式既能節(jié)省內(nèi)存,也能提高解碼速度

        為2 表示繪制當(dāng)前幀之前,會(huì)先把前一幀的繪制區(qū)域恢復(fù)成背景色,這種方式常用于優(yōu)化很多幀背景相同的情況,上一幀的背景色能通過當(dāng)前幀的透明區(qū)域顯示

        為3表示繪制當(dāng)前幀時(shí),會(huì)先恢復(fù)到最近一個(gè)設(shè)置為False或1的幀,然后再將當(dāng)前幀疊加到上面,這種方式性能比較差,已經(jīng)被慢慢廢棄

         colors:關(guān)于這個(gè)參數(shù)moviepy沒有說明,老猿將該值設(shè)置為一個(gè)比較大的值,結(jié)果報(bào)錯(cuò)“ValueError: GIF quantize param must be 2…256”,最后查閱資料確認(rèn)該參數(shù)表示色彩量化使用的調(diào)色板索引,取值為2到256。GIF最高支持8位256色,那么如果原圖是真彩色的,則在生成最終效果圖時(shí),就涉及到真彩色到256的降色。真彩色是24位的,有2的24種顏色,每個(gè)像素用3個(gè)字節(jié)標(biāo)識(shí)一個(gè)顏色,R、G、B各占一個(gè)字節(jié),而256色每個(gè)像素只用一個(gè)字節(jié)從調(diào)色板中索引一種顏色,調(diào)色板最多有256種顏色。將2^24種顏色降為256種顏色,降色的過程被稱為色彩量化。色彩量化過程分兩步:1、根據(jù)圖片定制調(diào)色板;2、遍歷像素,對于每一個(gè)像素,從調(diào)色板中找最接近的顏色,記錄該顏色索引。關(guān)于調(diào)色板請參考《調(diào)色板詳解》

         tempfiles:將每個(gè)幀寫入一個(gè)文件,而不是將它們傳遞到RAM中。在內(nèi)存很少的計(jì)算機(jī)上很有用,只能與ImageMagick或ffmpeg一起使用。

        五、小結(jié)

        本文介紹了使用Python+Moviepy三行代碼實(shí)現(xiàn)MP4視頻文件轉(zhuǎn)gif動(dòng)畫,并介紹了相關(guān)處理的關(guān)鍵函數(shù)及語法,實(shí)際上所有FFmpeg格式的視頻文件Moviepy都能處理。



        個(gè)人微信(如果沒有備注不拉群!
        請注明:地區(qū)+學(xué)校/企業(yè)+研究方向+昵稱



        下載1:何愷明頂會(huì)分享


        AI算法與圖像處理」公眾號(hào)后臺(tái)回復(fù):何愷明,即可下載。總共有6份PDF,涉及 ResNet、Mask RCNN等經(jīng)典工作的總結(jié)分析


        下載2:終身受益的編程指南:Google編程風(fēng)格指南


        AI算法與圖像處理」公眾號(hào)后臺(tái)回復(fù):c++,即可下載。歷經(jīng)十年考驗(yàn),最權(quán)威的編程規(guī)范!



        下載3 CVPR2021

        AI算法與圖像處公眾號(hào)后臺(tái)回復(fù):CVPR,即可下載1467篇CVPR 2020論文 和 CVPR 2021 最新論文

        點(diǎn)亮 ,告訴大家你也在看





        瀏覽 74
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評論
        圖片
        表情
        推薦
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            国产 精品 探花 熟女 AV | 国产资源在线观看 | 美女高潮喷水网站 | 国产aa级片| 亚洲小鲜肉gay网站免费 免费观看黄色小视频 | 久久久久久国产视频 | 我和小三做又紧水有多爽 | www.男人的天堂 | 色哟哟一区二区三区 | 爱99视频|