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

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

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

输出视频逆时针旋转90度.这是因为我认为正在删除边数据.

边数据:
 displaymatrix:旋转-90.00度

输入文件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工作正常.

在这post他们为c解决了它.我正在研究android并使用ffmpeg android包装器来使用ffmpeg库.是否有任何ffmpeg标志来处理这种情况?

解决方法:

这在MP4 / MOV中工作的原因是因为对于这种格式,显示矩阵存储在Movie Header(mvhd)和Track Header(tkhd)原子中.

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

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

资料来源:Apple QuickTime File Format Specification

当流在MKV中复用时,矩阵将丢失,并且复用器将回退到添加ROTATE元数据条目.您可以在ffprobe输出中看到这一点.如果流然后在MP4中复用,则元数据信息用于创建矩阵(如果在创建MKV时传递-map_metadata -1,则信息丢失且转换不再起作用).

在玩家方面,无法保证它会查找并应用ROTATE标记中指定的旋转.如果你想使用正确方向的MKV,你将不得不重新编码,否则坚持使用MP4.

上一篇:如何在Android.mk文件中构建.s(asm)文件


下一篇:FFmpeg avcodec_copy_context deprecated替换方案