如何让Handbrake保留捕获时间/创建时间?


11

Handbrake是一个非常棒的视频压缩工具,但它似乎不会保留视频压缩后的原始捕获时间。知道如何解决这个问题吗?


@slhck是的我的意思是创造时间。我使用Lightroom管理我的视频,压缩后,捕获/创建时间变为修改时间。
pixelfreak

Answers:


18

您可以将现有元数据从一个文件复制到另一个文件,而无需使用重新编码视频 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.mp4out.mp4 ),分别分配ID 0和1。
  • 仅映射从文件1到输出的视频/音频/字幕流( -map 1 ),所以我们采用已经转换的比特流
  • 仅将文件0中的元数据映射到输出( -map_metadata 0
  • 使用复制编解码器( -c copy )复制所有比特流而不是重新编码视频。

在那之后,你显然可以重命名 fixed.mp4out.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做所有事情:

实际上,如果你可以使用FFmpeg,你根本不需要使用Handbrake。在最简单的情况下,您可以像这样进行转换:

ffmpeg -i in.mp4 -c:v libx264 -crf 23 -c:a aac -map_metadata 0 out.mp4

这将使用x264编码器和AAC音频将输入转换为输出文件,从而复制原始元数据。为了改变输出的质量,您可以:

  • 更改视频的CRF值。降低意味着更好的质量23是默认值,低于18的任何东西都可能在视觉上无损。
  • 更改音频的比特率。见 AAC编码指南 了解更多信息。

阅读 x264编码指南 在FFmpeg wiki上获取更多信息。


哇,这是一个很酷的解决方法,但看起来有点令人生畏,我希望Handbrake能够在幕后做到这一点。谢谢!
pixelfreak

元数据传输命令有效,但最后一个执行转换的命令也给了我一个 Unknown encoder 'libfaac' 错误
pixelfreak

然后你的ffmpeg不会在FAAC支持下编译。尝试 -c:a aac -strict experimental 代替。
slhck

4

不幸的是,似乎手刹不能单独完成,但与ffmpeg示例类似,时间戳可以在压缩后通过使用 touch unix命令:

touch -r MVI_1234.MOV compressed_MVI_1234.m4v

这会将压缩文件的时间戳设置为与给定的参考文件相同。


它将设置文件的时间戳,是的,但仅限于文件系统。 EXIF数据将没有正确的“日期/时间原始”时间戳。
Stephen Schrauger

3

我发现了一种更简单的方法,使用一种不同的软件 Adapter http://www.macroplant.com/adapter/

它没有像HandBrake这样的所有高级设置,但它完成了工作(也使用了ffmpeg)并保留了我需要的元数据。


1
我不认为Adapter能够做到这一点。我刚刚测试了最新版本,无法在任何地方找到保留元数据的设置。此外,它似乎没有转换所有视频文件类型,如MTS等。
jjj

太糟糕了,它与sony的m2ts格式不兼容
Diego Vieira

2

我正在使用macOS Yosemite和 HandBrakeBatch - 使用它来转换文件,但单击“首选项”菜单中的“保留文件创建和修改日期”框。

然后,我将视频导入Lightroom 5,但他们仍然没有保留创建日期。但是,最重要的是,文件在Finder中显示正确的创建日期。所以我在Lightroom库中选择了所有这些→元数据(右侧对话框列)→捕获时间→更改为文件的创建日期→全部更改。

我有850个老家庭视频 - 我不得不分批进行这个过程。手刹会因很多文件而崩溃。


很好的发现,可以看到自己使用这个应用程序很多。
calum_b


1

我制作了一个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


1

如果你的意思是文件级修改时间,那么我遇到了同样的问题,并且能够恢复它 exiftool

exiftool -tagsFromFile input.mp4 -extractEmbedded -all:all -FileModifyDate -overwrite_original output.mp4

这需要元数据和 FileModifyDateinput.mp4 并将其复制到 output.mp4

为了自动执行此操作,我有大量要转码的文件,我创建了一个名为的工具 收缩包装 第一次转码 FFmpeg的 (由于需要保留更多元数据,我离开了HandBrake),然后使用exiftool恢复修改时间戳。


0

经过多次搜索,我大部分时间都放弃使用创建/修改了正确日期的旧视频文件来覆盖我的新手刹压缩视频文件的创建/修改日期。由于我的大部分视频都有文件名中的日期/时间,因此我进行了实验并获得了两种方法。第一个和 最好 是使用Advanced Renamer的时间戳方法,它可以更改,修改,创建和访问文件日期,而不仅仅是文件名本身。 https://www.advancedrenamer.com/download

我还找到了一个powershell脚本 https://www.michaelmiklis.de/set-creation-and-modification-date-from-filename/ 这可以由程序员调整为其他文件名/日期格式。在当前状态下,仅当文件名的结构与该示例中的文件名完全相同时才有效。

幸运的是,我在文件名中没有修改日期的视频数量足够低,我可以手动更改,不会花太长时间。

我尝试使用ffmpeg,但是它的map_metadata命令只更改文件内的数据,而不是文件本身创建的修改日期。无论如何,那种内部元数据Handbrake已经很好了。


0

该程序 MyFFmpeg 做得很好。在其选项中有一个选择 从源文件保留原始创建/修改日期

我一直在寻找这个,因为我在Plex服务器上有我的家庭视频,文件按创建日期进行组织,如果你想查看特定年份的内容,这非常有用。

不幸的是,这不是一个免费的选择,目前花费20欧元或约21美元。在您购买许可证之前,他们会进行10次试用。惊讶一些免费的ffmpeg GUI没有或添加此选项。


0

我试着保持创建日期,同时将我非常大的GoPro MP4视频压缩成H.264。

我找到了这个程序 HandBrakeBatch 。这正是我需要一次压缩超过1000个文件,同时保持创建日期(元数据)。

没有找到任何其他能够执行此操作的程序。尝试使用FFmpeg,HandBrake和Wonderful Video Converter,但没有。


请注意HandBrakeBatch是 不再保持 osomac.com/2013/08/08/handbrake-adds-real-batch-processing
slhck
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.