使用ffmpeg合并米家摄像头视频文件

发布于 / Python / 9 条评论

米家摄像头标准版的录像文件在内存卡中存储逻辑是

record

|-- day

    |--  hour

        |-- minute

            |-- 3 seconds

每3秒一个mp4文件,让转存后回放十分麻烦。。

于是写了如下CMD脚本,使用ffmpeg合并视频。。

@echo off& setlocal EnableDelayedExpansion

rem =======================配置=======================
rem 在这里设置你的录像record文件夹和转码视频输出文件夹
rem 文件路径使用 \ 而不是 /
rem 请保持最后是 \
set record_dir=G:\record\
set output_dir=F:\converted\
rem ==================================================


set tmp_dir=%~dp0tmp_ffmpeg_txtfiles
rd /s /q !tmp_dir!
mkdir !tmp_dir!
for /f "delims=" %%a in ('dir /ad/b "!record_dir!"') do (
    set dat=%%a
    set dir=!record_dir!!dat!\
    echo 开始处理 !dat!
    echo 正在查找文件......
    
    set files_cnt=0
    for /f "delims=" %%b in ('dir /ad/b "!dir!"') do (
        set dir_1=!dir!%%b
        for /f "delims=" %%d in ('dir /ad/b "!dir_1!"') do (
            set dir_2=!dir_1!\%%d
            for /f %%s in ('dir /b "!dir_2!\*.mp4"') do (
                set fp=!dir_2!/%%s
                echo file !fp:\=/! >> !tmp_dir!\!dat!.txt
                set /A files_cnt=!files_cnt!+1
            )
        )
    )
    echo 文件查找完毕,总共!files_cnt!个视频,命令如下。开启合并进程.......
    echo ffmpeg -f concat -safe 0 -i !tmp_dir!\!dat!.txt -c copy !output_dir!!dat!.mp4
    echo.
    start ffmpeg -f concat -safe 0 -i !tmp_dir!\!dat!.txt -c copy !output_dir!!dat!.mp4
)

配置好record路径和输出路径,运行即可。

之后输出的mp4你有一定概率无法播放,因为米家摄像头采用的视频编码格式为hevc,很多平台没有这个格式的解码器。Windows下可以通过安装Media Player Codec Pack来解决,如果不想安装,则需要多一步命令,把他们都转成h.264

ffmpeg -i inputfile -map 0 -c:a copy -c:s copy -c:v libx264 output.mp4

每个文件都转一下就好啦。。

如果你想一气呵成,把上述脚本的倒数第二行改成

start ffmpeg -f concat -safe 0 -i !tmp_dir!\!dat!.txt -map 0 -c:a copy -c:s copy -c:v libx264 !output_dir!!dat!.mp4

只不过时间会很慢。。

如果生成了一个0kb大小的mp4,而且报错:

Could not find tag for codec pcm_alaw in stream #0, codec not currently supported in container Could not write header for output file #0 (incorrect codec parameters ?): Invalid argument Error initializing output stream 0:1

说明音频编码有问题,将ffmpeg命令后的 -c:a copy 改为 -c:a aac 即可解决。具体命令在评论区。

附一张运行截图

image.png

转载原创文章请注明,转载自: 斐斐のBlog » 使用ffmpeg合并米家摄像头视频文件
  1. wqh227

    两层版本:
    @echo off& setlocal EnableDelayedExpansion

    rem =======================配置=======================
    rem 在这里设置你的录像record文件夹和转码视频输出文件夹
    rem 文件路径使用 \ 而不是 /
    rem 请保持最后是 \ 路径不是中文
    set record_dir=%~dp0record\
    set output_dir=%~dp0converted\
    rem ==================================================

    set tmp_dir=%~dp0tmp_ffmpeg_txtfiles
    rd /s /q !tmp_dir!
    mkdir !tmp_dir!
    for /f "delims=" %%a in ('dir /ad/b "!record_dir!"') do (
    set dat=%%a
    set dir=!record_dir!!dat!\
    echo 开始处理 !dat!
    echo 正在查找文件......

    set files_cnt=0

    for /f %%s in ('dir /b "!dir!\*.mp4"') do (
    set fp=!dir!%%s
    echo file !fp:\=/! >> !tmp_dir!\!dat!.txt
    set /A files_cnt=!files_cnt!+1
    )

    echo 文件查找完毕,总共!files_cnt!个视频,命令如下。开启合并进程.......
    echo ffmpeg -f concat -safe 0 -i !tmp_dir!\!dat!.txt -c copy !output_dir!!dat!.mp4
    echo.
    start ffmpeg -f concat -safe 0 -i !tmp_dir!\!dat!.txt -c copy !output_dir!!dat!.mp4
    )

    pause

  2. uswood

    感谢!! 终于能合并米家而不变大了!

  3. 咕

    运行框一闪而过,然后发现我的米家摄像头视频是一分钟一个的。。如何修改命令

  4. 501279506

    请问下米家2k的视频怎么合并呢

    1. kidultff
      @501279506 没有2k版设备,文章是根据米家摄像机标准版写的脚本,你可以试着用下看看报不报错,也可以提供错误信息和SD卡的存储结构我有时间尝试着改一下脚本
      1. NSS-青成
        @kidultff 米家云台版的文件结构不一样,记录文件夹往下是:日期小时——分钟,结构就两层比较简单,1min时长。是不是代码可以去掉下面两层循环就行呀
  5. 寂静丶

    视频是找到了 但是合并过程1秒就跳过了,最后生成了一个0kb的mp4文件 不知道是什么原因。

    1. 寂静丶
      @寂静丶 一直报错Could not find tag for codec pcm_alaw in stream #0, codec not currently supported in container Could not write header for output file #0 (incorrect codec parameters ?): Invalid argument Error initializing output stream 0:1 --
      1. kidultff
        @寂静丶 音频编码有误。尝试把倒数第二行的ffmpeg命令换成:
        start ffmpeg -f concat -safe 0 -i !tmp_dir!\!dat!.txt -map 0 -c:a aac -c:s copy -c:v copy !output_dir!!dat!.mp4
        如果生成的视频播放有问题,就用:
        start ffmpeg -f concat -safe 0 -i !tmp_dir!\!dat!.txt -map 0 -c:a aac -c:s copy -c:v libx264 !output_dir!!dat!.mp4