使用python拼接視頻實(shí)際應(yīng)用分享

0. 前言

前段時(shí)間購(gòu)買(mǎi)一臺(tái)小米的攝像機(jī)——小白智能攝像機(jī)云臺(tái)版蜒蕾,價(jià)格不貴,但是有個(gè)最大的問(wèn)題就是他以分鐘為單位存儲(chǔ)視頻文件,每分鐘的視頻都會(huì)存儲(chǔ)為一個(gè)mp4文件路翻,這樣導(dǎo)致觀看回放的時(shí)候要頻繁的切換視頻,特別累茄靠。

如果能有辦法將他一小時(shí)為單位合成就好了茂契,了解了python可以輕松實(shí)現(xiàn),所以嘗試了一番慨绳,效果還不錯(cuò)掉冶,另外使用Python編程的感覺(jué)真的很爽。

1. 安裝moviepy

1.1 通過(guò)命令行進(jìn)入python安裝目錄

使用”Win+R"快捷鍵打開(kāi)“運(yùn)行”脐雪,輸入“cmd”命令進(jìn)入命令行終端郭蕉,使用“CD”命令切換到python根目錄

python37安裝位置
D:\>
cd D:\Program Files\python\python37
D:\Program Files\python\python37>cd Scripts

1.2 使用pip安裝moviepy

pip版本必須為20.0.2才可用,如果是早期版本安裝過(guò)程中會(huì)報(bào)錯(cuò)喂江,提示需要升級(jí)版本召锈,按照提示升級(jí)之后重新安裝即可。

期間還遇到imageio_ffmpeg>=0.2.0安裝失敗的情況获询,提示下載超時(shí)涨岁,判斷是網(wǎng)速的問(wèn)題,多試幾次就可以了吉嚣。

D:\Program Files\python\python37\Scripts>pip.exe install moviepy
使用pip安裝moviepy
提示pip版本太低

提示pip版本太低梢薪,使用提示的命令進(jìn)行升級(jí)。

升級(jí)成功

升級(jí)pip版本之后重新安裝moviepy尝哆,安裝成功秉撇。

重新安裝moviepy

2. 編寫(xiě)python腳本

2.1 分析

源文件目錄結(jié)構(gòu)如下:

源文件目錄結(jié)構(gòu)

由上圖可見(jiàn),小米攝像頭將視頻以分鐘為單位進(jìn)行存儲(chǔ),最小的歸檔單位為小時(shí)琐馆,目錄命名規(guī)則為:YYYYMMDDHH规阀,年月日時(shí)同時(shí)體現(xiàn)在目錄名中,視頻文件前幾位命名規(guī)則為:xxMxxS瘦麸。

這樣的命名規(guī)則便于排序谁撼,合成視頻之前先進(jìn)行升序排序操作,以保證合成之后的視頻時(shí)間上保持連續(xù)滋饲。

思路很簡(jiǎn)單厉碟,將最后一級(jí)目錄當(dāng)做程序輸入?yún)?shù)來(lái)使用,遍歷最后一級(jí)目錄屠缭,獲得所有需要合并的視頻文件名稱(chēng)箍鼓,再和固定路徑(/CamerasAndSurveillanc/xiaomi_camera_videos/6490********/)拼接,就可以得到完整的源文件名稱(chēng)序列呵曹。在對(duì)該序列進(jìn)行拼接操作款咖,輸出到指定位置即可。

可以輸出到video station視頻目錄中逢并,這樣就可以方便的通過(guò)NAS視頻客戶(hù)端進(jìn)行查看之剧。

2.2.編寫(xiě)腳本

具體的代碼實(shí)現(xiàn)如下:

# -*- coding:utf-8 -*-
'''
用途:米家小白攝像機(jī)云臺(tái)版視頻文件按照“每分鐘一文件,按小時(shí)歸檔”的方式存儲(chǔ)砍聊,
不便于回放查看背稼,需要設(shè)法將每日或者數(shù)日的視頻文件合并成一個(gè)文件進(jìn)行存儲(chǔ)。

視頻文件存放于NAS上玻蝌,無(wú)需下載到本地進(jìn)行操作蟹肘。
'''
from moviepy.editor import *
import os


