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>

        n行Python代碼系列:兩行代碼實(shí)現(xiàn)視頻文件指定時(shí)刻畫(huà)面輸出

        共 3514字,需瀏覽 8分鐘

         ·

        2021-07-21 22:27

        一、引言

        最近看到好幾篇類(lèi)似“n行Python代碼…”的博文,看起來(lái)還挺不錯(cuò),簡(jiǎn)潔、實(shí)用,傳播了知識(shí)、帶來(lái)了閱讀量,撩動(dòng)了老猿的心,決定跟風(fēng)一把,推一個(gè)“n行Python代碼系列”文章。


        對(duì)于視頻中的精彩畫(huà)面,有時(shí)希望截圖保存,通過(guò)截屏軟件即可實(shí)現(xiàn),但截屏軟件只能通過(guò)播放軟件定位時(shí)間,該時(shí)間精確度為秒,對(duì)一些特殊需求如科研觀察來(lái)說(shuō)不夠,另外截屏軟件可能會(huì)將播放器的一些控制組件也截屏下來(lái)。如下面的《粉絲記事本》的MV截取10秒位置的圖片:



        本文介紹兩行代碼實(shí)現(xiàn)將視頻指定時(shí)刻畫(huà)面輸出到文件的方法。更多“n行Python代碼系列”文章請(qǐng)參考CSDN老猿Python的免費(fèi)專(zhuān)欄《n行Python代碼系列》。


        二、等時(shí)間間隔輸出視頻畫(huà)面

        要進(jìn)行視頻剪輯,老猿使用的Moviepy。下面代碼使用的視頻《粉絲記事本》,我們來(lái)每隔10秒輸出一張視頻畫(huà)面。代碼實(shí)現(xiàn)如下:

        from  moviepy.editor import *
        clip = VideoFileClip(r"F:\video\fansNote1M_crop.mp4")clip.save_frame (r"F:\video\fansNote1M.jpg",9.75)

        上述三行代碼先實(shí)現(xiàn)Moviepy模塊的加載、然后讀入視頻文件、進(jìn)行指定時(shí)間的畫(huà)面輸出到指定文件。以上三行代碼也可以精簡(jiǎn)為如下兩行:

        from  moviepy.editor import *
        VideoFileClip(r"F:\video\fansNote1M_crop.mp4").save_frame (r"F:\video\fansNote1M.jpg",9.75)

        我們來(lái)看看結(jié)果文件的內(nèi)容:

        和上面的截圖對(duì)比一下,可以體會(huì)前面截屏軟件遇到的問(wèn)題。


        三、背景知識(shí)

        3.1、moviepy介紹

        要實(shí)現(xiàn)視頻剪輯,老猿使用了moviepy庫(kù)。


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


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


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


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


        3.2、moviepy安裝

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


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


        注意:

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


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


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


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


        關(guān)于Moviepy更多的介紹,請(qǐng)參考老猿的免費(fèi)專(zhuān)欄《PyQt+moviepy音視頻剪輯實(shí)戰(zhàn)》。


        3.3、相關(guān)函數(shù)

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


        3.3.1、VideoFileClip

        VideoFileClip實(shí)際上是一個(gè)類(lèi),其構(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ù)說(shuō)明:


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

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

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

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

        • target_resolution:設(shè)置為加載后需要變換到的分辨率,類(lèi)型為列表或元組,第一個(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:要改變加載后的視頻分辨率,可以通過(guò)resize_algorithm指定調(diào)整分辨率的算法,缺省值為 “bicubic”,還可以是 “bilinear” 、"fast_bilinear"等。關(guān)于算法的更多信息請(qǐng)參考: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ì)出意外。


        3.3.2、save_frame函數(shù)

        save_frame函數(shù)用于將t指定時(shí)刻位置的幀保存到指定圖像文件。調(diào)用語(yǔ)法如下:

        save_frame(self, filename, t=0, withmask=True)
        • filename:輸出圖片文件名

        • t:指定時(shí)刻,以輸出75.35秒為例,t的表示方法可以是如下四種之一:

            √ 數(shù)字秒,為一個(gè)浮點(diǎn)數(shù)數(shù)字,如75.35

            √ 分鐘和秒組成的元組,如(1,15.35)

            √ 時(shí)、分、秒組成的元組,如(0,1,15.35)

            √ 用冒號(hào)分隔的時(shí)間字符串,如‘0:1:15.35’


        • withmask:如果withmask為T(mén)rue,對(duì)應(yīng)幀的遮罩會(huì)被寫(xiě)入圖片的alpha通道層,僅對(duì)PNG圖像有效


        四、小結(jié)

        本文介紹了使用Python+Moviepy 兩行代碼實(shí)現(xiàn)將視頻輸指定位置的圖片畫(huà)面輸出到圖片文件的方法,并介紹了moviepy的功能及安裝以及相關(guān)處理的關(guān)鍵函數(shù)及語(yǔ)法。



        瀏覽 58
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

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

        手機(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>
            二本道一区二区三区免费视频 | 国产一级a毛一级a毛观看视频网站 | 欧洲亚洲无码视频 | 成人AV动漫在线观看 | 日本黄色女忧 | 操逼小视频黄色一级 | 肏肥屄| 欧洲性爱无码 | www.欧美成人 | 色老汉AV一区二区三区 |