<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 5319字,需瀏覽 11分鐘

           ·

          2021-04-02 17:21

          點擊上方AI算法與圖像處理”,選擇加"星標"或“置頂”

          重磅干貨,第一時間送達

          一、引言


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


          二、moviepy


          2.1、moviepy介紹


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


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


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


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


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


          2.2、moviepy安裝


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

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


          注意:

          1、moviepy全小寫,安裝時會自動安裝相關(guān)依賴包;

          2、建議安裝最新的版本1.0.3,因為1.0.2中有個比較大的bug,請見《在Python中使用moviepy進行視頻剪輯時輸出文件報錯 ‘NoneType’ object has no attribute 'stdout’問題》;

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

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


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


          三、三行代碼實現(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)模塊,讀入視頻文件,然后輸出到動畫文件中,整個工作就這么簡單。

          結(jié)果文件

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


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


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


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


          4.1、VideoFileClip函數(shù)

          VideoFileClip實際上是一個類,其構(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合成了一個帶遮罩的剪輯,則可以使用《moviepy音視頻剪輯:視頻剪輯基類VideoClip的屬性及方法詳解》介紹的VideoClip.write_videofile將剪輯和遮罩、音頻信息一起保存到視頻文件中

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

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

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

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

           audio_fps:聲音的采樣頻率

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

           verbose:是否在標準輸出設(shè)備上顯示處理信息

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

          4.2、crop函數(shù)

          crop函數(shù)從剪輯中獲取一個矩形區(qū)域的剪輯內(nèi)容作為新的剪輯。本案例中使用是因為原視頻是從某短視頻中下載的,帶有短視頻的特定框架,使用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ū)域左上角坐標

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

          width、height:是寬度和高度

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

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

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


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

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

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

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

          4.3、write_gif方法

          write_gif將剪輯轉(zhuǎn)換成gif動畫輸出到文件中,調(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)化的選項,如果program參數(shù)是’imageio’,opt必須是’wu’(Wu)或“nq”(Neuquant),。如果program=‘ImageMagick’,opt可以是“optimizeplus”或“OptimizeTransparency”

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

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

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

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

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

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

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

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

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

          五、小結(jié)

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



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



          下載1:何愷明頂會分享


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


          下載2:終身受益的編程指南:Google編程風格指南


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



          下載3 CVPR2021

          AI算法與圖像處公眾號后臺回復:CVPR即可下載1467篇CVPR 2020論文 和 CVPR 2021 最新論文

          點亮 ,告訴大家你也在看





          瀏覽 74
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日本A V免费观看电影大全 | 豆花视频网站国产 | 在线看的av | 天天天天澡日日日日澡无码 | 国产无码传媒 |