ffmpegvideo的条件旋转

我在使用Carrierwave-Video gem上传肖像video时遇到问题。 上传纵向video(特别是在移动设备上捕获的video)时,它们会顺时针旋转90度。 在Carrierwave-Video文档中,有一个动态配置选项,但我没有看到一种方法来动态传递自定义参数,以便根据video方向对video进行转码。 我知道如果我运行以下行,我可以将video旋转90度CCW:

encode_video(:mp4, custom: "-vf transpose=1") 

我需要一种可靠的方法来检测video是否需要旋转 。 我想知道是否有一些方法让我使用ffmpeg运行条件参数,只有在video是肖像时才运行。

如果它有用,这就是我的video上传器在我的Rails应用程序中的样子(出于某种原因,转码过程甚至在它检测到video的方向之前就已经运行了):

 require 'carrierwave/processing/mime_types' class VideoPathUploader  video_width # rotate video Rails.logger.debug "portrait video" encode_video(:mp4, custom: "-vf transpose=1", aspect: aspect_ratio) else encode_video(:mp4, aspect: aspect_ratio) end instance_variable_set(:@content_type, "video/mp4") :set_content_type_mp4 end end 

我能够通过使用mini_exiftool gem解决问题。 在我的计算机上安装exiftool后(使用brew install exiftool),我能够获得上传video的方向和宽高比,并使用它来确定是否使用ffmpeg将变换应用于video。 这是我的最终上传者:

 require 'carrierwave/processing/mime_types' require 'rubygems' require 'mini_exiftool' class VideoPathUploader < CarrierWave::Uploader::Base process :encode def encode video = MiniExiftool.new(@file.path) orientation = video.rotation if orientation == 90 # rotate video Rails.logger.debug "portrait video" aspect_ratio = video.imageheight.to_f / video.imagewidth.to_f encode_video(:mp4, custom: "-vf transpose=1", aspect: aspect_ratio) else aspect_ratio = video.imagewidth.to_f / video.imageheight.to_f encode_video(:mp4, resolution: :same, aspect: aspect_ratio) end instance_variable_set(:@content_type, "video/mp4") :set_content_type_mp4 end end 

此外,如果它有用,我还必须在Heroku上安装exiftool以将其与我的Rails应用程序一起使用。 我通过使用以下buildpack来做到这一点:

https://github.com/benalavi/buildpack-exiftool

在安装buildpack之后,我仍然需要手动指定exiftool的路径(它应该在安装buildpack时自动执行此操作,但它并没有为我执行此操作)。 我通过手动设置路径来完成此操作:

 heroku config:set PATH=*all_your_other_paths*:vendor/exiftool-9.40/bin 

我有一个类似的问题,并根据科学的解决方案使用了解决方案

您很可能希望清除与video相关联的轮播元数据。 一些玩家(quicktime)将查看旋转元数据并相应地旋转video。 因此,如果您在转码时旋转90,然后video在播放器中旋转90,它将以180度播放。 我还添加了一些标志来提高转码video的质量。

 if orientation == 90 aspect_ratio = video.imageheight.to_f / video.imagewidth.to_f encode_video(:mp4, custom: "-qscale 0 -preset slow -g 30 -vf 'transpose=1' -metadata:s:v:0 rotate=0", aspect: aspect_ratio) else