Используйте Shrine для загрузки видеофайлов и создания миниатюр - PullRequest
1 голос
/ 08 июня 2019

Я хочу использовать камень Shrine для загрузки видеофайлов, транскодирования и создания миниатюр из видео.

Я пытаюсь преобразовать Эрик Дальстранд Shrine-Rails-example из фотографий в видео. У меня проблемы с созданием загрузчика видео. Я основал этот код на Видео не разрешенного типа (допустимые типы: 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 (производственная среда) объекты хранятся в корзине в папке с названием «photos». Шрайн использует имя таблицы, чтобы назвать папку, по-видимому. Можно ли создавать альтернативные и вложенные имена папок?

Спасибо - похоже на удивительный драгоценный камень! Пытаясь понять это лучше!

Thx

1 Ответ

1 голос
/ 09 июня 2019

Продолжая углубляться в документацию, я смог решить эту проблему только с одним оставшимся вопросом - можно ли контролировать, в какие папки в корзине AWS загружаются оригинал и превью? Thx

Решение:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...