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根目錄
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版本太低梢薪,使用提示的命令進(jìn)行升級(jí)。
升級(jí)pip版本之后重新安裝moviepy尝哆,安裝成功秉撇。
2. 編寫(xiě)python腳本
2.1 分析
源文件目錄結(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>
本文作者原創(chuàng)许饿,轉(zhuǎn)載請(qǐng)注明出處阳欲!