【问题标题】:video captured from iphone gets rotated when converted to .mp4 using ffmpeg从 iphone 捕获的视频在使用 ffmpeg 转换为 .mp4 时被旋转
【发布时间】:2012-02-23 07:02:27
【问题描述】:

当我尝试在我的应用中上传从 iPhone 捕获的视频时,服务器会执行从 .mov 到 .mp4 的转换,以便可以在其他平台上播放。然而问题是,当我拍摄视频(纵向)并转换(使用ffmpeg)然后从服务器播放时,它似乎被旋转了。有什么想法吗?

【问题讨论】:

    标签: iphone ffmpeg video-conversion .mov


    【解决方案1】:

    FFMPEG 将默认行为更改为使用旋转元数据 in 2015 自动旋转视频源。这是作为 v2.7 发布的。

    如果您的 ffmpeg 版本是 v2.7 或更高版本,但您的轮换元数据未得到尊重,则问题很可能是您使用基于元数据的自定义轮换。这将导致两次应用相同的逻辑,改变或取消旋转。

    除了删除您的自定义旋转(推荐)之外,还有一个选项可以使用 -noautorotate 关闭自动旋转。

    ffmpeg -noautorotate -i input.mp4...

    这也适用于一些旧版本。

    【讨论】:

    • 感谢您的提示。当我升级时,这真的扼杀了我的设置。
    • 这里也一样。当我发现它实际上是一个功能时,我正在提交错误报告。
    • 这是正确的答案 - ffmpeg 将自动旋转 iphone 视频。
    • 这是最佳答案
    • 而且 ffmpeg 不会只旋转 iPhone 视频。
    【解决方案2】:

    为了完整起见,发生这种情况的原因是 iPhone 实际上只以一个固定方向捕捉视频。然后将测量的方向记录在 Apple 特定的元数据中。

    效果是 Quicktime Player 在播放期间读取元数据并将视频旋转到正确的方向,但其他软件(例如 VLC)不这样做,并将其显示为实际编解码器数据中的方向。

    这就是为什么rotate=90(或vflip,或transpose,或等等)对某些人有效,但对其他人无效。根据录制过程中相机的握持方式,必要的旋转可能是 90、180 甚至 270 度。在不阅读元数据的情况下,您只是在猜测需要多少轮换,而修复一个视频的更改将在另一个视频上失败。

    【讨论】:

      【解决方案3】:

      您还可以在旋转 .mov 时删除 QuickTime 特定的元数据。 这将确保视频在 VLC 和 QuickTime 中以相同的方式旋转

      ffmpeg -i in.mov -vf "transpose=1" -metadata:s:v:0 rotate=0 out.mov
      

      这是关于-metadata 选项的文档(来自http://ffmpeg.org/ffmpeg.html):

      -metadata[:metadata_specifier] key=value (output,per-metadata)
      

      设置元数据键/值对。

      可以给出一个可选的 metadata_specifier 来设置流或章节的元数据。有关详细信息,请参阅 -map_metadata 文档。

      此选项覆盖使用 -map_metadata 设置的元数据。也可以使用空值删除元数据。

      例如,在输出文件中设置标题:

       ffmpeg -i in.avi -metadata title="my title" out.flv 
      

      设置第一个音频流的语言:

       ffmpeg -i INPUT -metadata:s:a:1 language=eng OUTPUT
      

      【讨论】:

      • 我遇到了一个问题,在 osx 下进行本地测试时,没有在远程服务器上设置方向元数据。这在本地运行良好,但在开发服务器上失败:“ffmpeg -i input.mov -metadata rotate=0 -codec copy -y output.mov” 为了让它在开发服务器上工作,我必须添加的是元数据说明符s:v:0 "ffmpeg -i input.mov -metadata:s:v:0 rotate=0 -codec copy -y otput.mov"
      • 我想知道为什么 flickr 一直在旋转我的视频,而我桌面上的 mplayer 工作正常。原来我的手机对我拿它的方式有错误的想法。谢谢。
      • 我使用这个解决方案。但是我所有的旋转视频都被裁剪为 3 秒。它们更长(接近 5 秒)
      【解决方案4】:

      根据您拥有的 ffmpeg 版本及其编译方式,以下其中一项应该可以工作...

      ffmpeg -vf "transpose=1" -i input.mov output.mp4
      

      ...或...

      ffmpeg -vfilters "rotate=90" -i input.mov output.mp4
      

      【讨论】:

      • 对我来说,只有 ffmpeg -i input.mov -vf "transpose=1" output.mp4 有效
      • @DanielH。你需要一个特殊的插件来使用rotate=90,但是你可以使用转置0、1、2、3来获得所有的90度旋转,你也可以使用“hflip”、“vflip”甚至“hflip、vflip”其他情况。
      • 但是如何创建 ffmpeg 类。以及我在哪里创建 ffmpeg 类。我是 ffmpeg 库的新手。我有所有的 .a 文件和所有的 .h 文件(avcodec.h,avformat。 h & etc)。所有文件都导入到我的项目中。所以在哪里写上面的代码....请帮助我。
      • 请务必添加-map_metadata 0:g 以保留元数据(尤其是创建日期)
      • Unrecognized option 'vfilters'
      【解决方案5】:

      使用 vflip 过滤器

      ffmpeg -i input.mov -vf "vflip" output.mp4
      

      旋转对我不起作用,transpose=1 旋转了 90 度

      【讨论】:

        【解决方案6】:

        所以 - 我也遇到了这个问题,这里是我的 0.02 美元:

        1.) 有些视频确实有方向/旋转元数据,有些则没有: MTS (sony AVHCD) 或我拥有的 AVI - 没有方向标签。 MOV 和 MP4(ipad/iphone 或 samsung Galaxy Note2)都拥有。

        you can check the setting via 'exiftool -Rotation file'.
        My videos often have 90 or 180 as the rotation.
        

        2.) ffmpeg - 无论带有元数据标签的手册页如何,似乎都没有在输出文件中设置它。 - 旋转标签始终为“0”。 它在输出中正确报告了它 - 但它从未设置为由 exiftool 报告。 - 但是,嘿 - 至少它在那里并且总是 0。

        3.) 旋转角度: 如果你想旋转 +/- 90: transpose=1 顺时针 90, 2 ccw 现在,如果您需要 180 度 - 只需添加此过滤器两​​次。 请记住 - 这是您指定的过滤器链。 :-) - 往下看。

        4.) 旋转然后缩放: 这很棘手 - 因为您很快就会遇到 MP4 输出格式违规问题。 假设您有一个 1920x1080 MOV。 旋转 90 得到 1080x1920 然后我们重新缩放到 -1:720 -> 1080*(720/1920) = 405 horiz 并且 405 水平不能被 2 整除 - 错误。手动修复此问题。 自动修复 - 需要一些 shell 脚本工作。

        5.) 缩放然后旋转: 你可以这样做 - 但你最终会得到 720x1280。呸。 但是这里的过滤器示例是: “-vf yadif=1,比例=-1:720,转置=1” 这不是我想要的 - 但可以正常工作。

        把它们放在一起: - 注意 - '故意错误的旋转标签',只是为了演示 - 它根本不会出现在输出中! 这将接受输入 - 并将其旋转 180 度,然后重新缩放 - 重置旋转标签。 - 通常 iphone/ipad2 可以创建 180 度旋转材质。 您只需将 '-metadata Rotation=x' 排除在外...

        /usr/bin/ffmpeg -i input-movie.mov -timestamp 2012-06-23 08:58:10 -map_metadata 0:0 -metadata Rotation=270 -sws_flags lanczos -vcodec libx264 -x264opts me=umh - b 2600k -vf yadif=1,transpose=1,transpose=1,scale=1280:720 -f mp4 -y output-movie.MP4

        我有多个设备 - 例如机顶盒、ipad2、note2,并且我将所有输入材料(无论是 mp4、mov、MTS、AVI)转换为 720p mp4,直到现在所有生成的视频都可以正常播放(方向,声音)每个开发者。

        希望对你有帮助。

        【讨论】:

        • 这真的很有帮助。感谢您列出所有案例以及您如何解决它们。我没有想到 scale 会重置旋转值,并且我可以在任何其他过滤器之后简单地进行另一个转置以返回到我需要的方向。反响很好。
        【解决方案7】:

        为了将我的 iPhone 纵向格式视频包含到网页中,我刚刚发现了以下用于以纵向显示方式获取 .mp4 文件的方法。

        第 1 步:在 QuickTime Player 中,将文件导出为 480p(我假设 720p 或 1080p 也可以)。你又得到了一个 .mov 文件。

        第 2 步:在 QT Player 中获取新文件,然后导出到“iPad、iPhone……”。你会得到一个 .m4v 文件。

        第 3 步:我正在使用 Miro Video Converter,但可能任何现成的转换器都可以工作,以获取您的 .mp4 文件。

        就像一个(长篇大论的)魅力。

        【讨论】:

        • 那些是桌面应用程序。问题是关于 ffmpeg,它是一个命令行 unix 应用程序,可以编写脚本并用于在线视频转换等。
        【解决方案8】:

        我用 Ipad3 拍摄了视频,它的方向是颠倒的,我想这是所有 Apple 设备在某些版本中的常见情况。除此之外,长达 3 分钟的 MOV 文件 (1920x1090) 大小约为 500 Mb,因此无法轻松共享。我必须将其转换为 MP4,并分析我在 stackoverflow 上找到的所有线程,这是我使用的 ffmpeg 的最终代码字符串(ffmpeg 版本 2.8.4):

        ffmpeg -i IN.MOV -s 960x540 -metadata:s:v rotate="0" -acodec libmp3lame OUT.mp4
        

        如果您不需要调整大小和音频编解码器更改,我想您可以离开 '-metadata:s:v rotate="0"'。请注意,如果您调整视频大小,宽度和高度应完全划分为 4。

        【讨论】:

          【解决方案9】:

          虽然这个话题很老了。 希望这会对某人有所帮助:

          获取ffmpeg最新版本:https://www.ffmpeg.org/download.html

          对我有用的命令(翻转 180 度):

          ffmpeg -noautorotate -i input.mp4 -filter:v "rotate=PI" output.mp4
          

          当度数由-filter:v "PI/180*degrees"确定时

          例如 -filter:v "45*PI/180" 45 度

          这里有一个很好的解释 https://superuser.com/questions/578321/how-to-rotate-a-video-180-with-ffmpeg

          【讨论】:

            【解决方案10】:

            或者...简单地更改现有文件中的标签:

            读取当前旋转

            exiftool -Rotation <file>
            

            那么,例如:

            exiftool -Rotation=180 <file>
            

            将其设置为 180

            【讨论】:

            • 看起来不像 exiftool 直接编辑。它在 SSD 上使用临时文件结束编辑 32MB 文件需要很长时间。
            猜你喜欢
            • 2022-12-25
            • 1970-01-01
            • 2015-07-02
            • 1970-01-01
            • 1970-01-01
            • 2010-12-22
            • 2018-02-14
            • 2017-12-20
            • 2011-04-25
            相关资源
            最近更新 更多