4

我正在计划一个涉及视频上传和压缩的 RoR 项目。通常,我会使用 Shrine 处理文件附件,并在上传后在后台作业中使用ffmpeg处理视频压缩。

现在这ActiveStorage是内置的 Rails 5.2,我想选择它,但我不确定它是否可以很好地处理视频(带压缩)。到目前为止,我只找到了关于处理图像(使用 MiniMagick)或创建视频/pdf 预览(使用 ffmpeg 或 mutools)的文档,这一切似乎都是即时发生的。

由于视频的压缩是时间密集型的,我想说它应该在上传之后直接发生,以便为请求做好准备。上传后是否有处理文件的选项,使用 ActiveStorage 还是仅在运行中

如果不是,为什么或者更确切地说建议即时处理所有文件处理?

谢谢

4

1 回答 1

4

这是我上传后将视频转换为 MP4 的解决方案。也许不是最干净的,但它有效。我使用 Delayed::Job 来异步处理调用。

def process_video!
  if video.attached? && video.blob.content_type != 'video/mp4'

    orig_video_tmpfile = "#{Rails.root}/tmp/#{video.blob.key}_#{video.blob.filename.to_s}"
    mp4_video_tmpfile = "#{Rails.root}/tmp/#{video.blob.key}_#{video.blob.filename.base}.mp4"
    File.open(orig_video_tmpfile, 'wb') do |f|
      f.write(video.download)
    end

    system('ffmpeg', '-i', orig_video_tmpfile, mp4_video_tmpfile)

    self.video.attach(
      io: File.open(mp4_video_tmpfile),
      filename: "#{video.blob.filename.base}.mp4",
      content_type: 'video/mp4'
    )

    File.delete(orig_video_tmpfile)
    File.delete(mp4_video_tmpfile)
  end
end
handle_asynchronously :process_video!
after_commit :process_video!
于 2019-07-10T12:24:31.577 回答