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

pix*_*eak 17 metadata handbrake video-encoding

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

slh*_*hck 25

您可以将现有元数据从一个文件复制到另一个文件,而无需使用FFmpeg重新编码视频。它基本上需要一秒钟。为此,让我们假设三个文件:

  • in.mp4 – 转换前的原始文件
  • out.mp4 – 手刹转换后的文件
  • fixed.mp4 – 具有“更正”元数据的文件

将完整的元数据记录复制到新文件的 FFmpeg 命令将是:

ffmpeg -i in.mp4 -i out.mp4 -map 1 -map_metadata 0 -c copy fixed.mp4
Run Code Online (Sandbox Code Playgroud)

语法说明:

为了分解它,它执行以下操作:

  • 取两个输入文件(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
Run Code Online (Sandbox Code Playgroud)

这是手刹转换后的文件:

$ mediainfo out.mp4 | grep "Encoded date" | head -n 1
Encoded date : UTC 2012-12-24 11:39:35
Run Code Online (Sandbox Code Playgroud)

这是映射元数据后的最终文件:

$ 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    
Run Code Online (Sandbox Code Playgroud)

如果你想用 FFmpeg 做所有事情:

实际上,如果您可以使用 FFmpeg,那么您实际上并不需要使用 Handbrake,而 Handbrake 无论如何都依赖于它。在最简单的情况下,您可以像这样进行转换:

ffmpeg -i in.mp4 -c:v libx264 -crf 23 -c:a aac -map_metadata 0 out.mp4
Run Code Online (Sandbox Code Playgroud)

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

  • 更改视频的 CRF 值。较低意味着更好的质量。23 是默认值,低于 18 的任何值都可能在视觉上无损。
  • 更改音频的比特率。有关详细信息,请参阅AAC 编码指南

阅读FFmpeg wiki 上的x264 编码指南了解更多信息。

  • 哇,这是一个很酷的解决方法,虽然看起来有点令人畏惧,但我希望 Handbrake 在幕后做这件事。谢谢! (3认同)

小智 7

如果您指的是文件级修改时间,那么我遇到了同样的问题,并且能够使用exiftool恢复它。

exiftool -tagsFromFile input.mp4 -extractEmbedded -all:all -FileModifyDate -overwrite_original output.mp4
Run Code Online (Sandbox Code Playgroud)

这将获取元数据并将FileModifyDateinput.mp4复制到output.mp4

为了自动化此操作,因为我有大量文件需要转码,我创建了一个名为Shrinkwrap的工具,它首先使用FFmpeg进行转码(由于需要保留更多元数据,我放弃了 HandBrake),然后使用 exiftool 恢复修改时间戳。


And*_*des 5

不幸的是,手刹似乎无法自行完成,但与 ffmpeg 示例类似,可以使用touchunix 命令在压缩后从原始文件复制时间戳:

touch -r MVI_1234.MOV compressed_MVI_1234.m4v
Run Code Online (Sandbox Code Playgroud)

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

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