ffmpeg视频旋转问题

ffmpeg视频旋转问题

我有一个智能手机垂直录制的视频剪辑,我尝试使用常用的 ffmpeg 命令将其顺时针旋转 90 度(因为某些播放器无法读取 EXIF 旋转数据并通过自动旋转正确显示它)。它的 EXIF 元数据包括“宽度:848;高度:480;旋转:90”通常,此命令应该执行此操作:

ffmpeg -i input.mp4 -vf transpose=1 output.mp4

然而,实际结果只是水平翻转,而相关的 EXIF 元数据变成“宽度:848;高度:480;旋转:0”我已经尝试了所有转置值(0,1,2,3),但没有一个能给我一个视频“宽度:480;身高:848;旋转:0”

理想情况下,我还想保留所有原始 EXIF 数据,例如日期和时间、相机和 GPS 详细信息等,这些数据都随着上述命令而消失。

有任何想法吗?

注意:使用使用 gcc 9 构建的 ffmpeg 版本 4.2.4-1ubuntu0.1 (Ubuntu 9.3.0-10ubuntu2)

答案1

看来 ffmpeg 还考虑了原始文件的 EXIF 元数据“旋转:90”并在重新编码过程之前自动旋转。因此,最后我设法编写了一个脚本,可以将其合并到 Dolphin、Nautilus、Thunar 等文件管理器的上下文菜单中,以根据其 EXIF 旋转元数据旋转视频,保留 EXIF 时间戳并复制EXIF GPS 信息 - 在 @Gyan 的帮助下

#!/usr/bin/env bash
# Requires ffmpeg and libimage-exiftool-perl packages
OLDIFS=$IFS
IFS="
"
for filename in ${@}
do
    name=${filename%.*}
    ext=${filename##*.}
    ffmpeg -i "$filename" -map_metadata 0 "${name}_rotated.${ext}"
    GPSLatitude="$(exiftool -GPSLatitude "$filename" | awk -F' : ' '{print $2}' | sed -e "s/ deg / /" -e "s/' / /" -e "s/\" / /")"
    GPSLongitude="$(exiftool -GPSLongitude "$filename" | awk -F' : ' '{print $2}' | sed -e "s/ deg / /" -e "s/' / /" -e "s/\" / /")"
    exiftool -GPSLatitude="$GPSLatitude" -GPSLongitude="$GPSLongitude" "${name}_rotated.${ext}" -overwrite_original
    mv "${name}_rotated.${ext}" "$filename"
done
IFS=$OLDIFS

相关内容