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.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
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,那么您实际上并不需要使用 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 音频的输入转换为输出文件,复制原始元数据。为了改变输出的质量,您可以:
阅读FFmpeg wiki 上的x264 编码指南了解更多信息。
小智 7
如果您指的是文件级修改时间,那么我遇到了同样的问题,并且能够使用exiftool恢复它。
exiftool -tagsFromFile input.mp4 -extractEmbedded -all:all -FileModifyDate -overwrite_original output.mp4
Run Code Online (Sandbox Code Playgroud)
这将获取元数据并将FileModifyDate其input.mp4复制到output.mp4。
为了自动化此操作,因为我有大量文件需要转码,我创建了一个名为Shrinkwrap的工具,它首先使用FFmpeg进行转码(由于需要保留更多元数据,我放弃了 HandBrake),然后使用 exiftool 恢复修改时间戳。
不幸的是,手刹似乎无法自行完成,但与 ffmpeg 示例类似,可以使用touchunix 命令在压缩后从原始文件复制时间戳:
touch -r MVI_1234.MOV compressed_MVI_1234.m4v
Run Code Online (Sandbox Code Playgroud)
这会将压缩文件上的时间戳设置为与给定参考文件相同。
| 归档时间: |
|
| 查看次数: |
30253 次 |
| 最近记录: |