【问题标题】:Use Shrine to upload video files and generate thumbnails使用 Shrine 上传视频文件并生成缩略图
【发布时间】:2019-10-23 10:57:14
【问题描述】:

我想使用 Shrine gem 上传视频文件、转码并从视频中生成缩略图。

我正在尝试将 Erik Dahlstrand 的 Shrine-Rails-example 从照片转换为视频。我在创建视频上传器时遇到问题。我将此代码基于Video isn't of allowed type (allowed types: video/mp4), Shrine, Rails

require "streamio-ffmpeg"

class VideoUploader < Shrine
  ALLOWED_TYPES = %w[video/mp4 video/quicktime video/x-msvideo video/mpeg]
  plugin :processing
  plugin :versions

  plugin :determine_mime_type
  plugin :cached_attachment_data
  plugin :remove_attachment
  plugin :add_metadata
  plugin :validation_helpers
  plugin :derivation_endpoint, prefix: "derivations/video"

  add_metadata do |io, context|
    movie = Shrine.with_file(io) { |file| FFMPEG::Movie.new(file.path) }

    { "duration"   => movie.duration,
      "bitrate"    => movie.bitrate,
      "resolution" => movie.resolution,
      "frame_rate" => movie.frame_rate }
  end

  movie.screenshot("video_thumb_007.jpg", seek_time: 5, resolution: '320x240')

  metadata_method :duration

  Attacher.validate do
    validate_max_size 100.megabyte, message: "is too large (max is 100 MB)"
    validate_mime_type_inclusion ALLOWED_TYPES
  end
end

我收到此错误:

/var/folders/mm/_j8x4k2176jcv31zvbc497_c0000gp
    /T/shrine20190607-24438-4f3jz2.m4v: No such file or directory

事实上,该位置没有文件。那么等待上传的文件存放在哪里呢?

此外,使用演示将照片上传到 AWS(生产环境),对象存储在存储桶中名为“照片”的文件夹中。 Shrine 显然使用表名来命名文件夹。是否可以创建替代和嵌套文件夹名称?

谢谢 - 看起来像一个了不起的宝石!试图更好地理解它!

谢谢

【问题讨论】:

    标签: amazon-s3 ruby-on-rails-5 shrine


    【解决方案1】:

    进一步研究文档后,我只剩下一个问题就能解决这个问题 - 是否可以控制 AWS 存储桶中的哪些文件夹将原始文件和拇指上传到?谢谢

    解决方案:

    require "streamio-ffmpeg"
    require "tempfile"
    
    class VideoUploader < ImageUploader
      plugin :add_metadata
      plugin :validation_helpers
      plugin :processing
      plugin :versions
      plugin :delete_raw
    
      add_metadata do |io, context|
        movie = Shrine.with_file(io) { |file| FFMPEG::Movie.new(file.path) }
        { "duration"   => movie.duration,
          "bitrate"    => movie.bitrate,
          "resolution" => movie.resolution,
          "frame_rate" => movie.frame_rate
        }
    
      end
    
      process(:store) do |io, context|
        versions = {original: io}
    
        io.download do |original|
          screenshot1 = Tempfile.new(["screenshot1", ".jpg"], binmode: true)
          screenshot2 = Tempfile.new(["screenshot2", ".jpg"], binmode: true)
          screenshot3 = Tempfile.new(["screenshot3", ".jpg"], binmode: true)
          screenshot4 = Tempfile.new(["screenshot4", ".jpg"], binmode: true)
    
          movie = FFMPEG::Movie.new(original.path)
          movie.screenshot(screenshot1.path, seek_time: 5, resolution: '640x480')
          movie.screenshot(screenshot2.path, seek_time: 10, resolution: '640x480')
          movie.screenshot(screenshot3.path, seek_time: 15, resolution: '640x480')
          movie.screenshot(screenshot4.path, seek_time: 20, resolution: '640x480')
    
          [screenshot1, screenshot2, screenshot3, screenshot4].each(&:open) # refresh file descriptors
    
          versions.merge!(screenshot1: screenshot1, screenshot2: screenshot2, screenshot3: screenshot3, screenshot4: screenshot4)
        end
    
        versions
      end
    
      Attacher.validate do
        validate_max_size 100.megabyte, message: "is too large (max is 100 MB)"
        validate_mime_type_inclusion ALLOWED_TYPES
      end
    end
    

    【讨论】:

      猜你喜欢
      • 2018-06-06
      • 2018-10-19
      • 2014-06-27
      • 1970-01-01
      • 2012-09-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-04
      • 2011-02-19
      相关资源
      最近更新 更多