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
- 跳过carrierwave Integirty和Processingvalidation
- RMagick抱怨在OSX中找不到libMagickCore.5.dylib
- Papertrail和Carrierwave
- 使用Amazon S3配置Carrierwave,在Heroku上托管
- Carrierwave,Rails 4; Errno :: ENOENT(没有这样的文件或目录 – 识别)
- carrierwave Excon :: Errors :: SocketError
- Carrierwave如何获取文件扩展名
- Rails 4强参数param not found with carrierwave
- 在Rails应用程序中使用CarrierWave和Amazon Elastic Transcoder