def get_name(path, source_path):
    print("獲取文件列表……")
    path_var = []
    for i in source_path:
        path_var.append(path + i)
    
    name_list = []
    for j in path_var:
        for k in os.listdir(j):
            name_list.append(j+'\\'+k)
    name_list.sort()
    for i in name_list:
        print(i)
    return(name_list)    # 排序之后返回

def combine(name_list, purpose_path, source_path):
    print("合并文件……")
    # 使用VideoFileClip()處理源文件名稱(chēng)
    source = []
    for i in name_list:
        j = VideoFileClip(i)
        source.append(j)
    
    
    # 出處文件名為:路徑 + 合并日期小時(shí)1 + 合并日期小時(shí)2 + …… + 合并日期小時(shí)n + (combine).mp4
    for i in source_path:
        purpose_path +=  i
    purpose_path += "(combine)" + ".mp4"
    
    # 使用concatenate_videoclips()合并視頻文件
    purpose_flle = concatenate_videoclips(source)
    # 使用to_videofile()輸出視頻文件
    purpose_flle.to_videofile(purpose_path,fps=25 , remove_temp=True)
    

if __name__ == "__main__":
    
    # 視頻存儲(chǔ)“根”目錄,目錄層級(jí):設(shè)備
    # path = "W:\\xiaomi_camera_videos\\6490********\\"     #NAS路徑
    path = "G:\\video\\xiaomi\\6490********\\"              #本地測(cè)試路徑
    
    
    # 視頻存儲(chǔ)目錄俯树,目錄層級(jí):小時(shí)
    source_path = [
        "2020041617",   # 源文件目錄名稱(chēng):日期+時(shí)
        "2020041618"
        
    ]
    
    # 輸出路徑
    purpose_path = "G:\\video\\xiaomi\\"               # 本地測(cè)試路徑

    # 獲取源文件列表
    name_list = get_name(path, source_path)
    
    # 合并操作
    combine(name_list, purpose_path, source_path)
    
    

2.3 執(zhí)行結(jié)果

使用VSCode編輯和運(yùn)行腳本帘腹,在本地成功執(zhí)行了測(cè)試,程序輸出如下:

