我需要一种简单的方法将视频转换为 h264 同时保留原始创建日期。
现在我正在手动执行此操作(编码,然后编辑日期),但是当我有 10 多个视频时,这是一项非常无聊的任务。
有没有办法可以自动完成?
带有“保留原始文件日期”选项、批处理、脚本的转换程序:我愿意接受任何操作系统上的任何解决方案。
答案1
测试 将您的视频目录复制到新目录,然后按照以下说明进行操作。
PowerShell 脚本
PowerShell 随 Windows 7 提供,无需下载。(开始->所有程序->附件->Windows PowerShell)。
以管理员身份启动 PowerShell。
在运行任何脚本之前,您必须先执行以下操作(只需执行一次)
Set-ExecutionPolicy RemoteSigned
回答“Y”。
将以下 2 个脚本放入您的视频目录中。打开 PowerShell 并 cd 到您的视频目录。 .ps1是 PowerShell 脚本扩展。
SaveTime.ps1(视频转换之前)
将以下脚本保存为保存时间.ps1在您的视频目录中。在电源外壳在您的视频转换之前。
脚本将创建旧时记录.ps1在同一目录中。
脚本不会覆盖旧时记录.ps1。如果文件已经存在,它只会附加到末尾。
因此,如果您意外运行它并丢失了原始时间戳,也不必担心。只需使用记事本删除多余的行即可。我在最后添加了这种情况的一个例子。
# SaveTime.ps1 - Start
$file = get-item *
write-output "`$file = New-Object string`[`] $($file.count)" >> OldTime-record.ps1
write-output "`$time = New-Object string`[`] $($file.count)" >> OldTime-record.ps1
$time = New-Object string[] $file.count
for ($i = 0; $i -lt $file.count; $i++) {
write-output "`$file`[$i`]=`'$($file[$i].fullname)`'" >> OldTime-record.ps1
write-output "`$time`[$i`]=`'$($file[$i].CreationTimeUTC.tostring('o'))`'" >> OldTime-record.ps1
}
# SaveTime.ps1 - End
OldTime.ps1(视频转换后)
将以下脚本保存为旧时光.ps1在您的视频目录中。在电源外壳视频转换后。此脚本将读取旧时记录.ps1并相应地改变文件创建时间。
# OldTime.ps1 - Start
. .\OldTime-record.ps1
for($i = 0; $i -lt $file.count; $i++) {
write-output "$($file[$i])"
write-output "$($time[$i])"
Set-ItemProperty -Path $($file[$i]) -Name CreationTimeUTC -Value $($time[$i])
}
# OldTime.ps1 - End
旧时记录.ps1
该文件保存了文件名和创建时间记录。下面显示了在记事本中打开它的样子。
$file = New-Object string[] 9
$time = New-Object string[] 9
$file[0]='E:\Downloads\test\New Folder'
$time[0]='2012-11-13T03:11:11.4504830Z'
$file[1]='E:\Downloads\test\file1'
$time[1]='2012-11-10T01:12:14.6126918Z'
$file[2]='E:\Downloads\test\file2'
$time[2]='2012-11-10T01:12:14.6646918Z'
$file[3]='E:\Downloads\test\file3'
$time[3]='2012-11-10T01:12:14.7276918Z'
$file[4]='E:\Downloads\test\cover.jpg'
$time[4]='2012-11-10T01:12:14.7886918Z'
$file[5]='E:\Downloads\test\OldTime.ps1'
$time[5]='2012-11-13T05:22:18.2124830Z'
$file[6]='E:\Downloads\test\SaveTime.ps1'
$time[6]='2012-11-13T05:44:22.8514830Z'
$file[7]='E:\Downloads\test\test.ps1'
$time[7]='2012-11-13T03:26:28.7084830Z'
$file[8]='E:\Downloads\test\test.time.ps1'
$time[8]='2012-11-13T05:32:51.8204830Z'
以下是运行后会发生什么情况保存时间.ps1意外地。它只是将新记录附加到末尾。要修复它,只需删除从第二次出现开始的所有行$file = 新对象字符串[]。
$file = New-Object string[] 9
$time = New-Object string[] 9
$file[0]='E:\Downloads\test\New Folder'
$time[0]='2012-11-13T03:11:11.4504830Z'
$file[1]='E:\Downloads\test\file1'
$time[1]='2012-11-10T01:12:14.6126918Z'
$file[2]='E:\Downloads\test\file2'
$time[2]='2012-11-10T01:12:14.6646918Z'
$file[3]='E:\Downloads\test\file3'
$time[3]='2012-11-10T01:12:14.7276918Z'
$file[4]='E:\Downloads\test\cover.jpg'
$time[4]='2012-11-10T01:12:14.7886918Z'
$file[5]='E:\Downloads\test\OldTime.ps1'
$time[5]='2012-11-13T05:22:18.2124830Z'
$file[6]='E:\Downloads\test\SaveTime.ps1'
$time[6]='2012-11-13T05:44:22.8514830Z'
$file[7]='E:\Downloads\test\test.ps1'
$time[7]='2012-11-13T03:26:28.7084830Z'
$file[8]='E:\Downloads\test\test.time.ps1'
$time[8]='2012-11-13T05:32:51.8204830Z'
$file = New-Object string[] 11
$time = New-Object string[] 11
$file[0]='E:\Downloads\test\New Folder'
$time[0]='2012-11-13T03:11:11.4504830Z'
$file[1]='E:\Downloads\test\file1'
$time[1]='2012-11-10T01:12:14.6126918Z'
$file[2]='E:\Downloads\test\file2'
$time[2]='2012-11-10T01:12:14.6646918Z'
$file[3]='E:\Downloads\test\file3'
$time[3]='2012-11-10T01:12:14.7276918Z'
$file[4]='E:\Downloads\test\cover.jpg'
$time[4]='2012-11-10T01:12:14.7886918Z'
$file[5]='E:\Downloads\test\new 3.txt'
$time[5]='2012-11-13T06:47:05.4784830Z'
$file[6]='E:\Downloads\test\OldTime-record.ps1'
$time[6]='2012-11-13T05:50:11.7044830Z'
$file[7]='E:\Downloads\test\OldTime.ps1'
$time[7]='2012-11-13T05:22:18.2124830Z'
$file[8]='E:\Downloads\test\SaveTime.ps1'
$time[8]='2012-11-13T05:44:22.8514830Z'
$file[9]='E:\Downloads\test\test.ps1'
$time[9]='2012-11-13T03:26:28.7084830Z'
$file[10]='E:\Downloads\test\test.time.ps1'
$time[10]='2012-11-13T05:32:51.8204830Z'
答案2
对于那些不想处理大量脚本的人,我刚刚找到了另一种适用于 Windows 的解决方案:
下载后,程序本身位于 MultipleAviConvDatePreserve\bin\Release\MultipleAviConvDatePreserve.exe
您还可以将它与任何允许命令行的转换器一起使用(例如 handbrake)。不是最容易使用的程序,但比发布的解决方案更容易。
由于我自己在使用这个程序时遇到了一些麻烦,所以我认为一些关于如何使用这个程序的具体说明可能会有所帮助。
打开手刹(或某些启用命令行的视频编码器)并像平常一样设置一个编码文件(使用您想要的所有首选项),然后将其添加到队列中。然后打开队列并单击“队列”按钮和“生成批处理脚本”,如下面的屏幕截图所示:
然后在记事本中打开批处理脚本并复制内容(我们稍后会使用它)。接下来打开 MultipleAviConvDatePreserve.exe 并单击“设置脚本”按钮
然后将 Handbrake 生成的批处理脚本的内容粘贴到脚本文本框中,但将脚本中的源和目标替换为 %source 和 %dest:
我无法让 RunAsDate.exe 工作,但您可以尝试一下 - 据称它可以使系统日期不需要更改。此后,单击确定并返回主窗口。然后单击“选择 DIR”并选择包含要转换的视频文件的目录,同时保留原始创建日期。然后在单选按钮“源扩展名”下输入源的精确(区分大小写)文件扩展名,之后您应该会看到列表中出现一些文件(如果您没有看到任何文件,则扩展名是错误的)。然后选择要转换的文件(通过单击第一个文件然后按住 Shift 键单击最后一个文件来选择所有文件)。然后按“GO!”,从那里开始一切都应该是不言自明的。
答案3
在启用了 Powershell 的 Windows 上,您可以使用此 .BAT 脚本递归转换当前文件夹树中的所有 .AVI 和 .MP4 文件。假设您使用 FF Prompt 中的 ffmpeg 使用相同参数进行编码;无论如何,请随意编辑倒数第二行的编码命令。请注意使用 %1 和 %2 变量来保存每个原始文件(例如“name.ext”)和转换文件(例如“name_.ext”)的名称。
FOR /r %%I in (*.avi, *.mp4) DO CALL :loopbody "%%~fI" "%%~dpnI_%%~xI" "%%~tI"
GOTO :EOF
:loopbody
ffmpeg -i %1 -c:v libx264 -crf 18 -maxrate 4000k -bufsize 4000k -c:a libvo_aacenc -q:a 100 -map_metadata 0 -preset veryslow -tune film -movflags +faststart %2
powershell Set-ItemProperty -LiteralPath '%2' -Name CreationTimeUtc -Value ('%3' -as [Datetime])
答案4
哪个操作系统?有触摸实用程序(命令行和基于 GUI 的)可让您修改文件的创建、修改和访问日期。
例如,这是适用于 Windows 的一个(批量文件修改器):