我有一个视频,在媒体播放器中显示正常,但上传到 YouTube 时显示旋转了。
ffmpeg -i thefile.mp4 中显示的元数据显示旋转了 270 度。
我在这里读
那
此命令,
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 行重新编码了没有旋转元数据但方向正确的视频。