獲取文件列表……
G:\video\xiaomi\6490********\2020041617\01M47S_1587027707.mp4
G:\video\xiaomi\6490********\2020041617\03M19S_1587027799.mp4
G:\video\xiaomi\6490********\2020041617\04M53S_1587027893.mp4
G:\video\xiaomi\6490********\2020041617\07M17S_1587028037.mp4
G:\video\xiaomi\6490********\2020041617\08M20S_1587028100.mp4
G:\video\xiaomi\6490********\2020041617\09M44S_1587028184.mp4
G:\video\xiaomi\6490********\2020041617\10M41S_1587028241.mp4
G:\video\xiaomi\6490********\2020041617\13M32S_1587028412.mp4
G:\video\xiaomi\6490********\2020041617\14M53S_1587028493.mp4
G:\video\xiaomi\6490********\2020041617\15M54S_1587028554.mp4
G:\video\xiaomi\6490********\2020041617\17M31S_1587028651.mp4
G:\video\xiaomi\6490********\2020041617\19M33S_1587028773.mp4
G:\video\xiaomi\6490********\2020041617\22M11S_1587028931.mp4
G:\video\xiaomi\6490********\2020041617\23M10S_1587028990.mp4
G:\video\xiaomi\6490********\2020041617\24M09S_1587029049.mp4
G:\video\xiaomi\6490********\2020041617\26M29S_1587029189.mp4
G:\video\xiaomi\6490********\2020041617\31M08S_1587029468.mp4
G:\video\xiaomi\6490********\2020041617\32M36S_1587029556.mp4
G:\video\xiaomi\6490********\2020041617\34M38S_1587029678.mp4
G:\video\xiaomi\6490********\2020041617\35M44S_1587029744.mp4
G:\video\xiaomi\6490********\2020041617\36M44S_1587029804.mp4
G:\video\xiaomi\6490********\2020041617\38M13S_1587029893.mp4
G:\video\xiaomi\6490********\2020041617\39M11S_1587029951.mp4
G:\video\xiaomi\6490********\2020041617\41M09S_1587030069.mp4
G:\video\xiaomi\6490********\2020041617\42M08S_1587030128.mp4
G:\video\xiaomi\6490********\2020041617\48M13S_1587030493.mp4
G:\video\xiaomi\6490********\2020041617\50M02S_1587030602.mp4
G:\video\xiaomi\6490********\2020041617\54M40S_1587030880.mp4
G:\video\xiaomi\6490********\2020041617\57M34S_1587031054.mp4
G:\video\xiaomi\6490********\2020041617\58M34S_1587031114.mp4
G:\video\xiaomi\6490********\2020041617\59M49S_1587031189.mp4
G:\video\xiaomi\6490********\2020041618\02M17S_1587031337.mp4
G:\video\xiaomi\6490********\2020041618\04M00S_1587031440.mp4
G:\video\xiaomi\6490********\2020041618\06M12S_1587031572.mp4
G:\video\xiaomi\6490********\2020041618\10M18S_1587031818.mp4
G:\video\xiaomi\6490********\2020041618\11M32S_1587031892.mp4
G:\video\xiaomi\6490********\2020041618\12M50S_1587031970.mp4
G:\video\xiaomi\6490********\2020041618\14M19S_1587032059.mp4
G:\video\xiaomi\6490********\2020041618\17M19S_1587032239.mp4
G:\video\xiaomi\6490********\2020041618\18M25S_1587032305.mp4
G:\video\xiaomi\6490********\2020041618\19M34S_1587032374.mp4
G:\video\xiaomi\6490********\2020041618\20M33S_1587032433.mp4
G:\video\xiaomi\6490********\2020041618\21M43S_1587032503.mp4
G:\video\xiaomi\6490********\2020041618\22M42S_1587032562.mp4
G:\video\xiaomi\6490********\2020041618\24M28S_1587032668.mp4
G:\video\xiaomi\6490********\2020041618\27M23S_1587032843.mp4
G:\video\xiaomi\6490********\2020041618\28M51S_1587032931.mp4
G:\video\xiaomi\6490********\2020041618\30M37S_1587033037.mp4
G:\video\xiaomi\6490********\2020041618\31M34S_1587033094.mp4
G:\video\xiaomi\6490********\2020041618\33M17S_1587033197.mp4
G:\video\xiaomi\6490********\2020041618\34M21S_1587033261.mp4
G:\video\xiaomi\6490********\2020041618\36M28S_1587033388.mp4
G:\video\xiaomi\6490********\2020041618\37M26S_1587033446.mp4
G:\video\xiaomi\6490********\2020041618\38M40S_1587033520.mp4
G:\video\xiaomi\6490********\2020041618\40M52S_1587033652.mp4
G:\video\xiaomi\6490********\2020041618\41M50S_1587033710.mp4
G:\video\xiaomi\6490********\2020041618\42M50S_1587033770.mp4
G:\video\xiaomi\6490********\2020041618\44M47S_1587033887.mp4
G:\video\xiaomi\6490********\2020041618\46M01S_1587033961.mp4
G:\video\xiaomi\6490********\2020041618\48M41S_1587034121.mp4
G:\video\xiaomi\6490********\2020041618\49M38S_1587034178.mp4
G:\video\xiaomi\6490********\2020041618\50M47S_1587034247.mp4
G:\video\xiaomi\6490********\2020041618\51M47S_1587034307.mp4
G:\video\xiaomi\6490********\2020041618\52M47S_1587034367.mp4
G:\video\xiaomi\6490********\2020041618\55M29S_1587034529.mp4
G:\video\xiaomi\6490********\2020041618\56M54S_1587034614.mp4
G:\video\xiaomi\6490********\2020041618\58M25S_1587034705.mp4
合并文件……
Moviepy - Building video G:\video\xiaomi\20200416172020041618(combine).mp4.
MoviePy - Writing audio in 20200416172020041618(combine)TEMP_MPY_wvf_snd.mp3
MoviePy - Done.
Moviepy - Writing video G:\video\xiaomi\20200416172020041618(combine).mp4

