代码之家  ›  专栏  ›  技术社区  ›  Tahlil

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

  •  0
  • Tahlil  · 技术社区  · 5 年前

    在将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标志来处理这种情况吗?

    0 回复  |  直到 5 年前
        1
  •  6
  •   aergistal    5 年前

    为什么这样做 MP4 / MOV 因为对于这种格式,显示矩阵存储在电影头中( mvhd )和跟踪头( tkhd )原子。

    布局示例 mvhd公司 显示矩阵结构:

    enter image description here

    资料来源: Apple QuickTime File Format Specification

    当溪流被混入 MKV 矩阵丢失,muxer返回到添加 ROTATE 而是元数据项。你可以在你的 ffprobe 输出。如果流被混入 MP4标准 元数据信息用于创建矩阵(如果 -map_metadata -1 当创建 MKV公司 信息丢失,转换不再工作)。

    在球员方面,不能保证它会寻找并应用 旋转 标签。如果你想用 MKV公司 如果方向正确,就必须重新编码,否则就要坚持 MP4标准 .

        2
  •  0
  •   VC.One    5 年前

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

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

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

    当我有一个相同旋转设置的MP4(a 90 旋转对a -90 在显示矩阵中)。我解决了这个问题 旋转错误 通过使用 -noautorotate 选项 之前 输入 文件名。

    解决方案 :(不重新编码)

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

    输出MKV与输入MP4一模一样,没有变化。

    这个解决方案可以在Windows命令行上运行,但希望在基于Android的FFmpeg包装器上也能运行。 祝你好运,如果它能解决你的问题,请告诉我。

    附言:
    还有一个快速提示,因为您要同时复制两个a/v编解码器,所以执行以下命令 -codec copy 工作?

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