使用python拼接视频实际应用分享

0. 前言

前段时间购买一台小米的摄像机——小白智能摄像机云台版,价格不贵,但是有个最大的问题就是他以分钟为单位存储视频文件,每分钟的视频都会存储为一个mp4文件,这样导致观看回放的时候要频繁的切换视频,特别累。

如果能有办法将他一小时为单位合成就好了,了解了python可以轻松实现,所以尝试了一番,效果还不错,另外使用Python编程的感觉真的很爽。

1. 安装moviepy

1.1 通过命令行进入python安装目录

使用”Win+R"快捷键打开“运行”,输入“cmd”命令进入命令行终端,使用“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才可用,如果是早期版本安装过程中会报错,提示需要升级版本,按照提示升级之后重新安装即可。

期间还遇到imageio_ffmpeg>=0.2.0安装失败的情况,提示下载超时,判断是网速的问题,多试几次就可以了。

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

提示pip版本太低,使用提示的命令进行升级。

升级成功

升级pip版本之后重新安装moviepy,安装成功。

重新安装moviepy

2. 编写python脚本

2.1 分析

源文件目录结构如下:

源文件目录结构

由上图可见,小米摄像头将视频以分钟为单位进行存储,最小的归档单位为小时,目录命名规则为:YYYYMMDDHH,年月日时同时体现在目录名中,视频文件前几位命名规则为:xxMxxS。

这样的命名规则便于排序,合成视频之前先进行升序排序操作,以保证合成之后的视频时间上保持连续。

思路很简单,将最后一级目录当做程序输入参数来使用,遍历最后一级目录,获得所有需要合并的视频文件名称,再和固定路径(/CamerasAndSurveillanc/xiaomi_camera_videos/6490********/)拼接,就可以得到完整的源文件名称序列。在对该序列进行拼接操作,输出到指定位置即可。

可以输出到video station视频目录中,这样就可以方便的通过NAS视频客户端进行查看。

2.2.编写脚本

具体的代码实现如下:

# -*- coding:utf-8 -*-
'''
用途:米家小白摄像机云台版视频文件按照“每分钟一文件,按小时归档”的方式存储,
不便于回放查看,需要设法将每日或者数日的视频文件合并成一个文件进行存储。

视频文件存放于NAS上,无需下载到本地进行操作。
'''
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()处理源文件名称
    source = []
    for i in name_list:
        j = VideoFileClip(i)
        source.append(j)
    
    
    # 出处文件名为:路径 + 合并日期小时1 + 合并日期小时2 + …… + 合并日期小时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__":
    
    # 视频存储“根”目录,目录层级:设备
    # path = "W:\\xiaomi_camera_videos\\6490********\\"     #NAS路径
    path = "G:\\video\\xiaomi\\6490********\\"              #本地测试路径
    
    
    # 视频存储目录,目录层级:小时
    source_path = [
        "2020041617",   # 源文件目录名称:日期+时
        "2020041618"
        
    ]
    
    # 输出路径
    purpose_path = "G:\\video\\xiaomi\\"               # 本地测试路径

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

2.3 执行结果

使用VSCode编辑和运行脚本,在本地成功执行了测试,程序输出如下:

获取文件列表……
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>
程序执行结果

本文作者原创,转载请注明出处!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容

  • 什么是 pip ?pip 是 Python 中的标准库管理器。它允许你安装和管理不属于 Python标准库 的其它...
    PathonDiss阅读 15,028评论 1 11
  • 引言 在这里我假设你已经看完了一篇Python教程,基本熟悉了Python的结构和语法,在命令行下的Python互...
    Programmer客栈阅读 65,125评论 0 17
  • 权当往后无余生 片刻即仓颉 再见时 无酒亦欢 相看无语静逸 还在那时情节 万物无邪 皆有定数归期 细数曾经 竟然一...
    莲籽阅读 328评论 0 1
  • 季节转换酷暑去,神清气爽入浅秋。 虽说处暑热尚在,难挡秋风入屠苏。 蝉鸣声声次第远,雁群低吟欲归途。 曾经倾心看绿...
    时光风景阅读 2,503评论 59 108
  • 2018年11月16日 孟雅丽 晚上7点的时候,在去我妹妹家的路上接到闺女小饭桌曹老师的电话,说白天的时...
    孟母堂研究生孟珈贤阅读 190评论 0 0