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

2024-03-09

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

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

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

Side data: displaymatrix: rotation of -90.00 degrees

输入文件test.mp4 info

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 info

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 也可以正常工作。

In this post https://stackoverflow.com/questions/44902474/how-to-disable-libav-autorotate-display-matrix他们用c++解决了这个问题。我正在开发 android 并使用 ffmpeg android 包装器来使用 ffmpeg 库。有没有 ffmpeg 标志可以处理这种情况?


这起作用的原因是MP4/MOV是因为对于这种格式,显示矩阵存储在电影头中(mvhd) 和轨道头 (tkhd) atoms.

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

Source: Apple QuickTime 文件格式规范 https://developer.apple.com/library/archive/documentation/QuickTime/QTFF/QTFFChap2/qtff2.html#//apple_ref/doc/uid/TP40000939-CH204-32947

当流被混入时MKV矩阵丢失,复用器回退到添加ROTATE相反,元数据条目。您可以在您的ffprobe输出。如果流随后被复用回MP4元数据信息用于创建矩阵(如果您传递-map_metadata -1创建时MKV信息丢失并且转换不再有效)。

在播放器方面,不能保证它将查找并应用在ROTATE标签。如果你想使用MKV如果方向正确,您将必须重新编码,否则坚持使用MP4.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

仅复制流时 FFmpeg 自动旋转视频 的相关文章

随机推荐

  • 通过 Django 管理站点添加数据时更改大小写(大写/小写)

    我正在配置我的新项目的管理站点 我有点怀疑我应该怎么做 通过管理站点添加数据时点击 保存 所有内容都转换为大写 编辑 好的 我知道 upper 属性 并且我做了一个视图 我知道该怎么做 但我想知道管理站点上是否有任何可用于字段配置的属性 P
  • 针对 Windows Phone 7 Internet Explorer 9 的条件注释

    Problem 条件注释 例如 p All other browsers p 不工作在 Windows Phone 7 上 或者 至少不是我的 Question 有谁知道如何使用这些评论 并且有测试了他们前 WP7 上的 IE 9 是否支持
  • Java Socket 编程不适用于 10,000 个客户端

    我可以创建多个线程来支持套接字编程中的多客户端功能 工作正常 但如果有 10 000 个客户端想要连接 我的服务器就无法创建这么多线程 如何管理线程以便我可以同时监听所有这些客户端 另外 如果在这种情况下服务器想要向特定客户端发送某些内容
  • 是否可以使用 .NET Remoting + TLS 1.2(或 1.1)?

    最近我们的 PCI DSS 扫描失败 并要求我们禁用 TLS 1 0 并启用 TLS 1 1 或 1 2 我在 Windows Server 2008 R2 盒子上找到了如何执行此操作的说明 但我们有一个使用 NET 远程处理的旧应用程序
  • ActiveSupport::Memoizes 指的是哪种 Ruby memoize 模式?

    因此在 Rails 3 2 中 ActiveSupport Memoizes 已被弃用 消息内容如下 DEPRECATION WARNING ActiveSupport Memoizable is deprecated and will b
  • 如何使用 Python OpenCV 优化圆检测?

    我看过几页关于在 python 中使用 opencv 优化圆检测的页面 所有这些似乎都针对特定图片的具体情况 cv2 HoughCircles 的每个参数的起点是什么 由于我不确定推荐值是什么 因此我尝试循环范围 但这并没有产生任何有希望的
  • 我如何在 ubuntu 中将 PDT 与 eclipse 关联/使用?

    我想使用 PDT 和 eclipse 来调试 PHP 我使用的是ubuntu 9 04 谁能帮我 如果可能 请提供详细信息 考虑到这个线程 http dev eclipse org mhonarc lists pdt dev msg0044
  • AngularJS - 可拖动和多个连接的可排序(jQuery UI + Angular-Common)

    我正在尝试延长角度共同 https github com michaeljcalkins angular common非常好拖放模块 https github com michaeljcalkins angular common blob
  • 为什么谓词下推不起作用?

    程序草图 我创建一个 HiveContexthiveContext 有了这个背景 我创建了一个 DataFramedf来自 JDBC 关系表 我注册数据框df via df registerTempTable TESTTABLE 我通过启动
  • Umbraco 检查 - 查询问题

    我使用 检查 检索的对象具有以下数据值 图片链接 https i stack imgur com 8sUOb jpg为了更方便查看 Icon icon shopping basket alt 2 color red IndexType co
  • Spring Security:没有 WebSecurityConfigurerAdapter 的全局 AuthenticationManager

    我试图摆脱 WebSecurityConfigurerAdapter AuthenticationManager 的配置如下 Configuration EnableGlobalMethodSecurity prePostEnabled t
  • pip install t sne 不起作用

    我无法在 Windows 计算机上安装 tsne 软件包 我按照说明进行操作here https github com danielfrg tsne blob master README md安装 Python 的 tsne 包 但要么pi
  • XMLHttpRequest (Ajax) 错误

    我在用着XMLHttpRequest在 JavaScript 中 但是 它给了我一个错误 我不知道我的问题是什么 我必须解析 XML 文件并将其内容分配给网页 这是我的代码
  • 用于将数据复制并粘贴到另一个工作表的宏

    我发现下面的代码可以根据唯一标识符将数据从一个工作表复制并粘贴到另一个工作表 它还将工作表重命名为唯一标识符 除了公式现在显示为数字之外 它的工作效果非常好 请有人知道如何修改代码以便保留实际公式 Dim wsAll As Workshee
  • 如何在CSS中设置列表的宽度

    我有代码 如下所示 文本不对齐有点烦人 它会影响其他li元素 我怎样才能使它成为固定宽度 我尝试过 width XYZpx 但没有任何作用 li class date 2 28 2010 9 37 38 AM li li class dat
  • 如何在 Android Studio 的单元测试中使用 Mockito/Hamcrest

    我希望能够在 Android Studio 中进行单元测试和仪器测试 并在其中使用 Mockito 我正在 Android Studio 0 8 中使用新方法进行测试 这是 使用 gradle 构建 使用官方Android API进行测试
  • 如何从排列Grob 中删除随机背景网格

    我需要将几个图包裹在一个网格中 通常是奇数 所以经常会出现 空位 我需要使用arrangeGrob not grid arrange 因为我想把情节留着以后用 而不是plot 马上 这工作正常 但奇怪的是 arrangeGrob 在空白处留
  • 在 php 中将货币从 INR 转换为 USD

    我想在 php 中将货币从 INR 转换为 USD 这是我迄今为止尝试过的代码 但它不起作用 我缺少什么 function currency from Currency to Currency amount amount urlencode
  • 在 Windows 上读取非 ascii 文件路径

    我有一堆文件名包含非 ASCII 字符的文本文件 例如 这是一个标题 readLines bbb ovi Melika Omeragi Ismir Bata txt Error in file con r cannot open the c
  • 仅复制流时 FFmpeg 自动旋转视频

    我在将 mp4 肖像 文件转换为 mkv 时遇到这个问题 我正在使用的命令 ffmpeg y i test mp4 vcodec copy acodec copy test mkv 输出视频逆时针旋转90度 这是因为我认为辅助数据正在被删除