Handbrake是一个非常棒的视频压缩工具,但它似乎不会保留视频压缩后的原始捕获时间。知道如何解决这个问题吗?
Handbrake是一个非常棒的视频压缩工具,但它似乎不会保留视频压缩后的原始捕获时间。知道如何解决这个问题吗?
Answers:
您可以将现有元数据从一个文件复制到另一个文件,而无需使用重新编码视频 FFmpeg的 。它基本上需要一秒钟。为此,我们假设有三个文件:
in.mp4
- 转换前的原始文件 out.mp4
- 手刹转换后的文件 fixed.mp4
- 具有“更正”元数据的文件 将完整元数据记录复制到新文件的FFmpeg命令将是:
ffmpeg -i in.mp4 -i out.mp4 -map 1 -map_metadata 0 -c copy fixed.mp4
为了打破它,这将做以下事情:
in.mp4
和 out.mp4
),分别分配ID 0和1。 -map 1
),所以我们采用已经转换的比特流 -map_metadata 0
) -c copy
)复制所有比特流而不是重新编码视频。 在那之后,你显然可以重命名 fixed.mp4
至 out.mp4
。
例如,这是我原始文件的元数据记录的一部分:
$ mediainfo in.mp4 | grep "Encoded date" | head -n 1
Encoded date : UTC 2012-01-08 11:16:19
这是Handbrake转换后的文件:
$ mediainfo out.mp4 | grep "Encoded date" | head -n 1
Encoded date : UTC 2012-12-24 11:39:35
这是映射元数据后的最终文件:
$ ffmpeg -i in.mp4 -i out.mp4 -map 1 -map_metadata 0 -c copy fixed.mp4
[…]
$ mediainfo fixed.mp4 | grep "Encoded date" | head -n 1
Encoded date : UTC 2012-01-08 11:16:19
实际上,如果你可以使用FFmpeg,你根本不需要使用Handbrake。在最简单的情况下,您可以像这样进行转换:
ffmpeg -i in.mp4 -c:v libx264 -crf 23 -c:a aac -map_metadata 0 out.mp4
这将使用x264编码器和AAC音频将输入转换为输出文件,从而复制原始元数据。为了改变输出的质量,您可以:
阅读 x264编码指南 在FFmpeg wiki上获取更多信息。
Unknown encoder 'libfaac'
错误
-c:a aac -strict experimental
代替。
不幸的是,似乎手刹不能单独完成,但与ffmpeg示例类似,时间戳可以在压缩后通过使用 touch
unix命令:
touch -r MVI_1234.MOV compressed_MVI_1234.m4v
这会将压缩文件的时间戳设置为与给定的参考文件相同。
我发现了一种更简单的方法,使用一种不同的软件 Adapter
: http://www.macroplant.com/adapter/
它没有像HandBrake这样的所有高级设置,但它完成了工作(也使用了ffmpeg)并保留了我需要的元数据。
我正在使用macOS Yosemite和 HandBrakeBatch - 使用它来转换文件,但单击“首选项”菜单中的“保留文件创建和修改日期”框。
然后,我将视频导入Lightroom 5,但他们仍然没有保留创建日期。但是,最重要的是,文件在Finder中显示正确的创建日期。所以我在Lightroom库中选择了所有这些→元数据(右侧对话框列)→捕获时间→更改为文件的创建日期→全部更改。
我有850个老家庭视频 - 我不得不分批进行这个过程。手刹会因很多文件而崩溃。
我制作了一个bash脚本,可以使用批量传输元数据 touch
如上所述。要使它工作,您必须将原始文件和转换后的文件放在不同的目录中,每个目录具有相同数量的文件(目录必须只有视频文件,因为其他文件/目录会干扰)并且顺序相同。然后它只是复制元数据,你就完成了所有设置。该脚本列出了所有文件对,以便您可以根据需要检查最终的错误。
代码可能不是最好的,因为它是我的第一个正确的bash脚本,但它对我来说非常快速和稳定,所以这里是:
#!/bin/bash
#Sets IFS to \n to allow for filenames with spaces
IFS=$'\n'
#Source directory and converted direcotry
dir1=$1
dir2=$2
#Array with source filepaths
srcf=()
#Array with converted filepaths
cnvf=()
#Adds filepaths from the source directory to srcf array
for file in $(ls -1 $dir1); do
srcf+=("$dir1/$file")
done
#Adds filepaths from the converted directory to cnvf array
for file in $(ls -1 $dir2); do
cnvf+=("$dir2/$file")
done
#Checks if source and convert folders have the same number of files
if [ ${#srcf[*]} -eq ${#cnvf[*]} ]
then
#Counter variable
fnum=0
#Loops through the arrays and runs touch command on pairs of files to transfer the metadata
while [ $fnum -lt ${#srcf[*]} ]; do
echo $fnum
echo ${srcf[$fnum]} ${cnvf[$fnum]}
touch -r ${srcf[$fnum]} ${cnvf[$fnum]}
((fnum++))
done
else
echo "The provided paths do not have the same number of files. Both paths must have the same number of files in the same order."
fi
要运行: sudo bash script.sh /sourcedir /converteddir
如果你的意思是文件级修改时间,那么我遇到了同样的问题,并且能够恢复它 exiftool 。
exiftool -tagsFromFile input.mp4 -extractEmbedded -all:all -FileModifyDate -overwrite_original output.mp4
这需要元数据和 FileModifyDate
从 input.mp4
并将其复制到 output.mp4
。
为了自动执行此操作,我有大量要转码的文件,我创建了一个名为的工具 收缩包装 第一次转码 FFmpeg的 (由于需要保留更多元数据,我离开了HandBrake),然后使用exiftool恢复修改时间戳。
经过多次搜索,我大部分时间都放弃使用创建/修改了正确日期的旧视频文件来覆盖我的新手刹压缩视频文件的创建/修改日期。由于我的大部分视频都有文件名中的日期/时间,因此我进行了实验并获得了两种方法。第一个和 最好 是使用Advanced Renamer的时间戳方法,它可以更改,修改,创建和访问文件日期,而不仅仅是文件名本身。 https://www.advancedrenamer.com/download 。
我还找到了一个powershell脚本 https://www.michaelmiklis.de/set-creation-and-modification-date-from-filename/ 这可以由程序员调整为其他文件名/日期格式。在当前状态下,仅当文件名的结构与该示例中的文件名完全相同时才有效。
幸运的是,我在文件名中没有修改日期的视频数量足够低,我可以手动更改,不会花太长时间。
我尝试使用ffmpeg,但是它的map_metadata命令只更改文件内的数据,而不是文件本身创建的修改日期。无论如何,那种内部元数据Handbrake已经很好了。
我试着保持创建日期,同时将我非常大的GoPro MP4视频压缩成H.264。
我找到了这个程序 HandBrakeBatch 。这正是我需要一次压缩超过1000个文件,同时保持创建日期(元数据)。
没有找到任何其他能够执行此操作的程序。尝试使用FFmpeg,HandBrake和Wonderful Video Converter,但没有。