因此,我在一个驱动器(C:\Users\xxxxx\Desktop\new)中拥有一组仅包含 .m4v 文件的文件。
我想将另一个驱动器(S:\new2)中文件夹中文件的元数据复制到“new”文件夹中。“new2”有.mp4 格式的文件,但“new”和“new2”中的文件的文件名完全相同。
我使用 HandBrake 将“new2”中的所有文件从 1080p 转换为 720p,并将它们保存在“new”文件夹中,但是它们都丢失了修改时间和创建时间等元数据。
那么我该怎么做才能传输元数据?我已经看到可以使用 FFmpeg 将元数据从一个文件映射到另一个文件,但我不知道如何处理单独驱动器中的整个文件夹。
ffmpeg -i in.mp4 -i out.mp4 -map 1 -map_metadata 0 -c copy fixed.mp4
上述命令用于在两个文件之间映射元数据。“in”是转换前的文件,“out”是转换后的文件,“fixed”是映射后带有“in”元数据的“out”文件。
任何帮助都非常感谢!我可以使用 powershell 或 cmd 命令。
答案1
未经测试,但我认为这可以解决问题:
$new = 'C:\Users\xxxxx\Desktop\new'
$new2 = 'S:\new2'
$temp = ( mkdir "$env:tmp\$((Get-Date).Ticks)").FullName
$TroubleShoot = @'
MetaSource: "{0}"
MetaAbsent: "{1}"
Press any key to continue...
'@
Get-ChildItem -Path $new, $new2 -File |
group BaseName |
where Count -eq 2 | ForEach{
$MetaSource = ( $_.Group | ? DirectoryName -eq $new2 ).FullName
$MetaAbsent = ( $_.Group | ? DirectoryName -eq $new ).FullName
$MetaFixed = '{0}\{1}.mp4' -f $temp , $_.Name
Read-Host ($TroubleShoot -f $MetaSource , $MetaAbsent )
ffmpeg -i $MetaSource -i $MetaAbsent -map 1 -map_metadata 0 -c copy $MetaFixed
}
Copy-Item $temp\* $new -Force
Remove-Item $temp -Force
此代码从两个目录收集文件信息,然后群组将BaseName
它们配对。然后我们获取FullName
每个文件的,构造目标文件名,并执行ffmpeg
命令。创建所有新文件后,它们将被复制到原始文件上,并且临时文件夹将被删除。