FFmpeg 仅在复制流时自动旋转视频
FFmpeg auto rotates video when only copying stream
我在将 mp4(纵向)文件转换为 mkv 时遇到这个问题。我正在使用的命令
ffmpeg -y -i test.mp4 -vcodec copy -acodec copy test.mkv
输出视频逆时针旋转90度。这是因为我认为辅助数据正在被删除。
Side data:
displaymatrix: rotation of -90.00 degrees
输入文件test.mp4
信息
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'test.mp4':
Metadata:
major_brand : mp42
minor_version : 0
compatible_brands: isommp42
creation_time : 2019-02-23T11:18:50.000000Z
com.android.version: 8.0.0
Duration: 00:00:25.86, start: 0.000000, bitrate: 12270 kb/s
Stream #0:0(eng): Video: h264 (avc1 / 0x31637661), yuv420p(tv, bt709), 1280x720, 12005 kb/s, SAR 1:1 DAR 16:9, 30 fps, 30 tbr, 90k tbn, 180k tbc (default)
Metadata:
rotate : 90
creation_time : 2019-02-23T11:18:50.000000Z
handler_name : VideoHandle
Side data:
displaymatrix: rotation of -90.00 degrees
Stream #0:1(eng): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 256 kb/s (default)
Metadata:
creation_time : 2019-02-23T11:18:50.000000Z
handler_name : SoundHandle
旋转输出文件test.mkv
信息
Input #0, matroska,webm, from 'test.mkv':
Metadata:
MAJOR_BRAND : mp42
MINOR_VERSION : 0
COMPATIBLE_BRANDS: isommp42
COM.ANDROID.VERSION: 8.0.0
ENCODER : Lavf58.12.100
Duration: 00:00:25.87, start: 0.000000, bitrate: 12265 kb/s
Stream #0:0(eng): Video: h264, yuv420p(tv, bt709, progressive), 1280x720, SAR 1:1 DAR 16:9, 30 fps, 30 tbr, 1k tbn, 2k tbc (default)
Metadata:
ROTATE : 90
HANDLER_NAME : VideoHandle
DURATION : 00:00:25.866000000
Stream #0:1(eng): Audio: aac, 48000 Hz, stereo, fltp (default)
Metadata:
HANDLER_NAME : SoundHandle
DURATION : 00:00:25.813000000
再次将旋转后的 mkv 转换为 mp4 效果很好,我得到了肖像文件。显示矩阵端数据再次出现在文件信息中。
通过复制流将相同的 mp4 文件转换为 m4v 也可以正常工作。
在这个 中,他们为 c++ 解决了这个问题。我正在研究 android 并使用 ffmpeg android 包装器来使用 ffmpeg 库。是否有任何 ffmpeg 标志来处理这种情况?
这在 MP4
/MOV
中起作用的原因是因为对于这种格式,显示矩阵存储在电影 Header (mvhd
) 和轨道 Header (tkhd
) 个原子。
显示矩阵结构的 mvhd
布局示例:
来源:Apple QuickTime File Format Specification
当流在 MKV
中进行复用时,矩阵会丢失,复用器会回退到添加 ROTATE
元数据条目。您可以在 ffprobe
输出中看到这一点。如果流然后在 MP4
中被复用,元数据信息用于创建矩阵(如果在创建 MKV
时传递 -map_metadata -1
信息丢失并且转换不再有效).
在播放器端,不能保证它会查找并应用 ROTATE
标签中指定的旋转。如果您想以正确的方向使用 MKV
,则必须 re-encode,否则请坚持使用 MP4
。
I am facing this issue while converting mp4 (portrait) file to mkv.
The command I'm using
ffmpeg -y -i test.mp4 -vcodec copy -acodec copy test.mkv
The output video is 90 degree counter clockwise rotated. Its because I
think the side data is being removed.
当我有一个具有相同旋转设置的 MP4 时(旋转中的 90
与 DisplayMatrix 中的 -90
)。我通过使用 -noautorotate
选项 before 给出 input 文件名解决了这个 wrong rotation 问题。
解决方案:(无需重新编码)
ffmpeg -y -noautorotate -i test.mp4 -vcodec copy -acodec copy test.mkv
输出的 MKV 与输入的 MP4 完全一样,没有变化。
此解决方案适用于 Windows 命令行,但希望在基于 Android 的 FFmpeg 包装器中同样适用。
祝你好运,如果它解决了你的问题,请告诉我。
PS:
还有一个快速提示,因为您正在复制两个 a/v 编解码器,这个命令 -codec copy
有效吗?
ffmpeg -y -noautorotate -i test.mp4 -codec copy test.mkv
我在将 mp4(纵向)文件转换为 mkv 时遇到这个问题。我正在使用的命令
ffmpeg -y -i test.mp4 -vcodec copy -acodec copy test.mkv
输出视频逆时针旋转90度。这是因为我认为辅助数据正在被删除。
Side data:
displaymatrix: rotation of -90.00 degrees
输入文件test.mp4
信息
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'test.mp4':
Metadata:
major_brand : mp42
minor_version : 0
compatible_brands: isommp42
creation_time : 2019-02-23T11:18:50.000000Z
com.android.version: 8.0.0
Duration: 00:00:25.86, start: 0.000000, bitrate: 12270 kb/s
Stream #0:0(eng): Video: h264 (avc1 / 0x31637661), yuv420p(tv, bt709), 1280x720, 12005 kb/s, SAR 1:1 DAR 16:9, 30 fps, 30 tbr, 90k tbn, 180k tbc (default)
Metadata:
rotate : 90
creation_time : 2019-02-23T11:18:50.000000Z
handler_name : VideoHandle
Side data:
displaymatrix: rotation of -90.00 degrees
Stream #0:1(eng): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 256 kb/s (default)
Metadata:
creation_time : 2019-02-23T11:18:50.000000Z
handler_name : SoundHandle
旋转输出文件test.mkv
信息
Input #0, matroska,webm, from 'test.mkv':
Metadata:
MAJOR_BRAND : mp42
MINOR_VERSION : 0
COMPATIBLE_BRANDS: isommp42
COM.ANDROID.VERSION: 8.0.0
ENCODER : Lavf58.12.100
Duration: 00:00:25.87, start: 0.000000, bitrate: 12265 kb/s
Stream #0:0(eng): Video: h264, yuv420p(tv, bt709, progressive), 1280x720, SAR 1:1 DAR 16:9, 30 fps, 30 tbr, 1k tbn, 2k tbc (default)
Metadata:
ROTATE : 90
HANDLER_NAME : VideoHandle
DURATION : 00:00:25.866000000
Stream #0:1(eng): Audio: aac, 48000 Hz, stereo, fltp (default)
Metadata:
HANDLER_NAME : SoundHandle
DURATION : 00:00:25.813000000
再次将旋转后的 mkv 转换为 mp4 效果很好,我得到了肖像文件。显示矩阵端数据再次出现在文件信息中。
通过复制流将相同的 mp4 文件转换为 m4v 也可以正常工作。
在这个
这在 MP4
/MOV
中起作用的原因是因为对于这种格式,显示矩阵存储在电影 Header (mvhd
) 和轨道 Header (tkhd
) 个原子。
显示矩阵结构的 mvhd
布局示例:
来源:Apple QuickTime File Format Specification
当流在 MKV
中进行复用时,矩阵会丢失,复用器会回退到添加 ROTATE
元数据条目。您可以在 ffprobe
输出中看到这一点。如果流然后在 MP4
中被复用,元数据信息用于创建矩阵(如果在创建 MKV
时传递 -map_metadata -1
信息丢失并且转换不再有效).
在播放器端,不能保证它会查找并应用 ROTATE
标签中指定的旋转。如果您想以正确的方向使用 MKV
,则必须 re-encode,否则请坚持使用 MP4
。
I am facing this issue while converting mp4 (portrait) file to mkv. The command I'm using
ffmpeg -y -i test.mp4 -vcodec copy -acodec copy test.mkv
The output video is 90 degree counter clockwise rotated. Its because I think the side data is being removed.
当我有一个具有相同旋转设置的 MP4 时(旋转中的 90
与 DisplayMatrix 中的 -90
)。我通过使用 -noautorotate
选项 before 给出 input 文件名解决了这个 wrong rotation 问题。
解决方案:(无需重新编码)
ffmpeg -y -noautorotate -i test.mp4 -vcodec copy -acodec copy test.mkv
输出的 MKV 与输入的 MP4 完全一样,没有变化。
此解决方案适用于 Windows 命令行,但希望在基于 Android 的 FFmpeg 包装器中同样适用。 祝你好运,如果它解决了你的问题,请告诉我。
PS:
还有一个快速提示,因为您正在复制两个 a/v 编解码器,这个命令 -codec copy
有效吗?
ffmpeg -y -noautorotate -i test.mp4 -codec copy test.mkv