Armbian给小米摄像机视频合并教程

dwf135 327K 1

之前发了http://www.dwf135.cn/3164.html这个windows的合并脚本,有很多问题。今天来发一个python的。脚本基于https://github.com/rickzuo/xiaomi_video进行简单修改。

给小米摄像机进行备份很简单,已黑豹X2为例,成本60-90元,当然其他rk3399板子、或者廉价的X86板子也行,再挂个USB硬盘即可。
开始正题,SSH登录armbian,开启smb服务。
可以参考这个教程。也可以使用casaos。

执行命令安装python,一般都内置了。

sudo apt-get install python3

安装pip

curl https://bootstrap.pypa.io/get-pip.py -o /root/get-pip.py
python3 /root/get-pip.py

Armbian给小米摄像机视频合并教程
安装loguru

pip install loguru

安装ffmpeg

sudo apt install ffmpeg

Armbian给小米摄像机视频合并教程

保存以下代码另存为main.py,然后上传到root根目录

import argparse
import os
import subprocess
from pathlib import Path

from loguru import logger
import platform

parser = argparse.ArgumentParser(description='合并米家摄像头视频,以天为单位。')
parser.add_argument('indir', help='原米家摄像头视频目录。')
parser.add_argument('--outdir', default='./', help='合并后视频存放目录,目录不存在会被创建。默认当前目录。')
args = parser.parse_args()
skip_filenames = []

def merge_vids(vidlist_file: str, tofile: str):
    """执行 ffmpeg 命令合并视频。"""
    # 需要对音频重新编码,否则会报错:
    # Could not find tag for codec pcm_alaw in stream #1, codec not currently supported in container when concatenating 2 files using ffmpeg
    # ffmpeg -y overwrite
    if platform.system().lower() == "windows":
        cmd = f"ffmpeg -f concat -safe 0 -i {vidlist_file} -c:v copy -c:a flac -strict -2 {tofile}"
        subprocess.run(cmd)
    else:
        cmd = f"ffmpeg -y -f concat -safe 0 -i {vidlist_file} -c:v copy -c:a aac -strict -2 {tofile}"
        subprocess.run(cmd,shell=True)

def has_subdirectories(directory):
    subdirectories = [item for item in os.listdir(directory) if os.path.isdir(os.path.join(directory, item))]
    return bool(subdirectories)

def merge_dirs(indir: str, outdir: str, date_name: str, parent_path: str):
    """合并目录下的监控文件,在当前目录生成以天为单位的视频。
    indir 结构:
    indir
        2021051001
        2021051002
        2021051003
        ...
    即,子目录结构为:年月日时。
    """
    if not Path(outdir).exists():
        logger.info(f'{outdir} 不存在,即将被创建')
        Path(outdir).mkdir(parents=True)

    date_dict = {}

    if Path(indir).is_file():
        print("indir is file:", indir)
        return
    # 小米第一代文件目录有多层
    for d in Path(indir).iterdir():
        if d.is_file():
            # 兼容一级目录是视频文件
            date_dict[date_name] = [Path(indir)]
            break
        if not d.is_dir():
            continue
        date = d.stem[:8]
        if date not in date_dict:
            date_dict[date] = []
        date_dict[date].append(d)

    for ds_date, ds in date_dict.items():
        videos = []
        for d in ds:
            mp4_list = list(Path(d).glob("*.mp4"))
            videos.extend(mp4_list)

        print("data_dict:",d,has_subdirectories(Path(d)))
        if len(videos) == 0 and Path(d).is_dir() and has_subdirectories(Path(d)):
            # 往下层递归
            merge_dirs(Path(d), outdir, date_name, ds_date)
        logger.info(f"{ds_date}, {len(videos)} videos")
        if not videos:
            continue
        videos = sorted(videos, key=lambda f: int(f.stem.split("_")[-1]))
        videos = [
            "file " + str(f.resolve(strict=True)).replace("\\", "/") for f in videos
        ]

        # 直接使用 outdir 作为输出目录
        vidslist_path = f"{outdir}/vidslist.txt"

        Path(vidslist_path).write_text("\n".join(videos), encoding="utf8")
        merge_vids(vidslist_path, Path(outdir).joinpath(f"{ds_date}.mp4"))


def startup(indir: str, outdir: str):
    for date in Path(indir).iterdir():
        date_name = Path(date).name
        if date_name in skip_filenames:
            continue
        print(f"start merge:{date_name} video")
        merge_dirs(Path(date), outdir, date_name, "")


if __name__ == "__main__":
    startup(args.indir, args.outdir)

小米摄像机添加nas存储,选择此存储。
待转存差不多时,SSH执行命令

nohup python3 main.py /media/devmon/sda1-usb-Seagate_Expansio/Work/xiaomi_camera_videos/94F827EF3111 --outdir /media/devmon/sda1-usb-Seagate_Expansio/Work/xiaomi_video &

/media/devmon/sda1-usb-Seagate_Expansio/Work/xiaomi_camera_videos/94F827EF3111为摄像机存储的目录,
/media/devmon/sda1-usb-Seagate_Expansio/Work/xiaomi_video为合并后保存的目录。
nohup开头和&为后台自动运行合并命令,关掉ssh也不影响。

安装alist,添加两个存储,一个是本地目录/media/devmon/sda1-usb-Seagate_Expansio/Work/xiaomi_video,然后再添加一个网盘,根据需求选择,已夸克网盘为例,合并完成后选择本地存储找到合并后的视频,右键复制到夸克网盘。
Armbian给小米摄像机视频合并教程

发表评论 取消回复
表情 图片 链接 代码

  1. 阿文
    阿文 Lv 1

    感谢分享 有机会试试

分享