引言
为什么想要制作小米摄像机的延时视频
之前使用过群晖的SurveillanceStation,就是网络摄像机,可以对接onvif协议的摄像头,里面有个延时视频的功能特别喜欢,延时视频就相当于倍速播放。
家里有米家摄像头,对接了NAS,存了很多视频,想保留一下宝宝小时候的视频。本来想放到闲置的硬盘里,后来发现占用空间比较大,就想到了制作延时视频,又好玩又好看,又能减少空间占用
经过实验,群晖中的软件无法实现,网上也找不到免费的批量制作软件,无意间找到了ffmpeg这个工具,
合并多个延时视频的需求
由于小米摄像机保存的视频文件是每小时一个文件夹,每分钟一个视频,视频文件实在是太多了,于是就想能不能将视频拼接到一起,不要那么多视频文件,看起来也不方便,查了一下ffmpeg有这个功能。
一、FFmpeg简介与安装
FFmpeg是什么:强大的多媒体处理工具,这个自行搜索,可以直接用命令进行多媒体的处理。
安装FFmpeg:
Windows:下载FFmpeg可执行文件,解压并添加到系统路径
下载地址:Download FFmpeg
注意:要添加环境变量,否则在批处理中是无法找到命令的。
二、为什么要使用FFmpeg处理小米摄像机视频
首先是本人能力有限没找到好用的批量生成延时视频的免费软件
小米摄像机视频的格式都是一样的(H.264编码的MP4文件),FFmpeg处理相同格式的视频比较容易,限制比较少
FFmpeg对视频处理的强大功能,使用FFmpeg实现延时视频制作,主要是利用其后期合成能力。首先,将拍摄的照片导入电脑,并使用FFmpeg进行预处理,如重命名、修片等。然后,使用FFmpeg的命令行工具,将这些照片按照设定的帧率和分辨率编码成视频。在此过程中,可以通过调整FFmpeg的参数来控制视频的播放速度、画质等,从而实现延时效果
三、使用FFmpeg生成延时视频
准备工作:
将小米摄像机视频文件传输到计算机(当然也可以是其他的视频,多个文件最好视频的格式要一致),准备测试视频,最好测试一下,防止命令不对把原视频破坏了,或者生成的效果不好可以调整下。
FFmpeg延时命令解析:
ffmpeg -i "27M55S_1641436075.mp4" -filter:a "atempo=5" -vf "setpts=0.2*PTS" -c:v libx264 -preset veryfast -crf 23 -c:a aac "delayed_27M55S_1641436075.mp4"
上面的参数分析:
-filter:a "atempo=5"
:这个参数用于调整音频的播放速度。atempo
是音频滤镜,用于控制音频播放速度的快慢。这里的5
表示将音频速度调整为原来的5倍。我用的不一定标准,感觉音频加快太多有点听不清声音,但是视频都加快了5倍,声音听不清也正常,有个动静就行。
-vf "setpts=0.2*PTS"
:这个参数用于调整视频的播放速度。setpts
是视频滤镜,通过改变每一个pts时间戳来实现倍速效果。这里的0.2*PTS
表示将每帧视频的pts时间戳都乘以0.2,即实现5倍速播放(因为1除以0.2等于5)。实测这种方式不会跳帧,效果还可以。
遇到的问题与解决方案:
问题1:帧率设置不当导致视频过快或过慢
解决方案:调整-vf "setpts=PTS/SPEED"
中的SPEED值
问题2:音频处理不当导致杂音或无声
解决方案:使用-c:a aac
生成新的音频
四、合并多个延时视频
FFmpeg合并视频命令解析:
使用concat滤镜或concat协议
首先创建一个文本文件,例如outputFile
.txt,在文件中按照以下格式列出要拼接的音视频文件路径:
file 'path/to/file1'
file 'path/to/file2'
file 'path/to/file3'
执行以下命令,将输入文件作为参数传递给ffmpeg,并指定输出文件的路径:
ffmpeg -f concat -safe 0 -i "outputFile
.txt" -c:v copy -c:a aac "%cd%\%%d.mp4"
上面的参数分析:
上面的命令是经过实验的出的,其中outputFile
需要提前创建,是告诉ffmpeg把哪些文件合并用的,最后的文件名根据实际情况修改
-c:v copy -c:a aac
这个命令如果不加可能会没有声音
遇到的问题与解决方案:
问题1:合并的视频之间有黑屏或闪烁
解决方案:确保所有视频具有相同的编码设置和帧率
问题2:合并后的视频文件过大
解决方案:调整输出视频的编码参数或使用-crf值进行压缩
五、将两个步骤合并,同时生成延时视频并合并视频文件,批处理代码编写与一键生成脚本
FFmpeg合并视频并生成延时视频一步命令:
ffmpeg -f concat -safe 0 -i "outputFile.txt" -filter:a "atempo=5" -vf "setpts=0.2*PTS" -c:v libx264 -preset veryfast -crf 25 -c:a aac "delayed_%%d.mp4"
这个命令是将上面的2个命令合到了一起,我也是突发奇想,试了一下发现完全可以,毕竟参数不同。
一键生成脚本分享:
根据上面的命令我编写了一键生成脚本,放到视频文件夹里面执行就自动生成了。非常方便。
下面的脚本可以直接点击下载
批处理脚本:
@echo off
setlocal enabledelayedexpansion
:: 遍历当前目录下的所有目录
for /d %%d in (*) do (
:: 设置输出文件的路径(以目录名命名)
set "outputFile=%cd%\%%d.txt"
echo !outputFile!
:: 如果输出文件已存在,则删除它(可选)
if exist "!outputFile!" del "!outputFile!"
echo "if exist !outputFile! delete"
cd %%d
echo "jinru %%d"
:: 遍历当前目录下的所有文件(非递归)
for %%f in (*) do (
echo "zhaodao %%f"
:: 输出带有 'file' 关键字的文件路径到输出文件
echo file '%%d\%%f' >> !outputFile!"
)
echo "%%d xun huan jie shu"
cd ..
echo "tui chu %%d"
:: 如果需要,可以在这里调用 FFmpeg(但请注意,这将在每个目录后都尝试调用)
::ffmpeg -f concat -safe 0 -i "!outputFile!" -c:v copy -c:a aac "%cd%\%%d.mp4"
:: 进行延时处理 这里合并+处理一步完成
ffmpeg -f concat -safe 0 -i "!outputFile!" -filter:a "atempo=5" -vf "setpts=0.2*PTS" -c:v libx264 -preset veryfast -crf 25 -c:a aac "delayed_%%d.mp4"
::删除原视频
::del "%%d.mp4"
::删除文件列表
del "%%d.txt"
::删除源文件
rd %%d /s /q
)
echo 完成。
pause
脚本使用说明:
该脚本遍历文件夹中的所有视频文件,合并视频,应用延时处理并保存新视频文件。
该脚本是在window下执行的
脚本是放在小米视频文件夹,日期文件夹目录下的(遍历了当前目录下的日期文件夹,没找到一个文件夹就处理一个,每个文件夹内每分钟有一个视频文件,本脚本将这些小文件合并成了一个),使用的时候可以根据实际情况调整
该脚本中包含删除原视频的命令,危险操作,请测试好后再使用,不要直接使用!
该脚本生成的视频是5倍的倍速,可以调整里面的参数,某些视频播放器可以慢速播放,我试过调成0.25x就和正常视频没什么区别,但是声音缺失了,所有这个压缩损失还是挺大的。
脚本运行的时候非常占用cpu,我试过性能越高的cpu生成越快,为了发热小一点,功率小一点,我在电源选项中限制了cpu的主频,兼顾了性能和效率。
六、总结
最近刚刚尝试使用ffmpeg这个工具,对于上面的说明如果有任何不准确的地方,还请大家多多谅解,我们一起学习,共同进步。
视频处理完成后我跟高兴,经过尝试,视频文件的大小得到了显著减少,存储空间也节省了近5倍。
对于这个脚本,我相信还有更多的提升空间。例如,硬件加速功能我目前还没有使用,如果有显卡的话,应该能够进一步提升效率。然而,我这个电脑是AMD的小主机,虽然核显性能不错,但与这个软件的兼容性可能不是那么好。
最后,我要感谢百度AI助手,我在使用的过程中产生的许多命令都是向它询问的,它在我遇到问题时也给了我很多改进的建议。虽然它的智能程度还有待提高,但它仍然为我提供了宝贵的技术支持。
评论区