我正在尝试管理 CCTV 录像,并尝试使用 ffmpeg 批量压缩它们
到目前为止,我设法想出了这个命令
ffmpeg -i "0515 210004.mp4" -b 200000 output.avi
但我需要一次性完成所有事情,但排除当前日期
因此,如果今天是 16.05,那么在我的文件夹中
"0515 210004.mp4"
"0515 220004.mp4"
"0515 230004.mp4"
"0516 000004.mp4"
"0516 010004.mp4"
等等
我只需要转换那些包含 0515 的文件,并且每天这个数字都会增加,因此在 17.05 上我需要它来转换所有包含 0516 的文件。
有时文件也会有_1其中包括“0515 180004_1.mp4”
(最后的 004 是总是那里)
而且我还需要它以完全相同的名称输出它。
我看到了类似的东西
for %%A IN (*.mp4) DO ffmpeg -i "contains "%date% - 1day"" -b 200000 "oldfilename.avi"
我知道这行不通,但我们把它称为伪代码
您对我该如何完成我的任务有什么想法吗?
哦,我正在使用 Windows 7 x64
另外如果你对 ffmpeg 部分有任何建议,我会非常乐意调整我的代码
答案1
我很感谢你的提问,因为你说过“你对我如何完成我的任务有什么想法吗?”而且你没有要求写代码。我猜你想学习。所以这个答案。
- 重点是钥匙,这是独一无二的,并且允许您仅选择必须操作的项目。在这种情况下,您刚才说的是名称的前四个字符当前目录中的文件。很好。
如果是 1 月 1 日或 12 月 31 日(即使您没有被迫使用它),那么它们的长度相同,这甚至更好。
现在您可以逐步编写批处理脚本:
-
$date = Get-Date; $date=$date.AddDays(-1); $date.ToString('yyyy-MM-dd')
请注意,您必须修改上面的格式和变量名称,明天也需要。
选择与昨天的字符串匹配的所有文件。(对于昨天的变量)
- 对于每个[2]用明天的子字符串替换(让脚本来做),在新名称的变量中替换昨天的子字符串[1]。不要忘记改变即使
.mp4
有.avi
... - 输出您构建的字符串。
- 在您确定您的程序之后,请使用 ffmpeg 修改输出行。
现在您只需搜索每个步骤并定制相关命令......
PS> 再次,您可以通过检查输出文件是否存在(如果存在则不会覆盖),处理的文件数量,脚本的良好或不良退出来增强您的脚本...再次。
答案2
最终结果如下
如果有人有代码优化建议,将非常乐意采纳
获取 MMdd 中的昨天日期 -> 选择以该日期开头的所有文件 -> 使用 ffmpeg 压缩它们 -> 根据月份移动到另一个文件夹 -> 删除源文件
$a = (get-date).AddDays(-1).ToString("MMMM")
$d = (get-date).AddDays(-1).ToString("MMdd")
$inProcessPath = "sourcepath"
$oldVideos = Get-ChildItem -Include @("$d *") -Path $inProcessPath -Recurse;
Set-Location -Path 'D:\ffmpeg\bin';
foreach ($oldVideo in $oldVideos) {
$newVideo = [io.path]::ChangeExtension($oldVideo.FullName, '.avi')
$ArgumentList = '-i "{0}" -b 200000 "{1}"' -f $oldVideo, $newVideo;
Start-Process -FilePath "D:\ffmpeg\bin\ffmpeg.exe" -ArgumentList $ArgumentList -Wait -NoNewWindow;
}
Robocopy D:\Main\AdWords\ffmpeg\bin\ntv "D:\path\$a" "$d *.avi" /mov
get-childitem "sourcepath" -include "$d *.mp4" -recurse | foreach ($_) {remove-item $_.fullname}