FFmpeg仅复制流时自动旋转视频

时间:2019-02-26 03:32:54

标签: android video ffmpeg codec

将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可以正常工作,我得到了肖像文件。 displaymatrix辅助数据再次出现在文件信息中。

也可以通过复制流将相同的mp4文件转换为m4v,效果很好。

在此post中,他们为c ++解决了它。我正在使用android并使用ffmpeg android包装器来使用ffmpeg库。是否有任何ffmpeg标志可以处理这种情况?

2 个答案:

答案 0 :(得分:6)

之所以在MP4 / MOV中起作用的原因是,对于这种格式,显示矩阵存储在影片标题(mvhd)和音轨标题(tkhd中)原子。

mvhd的示例布局,显示了矩阵结构:

enter image description here

来源:Apple QuickTime File Format Specification

MKV中将流进行多路复用时,矩阵将丢失,并且多路复用器会退而后添加ROTATE元数据条目。您可以在ffprobe输出中看到这一点。如果然后将流混回到MP4中,则使用元数据信息来创建矩阵(如果在创建-map_metadata -1时通过MKV,则该信息将丢失并且转换将不再起作用)。

在播放器端,不能保证它会寻找并应用ROTATE标签中指定的旋转角度。如果要以正确的方向使用MKV,则必须重新编码,否则请坚持使用MP4

答案 1 :(得分:0)

  

将mp4(人像)文件转换为mkv时遇到了这个问题。   我正在使用的命令

ffmpeg -y -i test.mp4 -vcodec copy -acodec copy test.mkv
     

输出视频逆时针旋转90度。因为我   认为辅助数据已被删除。

当我的MP4具有相同的旋转设置(旋转中的90与DisplayMatrix中的-90)时。我通过使用{strong>之前提供{strong>输入文件名的-noautorotate选项解决了这个错误旋转问题。

解决方案 :(无需重新编码)

ffmpeg -y -noautorotate -i test.mp4 -vcodec copy -acodec copy test.mkv

输出MKV看起来与输入MP4完全一样,不变。

此解决方案可在Windows命令行上运行,但希望在基于Android的FFmpeg包装器中也可使用。 祝您好运,让我知道它是否可以解决您的问题。

PS:
也是一个快速提示,因为您要同时复制两个视音频编解码器,所以此命令-codec copy是否有效?

ffmpeg -y -noautorotate -i test.mp4 -codec copy test.mkv