在 ffmpeg 中,我无法从视频文件中删除旋转元数据

在 ffmpeg 中,我无法从视频文件中删除旋转元数据

我有一个视频,在媒体播放器中显示正常,但上传到 YouTube 时显示旋转了。

ffmpeg -i thefile.mp4 中显示的元数据显示旋转了 270 度。

我在这里读

使用 FFmpeg 去除所有格式的元数据

此命令,

ffmpeg -i in.mov -map_metadata -1 -c:v copy -c:a copy out.mov

将会删除元数据。

但对我而言并非如此。

这是我的文件

C:\blah>dir first.mp4 
...
21/12/2019  21:51        21,487,116 first.mp4

注意 ffmpeg -i 显示我正在开始的这个文件中的旋转,即 first.mp4

C:\Users\User\aa\sdf>ffmpeg -i first.mp4
ffmpeg version N-94664-g0821bc4eee Copyright (c) 2000-2019 the FFmpeg developers
....
libpostproc    55.  6.100 / 55.  6.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'first.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.31.104
  Duration: 00:00:10.03, start: 0.000000, bitrate: 17138 kb/s
    Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709/bt709/smpte170m), 1920x1080, 17003 kb/s, SAR 1:1 DAR 16:9, 28.61
30 tbr, 90k tbn, 180k tbc (default)
    Metadata:
      rotate          : 270
      handler_name    : VideoHandle
    Side data:
      displaymatrix: rotation of 90.00 degrees
    Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 127 kb/s (default)
    Metadata:
      handler_name    : SoundHandle
At least one output file must be specified

--

mediainfo 显示我开始的文件 first.mp4 中的旋转

C:\Users\User\aa\sdf>mediainfo first.mp4
General
Complete name                            : first.mp4
...

Video
ID                                       : 1
Format                                   : AVC
Format/Info                              : Advanced Video Codec
....
Rotation                                 : 270°
Frame rate mode                          : Variable
...

Audio
ID                                       : 2
Format                                   : AAC LC
....

--

现在我应用了我链接到的解决方案中的命令,但发现它对我不起作用

C:\Users\User\aa\sdf>ffmpeg -i first.mp4 -map_metadata -1 -c:v copy -c:a copy zzz.mp4
ffmpeg version N-94664-g0821bc4eee Copyright (c) 2000-2019 the FFmpeg developers
....
  libpostproc    55.  6.100 / 55.  6.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'first.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.31.104
  Duration: 00:00:10.03, start: 0.000000, bitrate: 17138 kb/s
    Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709/bt709/smpte170m), 1920x1080, 17003 kb/s, SAR 1:1 DAR 16:9, 28.61
30 tbr, 90k tbn, 180k tbc (default)
    Metadata:
      rotate          : 270
      handler_name    : VideoHandle
    Side data:
      displaymatrix: rotation of 90.00 degrees
    Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 127 kb/s (default)
    Metadata:
      handler_name    : SoundHandle
Output #0, mp4, to 'zzz.mp4':
  Metadata:
    encoder         : Lavf58.31.104
    Stream #0:0: Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709/bt709/smpte170m), 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 17003 kb/s, 28
ps, 30 tbr, 90k tbn, 90k tbc (default)
    Side data:
      displaymatrix: rotation of 90.00 degrees
    Stream #0:1: Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 127 kb/s (default)
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #0:1 -> #0:1 (copy)
Press [q] to stop, [?] for help
frame=  287 fps=0.0 q=-1.0 Lsize=   20984kB time=00:00:09.99 bitrate=17192.4kbits/s speed= 323x
video:20818kB audio:156kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.044614%

看到旋转数据仍然存在

C:\Users\User\aa\sdf>ffmpeg -i zzz.mp4
ffmpeg version N-94664-g0821bc4eee Copyright (c) 2000-2019 the FFmpeg developers
  built with gcc 9.1.1 (GCC) 20190807
...
  libpostproc    55.  6.100 / 55.  6.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'zzz.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.31.104
  Duration: 00:00:10.03, start: 0.000000, bitrate: 17138 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709/bt709/smpte170m), 1920x1080, 17003 kb/s, SAR 1:1 DAR 16:9, 28.61
30 tbr, 90k tbn, 180k tbc (default)
    Metadata:
      rotate          : 270
      handler_name    : VideoHandler
    Side data:
      displaymatrix: rotation of 90.00 degrees
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 127 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
At least one output file must be specified

--

C:\Users\User\aa\sdf>mediainfo zzz.mp4
General
Complete name                            : zzz.mp4
Format                                   : MPEG-4
...

Video
ID                                       : 1
Format                                   : AVC
Format/Info                              : Advanced Video Codec
Rotation                                 : 270°
...

Audio
ID                                       : 2
Format                                   : AAC LC
Format/Info                              : Advanced Audio Codec Low Complexity
...

C:\Users\User\aa\sdf>

答案1

我看到两种似乎有效的解决方案

此命令相对较快。它将元数据写入 rotate=0。-c copy 很重要。要写入元数据,无需重新编码,只需复制编解码器即可。如果不执行 -c copy(复制视频和音频编解码器),则速度会很慢并重新编码,还会使用一些不太好的默认编码。因此,执行 -c copy 有两个很大的优势。执行该命令时,您不会想不执行 -c copy。元数据是视频播放器可以读取的内容,它会告诉它是否旋转视频或旋转多少。

ffmpeg -i first.mp4 -metadata:s:v rotate="0" -c copy tttt.mp4

另一个解决方案是这个命令。使用 -vf“transpose=....”,在我的情况下,我使用了 =1,即 -vf“transpose=1”,因为我需要将视频再旋转 90 度以消除旋转。但无论你做多少,据我所知,它都不会将元数据放在那里。它会单独重新编码每一帧。如果你不知道并且也同意使用的默认编解码器,那么我建议添加用于编码或重新编码的参数,例如 -vcodec 和 -acodec。你应该同时指定两者,这样它就不会重新编码两者,你只需要重新编码视频,就可以复制音频。

ffmpeg -i first.mp4 -vf "transpose=1" -vcodec libx264 -acodec copy uuuu.mp4

您可以使用 ffmpeg -i 和 mediainfo 查看结果,不再有 270 度旋转或任何旋转(至少除了 0 之外)。

对于 180 度,它的转置=2 并写两次,-vf "transpose=2,transpose=2"参见这里

其中包括其他旋转的值

0 - Rotate by 90 degrees counter-clockwise and flip vertically. This is the default.
1 - Rotate by 90 degrees clockwise.
2 - Rotate by 90 degrees counter-clockwise.
3 - Rotate by 90 degrees clockwise and flip vertically.

其他选项-vf vflip包括-vf hflip

对于元数据, ffmpeg -i first.mp4 -map_metadata 0 -metadata:s:v rotate="0" -c copy tttt.mp4应该保留其他元数据。

我倾向于执行命令来删除旋转元数据,然后执行 -vf transpose,将旋转写入文件。并非所有视频播放器都遵守元数据,因此如果您将其保留在那里,那么如果其中有旋转元数据,某些播放器可能会以与其他播放器不同的方向播放它。

添加

C:\blah>mediainfo abc.mp4 | find "Rot"
Rotation   : 90 ░

C:\blah>ffmpeg -i abc.mp4 -acodec libmp3lame -vcodec libx264 xyz.mp4

C:\blah>mediainfo xyz.mp4 | find "Rot" 

C:\blah>

输入文件 abc.mp4 的存储方向错误,需要旋转元数据来纠正它。该相当基本的 ffmpeg 行重新编码了没有旋转元数据但方向正确的视频。

相关内容