在 ffmpeg 中从视频中找出旋转元数据

在 ffmpeg 中从视频中找出旋转元数据

如果我使用:

ffmpeg -i in.mov -vf "transpose=1" out.mov

所有.mov文件都旋转了,但我需要的是自动检测旋转的视频并仅更改这些视频的方向。

如何在上传过程中自动检测视频的旋转或方向并在需要时进行旋转,以便所有.mov文件都以正确的方向播放?如何获取视频当前旋转角度的元数据?

答案1

针对您的问题,具体来说,您可以通过以下方式获得旋转: ffprobe -loglevel error -select_streams v:0 -show_entries stream_tags=rotate -of default=nw=1:nk=1 -i in.mov

传奇:

-loglevel error:仅显示旋转字段,没有其他信息。

-select_streams v:0:处理第一个视频流(如果存在多个视频流则忽略)

-show_entries stream_tags=rotate:返回输入视频的旋转信息

-of default=nw=1:nk=1:使用默认输出格式,不显示其他任何内容,即无包装器(nw)和无密钥(nk)

答案2

使用 ffprobe,像这样。

ffprobe -i in.mov

如果文件中存在这样的字段,则这将导致在输出的某处显示“rotate:”字段。

答案3

ffmpeg 中方向/旋转元数据的位置从 stream_tag 更改为 side_data,名称从“rotate”更改为“rotation”。

@Agile Bean 的更新版本将是:

fprobe -loglevel error 
-select_streams v:0 
-show_entries side_data="rotation" 
-of default=nw=1:nk=1 -i in.mov

答案4

为了使其更加完整,以防 FFMPEG 的元数据结构再次发生变化,这里有一个适合脚本的版本,仅使用和获取旋转grepsed

ffprobe input.mp4 2>&1 | grep rotation | sed -e 's#.*rotation of \(.*\).00 degrees#\1#'

解释:信息转到 stderr,因此重定向;然后grep过滤行;然后sed用正则表达式组替换。

case $ROTATION in
  0) ... ;;
  90|-270) ...  ;;
  180|-180) ...  ;;
  270|-90) ...  ;;
esac

相关内容