Ubuntu で FFMPEGとCarrierWaveで動画のサムネイルを作成したい。
teratailで質問したのですが、
一日以上たち、回答がつかなかったのでスタックオーバーフローにマルチポストさせていただきます。
以下内容です。
前提・実現したいこと
投稿した動画からスクリーンショットでサムネイル表示をしたいです。
エラーメッセージ
Errno::ENOENT in MicropostsController#create
No such file or directory - the ffprobe binary could not be found in /usr/local/rvm/gems/ruby-2.3.0/bin:/home/ubuntu/.nvm/versions/node/v4.5.0/bin:/usr/local/rvm/gems/ruby-2.3.0@global/bin:/usr/local/rvm/rubies/ruby-2.3.0/bin:/mnt/shared/bin:/home/ubuntu/workspace/node_modules/.bin:/home/ubuntu/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/mnt/shared/sbin:/opt/gitl:/opt/go/bin:/mnt/shared/c9/app.nw/bin:/usr/local/rvm/bin
スクリーンショットメソッドの途中でこのようなエラーが表示されます。
ディレクトリが見つけられないとのことですが、includeやrequireあたりが間違っているのでしょうか?
実行手順
①Carrierwaveの設定(動画は無事アップロードされます)
②FFmpegのインストール
③スクリーンショットの作成
ステップ明記
③からうまくいきません。
念のため、②からかきます。
②FFmpegのインストール
$ sudo apt-get install ffmpeg
bundle install
gem 'streamio-ffmpeg'
③スクリーンショットの作成
【追記】
app/uploaders/video_uploader.rb
require 'streamio-ffmpeg'
app/uploaders/video_uploader.rb
# Create different versions of your uploaded files:
(中略)
version :screenshot do
process :screenshot
def full_filename (for_file = model.logo.file)
"screenshot.jpg"
end
end
def screenshot
tmpfile = File.join(File.dirname(current_path), "tmpfile")
File.rename(current_path, tmpfile)
movie = FFMPEG::Movie.new(tmpfile)★エラー箇所★
movie.screenshot(current_path + ".jpg", {resolution: '512x312' }, preserve_aspect_ratio: :width)
preserve_aspect_ratio: :width)
File.rename(current_path + ".jpg", current_path)
File.delete(tmpfile)
end
文献の引用
こちらを参考にコードをかいています。
ソース
# encoding: utf-8
require 'streamio-ffmpeg'
class VideoUploader < CarrierWave::Uploader::Base
# Include RMagick or MiniMagick support:
# include CarrierWave::RMagick
# include CarrierWave::MiniMagick
# Choose what kind of storage to use for this uploader:
storage :file
# storage :fog
# Override the directory where uploaded files will be stored.
# This is a sensible default for uploaders that are meant to be mounted:
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
# Provide a default URL as a default if there hasn't been a file uploaded:
# def default_url
# # For Rails 3.1+ asset pipeline compatibility:
# # ActionController::Base.helpers.asset_path("fallback/" + [version_name, "default.png"].compact.join('_'))
#
# "/images/fallback/" + [version_name, "default.png"].compact.join('_')
# end
# Process files as they are uploaded:
# process :scale => [200, 300]
#
# def scale(width, height)
# # do something
# end
# Create different versions of your uploaded files:
version :screenshot do
process :screenshot
def full_filename (for_file = model.logo.file)
"screenshot.jpg"
end
end
def screenshot
tmpfile = File.join(File.dirname(current_path), "tmpfile")
File.rename(current_path, tmpfile)
movie = FFMPEG::Movie.new(tmpfile)★エラー箇所★
movie.screenshot(current_path + ".jpg", {resolution: '512x312' }, preserve_aspect_ratio: :width)
File.rename(current_path + ".jpg", current_path)
File.delete(tmpfile)
end
# Add a white list of extensions which are allowed to be uploaded.
# For images you might use something like this:
def extension_white_list
%w(MOV wmv mp4)
end
# Override the filename of the uploaded files:
# Avoid using model.id or version_name here, see uploader/store.rb for details.
# def filename
# "something.jpg" if original_filename
# end
end
試したこと
①screenshotメソッドを外すと動画のアップロードはできるようになります。
②ディレクトリの位置が間違っているのかとも思いましたので多少いじってみましたがよくわかりませんでした。
環境
Gemfile
gem 'rails', '4.2.5'
gem 'carrierwave', '0.10.0'
gem 'streamio-ffmpeg'
gem "less-rails"
gem 'therubyracer'
マルチポスト
teratail