Moviepy - Done !
Moviepy - video ready G:\video\xiaomi\20200416172020041618(combine).mp4
PS F:\portoflove\3 Frank\Code\VScode>
程序執(zhí)行結(jié)果

本文作者原創(chuàng)许饿,轉(zhuǎn)載請(qǐng)注明出處阳欲!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市陋率,隨后出現(xiàn)的幾起案子球化,更是在濱河造成了極大的恐慌,老刑警劉巖瓦糟,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件筒愚,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡菩浙,警方通過(guò)查閱死者的電腦和手機(jī)巢掺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)句伶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人陆淀,你說(shuō)我怎么就攤上這事考余。” “怎么了倔约?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵秃殉,是天一觀的道長(zhǎng)坝初。 經(jīng)常有香客問(wèn)我浸剩,道長(zhǎng),這世上最難降的妖魔是什么鳄袍? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任绢要,我火速辦了婚禮,結(jié)果婚禮上拗小,老公的妹妹穿的比我還像新娘重罪。我一直安慰自己,他們只是感情好哀九,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布剿配。 她就那樣靜靜地躺著,像睡著了一般阅束。 火紅的嫁衣襯著肌膚如雪呼胚。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,268評(píng)論 1 309
  • 那天息裸,我揣著相機(jī)與錄音蝇更,去河邊找鬼。 笑死呼盆,一個(gè)胖子當(dāng)著我的面吹牛年扩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播访圃,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼厨幻,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了腿时?” 一聲冷哼從身側(cè)響起况脆,我...
    開(kāi)封第一講書(shū)人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎圈匆,沒(méi)想到半個(gè)月后漠另,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡跃赚,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年笆搓,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了性湿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡满败,死狀恐怖肤频,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情算墨,我是刑警寧澤宵荒,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站净嘀,受9級(jí)特大地震影響报咳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜挖藏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一暑刃、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧膜眠,春花似錦岩臣、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至辟躏,卻和暖如春谷扣,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鸿脓。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工抑钟, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人野哭。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓在塔,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親拨黔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蛔溃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 什么是 pip 贺待?pip 是 Python 中的標(biāo)準(zhǔn)庫(kù)管理器。它允許你安裝和管理不屬于 Python標(biāo)準(zhǔn)庫(kù) 的其它...
    PathonDiss閱讀 15,444評(píng)論 1 11
  • 引言 在這里我假設(shè)你已經(jīng)看完了一篇Python教程零截,基本熟悉了Python的結(jié)構(gòu)和語(yǔ)法麸塞,在命令行下的Python互...
    Programmer客棧閱讀 65,133評(píng)論 0 17
  • 權(quán)當(dāng)往后無(wú)余生 片刻即倉(cāng)頡 再見(jiàn)時(shí) 無(wú)酒亦歡 相看無(wú)語(yǔ)靜逸 還在那時(shí)情節(jié) 萬(wàn)物無(wú)邪 皆有定數(shù)歸期 細(xì)數(shù)曾經(jīng) 竟然一...
    蓮籽閱讀 331評(píng)論 0 1
  • 季節(jié)轉(zhuǎn)換酷暑去,神清氣爽入淺秋涧衙。 雖說(shuō)處暑熱尚在哪工,難擋秋風(fēng)入屠蘇奥此。 蟬鳴聲聲次第遠(yuǎn),雁群低吟欲歸途雁比。 曾經(jīng)傾心看綠...
    時(shí)光風(fēng)景閱讀 2,514評(píng)論 59 108
  • 2018年11月16日 孟雅麗 晚上7點(diǎn)的時(shí)候稚虎,在去我妹妹家的路上接到閨女小飯桌曹老師的電話,說(shuō)白天的時(shí)...
    孟母堂研究生孟珈賢閱讀 203評(píng)論 0 0