[英]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
工作的原因是因为对于这种格式,显示矩阵存储在Movie Header( mvhd
)和Track Header( tkhd
)原子中。
显示矩阵结构的mvhd
示例布局:
当流在MKV
复用时,矩阵将丢失,并且复用器将回退到添加ROTATE
元数据条目。 您可以在ffprobe
输出中看到这一点。 如果流然后在MP4
复用,则元数据信息用于创建矩阵(如果在创建MKV
时传递-map_metadata -1
,则信息丢失且转换不再起作用)。
在玩家方面,无法保证它会查找并应用ROTATE
标记中指定的ROTATE
。 如果你想使用正确方向的MKV
,你将不得不重新编码,否则坚持使用MP4
。
我在将mp4(肖像)文件转换为mkv时遇到此问题。 我正在使用的命令
ffmpeg -y -i test.mp4 -vcodec copy -acodec copy test.mkv
输出视频逆时针旋转90度。 这是因为我认为副数据正在被删除。
当我有相同的旋转设置(涉及的MP4 90
旋转Vs的-90
在DisplayMatrix)。 在给出输入文件名之前 ,我使用-noautorotate
选项解决了这个错误的旋转问题。
解决方案 :(无需重新编码)
ffmpeg -y -noautorotate -i test.mp4 -vcodec copy -acodec copy test.mkv
输出MKV看起来与输入MP4完全一样,没有变化。
此解决方案适用于Windows命令行,但希望在基于Android的FFmpeg包装器中也能正常工作。 祝你好运并告诉我它是否能解决你的问题。
PS:
另外一个快速的提示,因为你要复制两个/ v编解码器,这个命令-codec copy
工作?
ffmpeg -y -noautorotate -i test.mp4 -codec copy test.mkv
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.