I setup carrierwave_backgrounder, carrierwave-video, and carrierwave-ffmpegthumbnailer to encode video files after the initial record is inserted into the database (postgresql). The issue that I am having is, I can only start the encoding process in rails console. For some odd reason, it doesn't begin when I use the form. I have the default configuration setup for sidekiq and carrierwave-backgrounder. I'm also processing each file in mp4 or webm. The record stores into the database with the video column as null. It shows nothing in my server development log about encoding or sidekiq job. I checked the web ui for sidekiq and nothing is there as well. What I've done so far is below. I'm using Rails 5.2, btw. How can I successfully encode videos using sidekiq and carrierwave_background??
carrierwave_backgrounder.rb
CarrierWave::Backgrounder.configure do |c|
c.backend :sidekiq, queue: :carrierwave
end
sidekiq.rb
require 'sidekiq'
Sidekiq.configure_client do |config|
config.redis = {:size => 1}
end
Sidekiq.configure_server do |config|
end
story_video_uploader.rb
class StoryVideoUploader < CarrierWave::Uploader::Base
include ::CarrierWave::Backgrounder::Delay
# Include RMagick or MiniMagick support:
# include CarrierWave::RMagick
include CarrierWave::MiniMagick
include CarrierWave::Video
# include CarrierWave::Video::Thumbnailer
#include CarrierWave::FFMPEG
# 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:
=begin
version :thumb do
process thumbnail: [{ format: 'png', quality: 10, size: 200, strip: true, logger: Rails.logger }]
def full_filename(for_file)
png_name(for_file, version_name)
end
end
=end
version :mp4 do
process encode_video: [:mp4, preserve_aspect_ratio: :height,
video_codec: 'libx264', # H.264/MPEG-4 AVC video codec
constant_rate_factor: '30', # GOP Size
frame_rate: '25', # Frame rate
audio_codec: 'aac', # AAC audio codec
audio_bitrate: '64k', # Audio bitrate
audio_sample_rate: '44100' # Audio sampling frequency
]
end
version :webm do
process encode_video: [:webm, preserve_aspect_ratio: :height,
video_codec: 'libvpx', # H.264/MPEG-4 AVC video codec
constant_rate_factor: '30', # GOP Size
frame_rate: '25', # Frame rate
audio_codec: 'libvorbis', # AAC audio codec
audio_bitrate: '64k', # Audio bitrate
audio_sample_rate: '44100' # Audio sampling frequency
]
end
def png_name(for_file, version_name)
%Q{#{version_name}_#{for_file.chomp(File.extname(for_file))}.png}
end
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
end
story.rb
class Story < ApplicationRecord
reverse_geocoded_by :latitude, :longitude, :address => :location
include UniqueIdentifierLinksHelper
belongs_to :user, optional: true
mount_uploader :story_video, StoryVideoUploader
process_in_background :story_video
end
stories_controller.rb
class StoriesController < ApplicationController
before_action :set_story, only: %i[show edit update destroy like unlike]
before_action :authenticate_user!
# GET /stories
# GET /stories.json
def index
@stories = current_user.stories.order(created_at: :desc).page(params[:page]).per(20)
end
# GET /stories/1
# GET /stories/1.json
def show
impressionist(@story)
end
# GET /stories/new
def new
@story = Story.new
end
# GET /stories/1/edit
def edit; end
# POST /stories
# POST /stories.json
def create
@story = current_user.stories.build(story_params)
respond_to do |format|
if @story.save
format.html {redirect_to @story, notice: 'Your story was created!'}
#format.json { render :show, status: :created, location: @story }
#format.js
else
format.html {render :new}
#format.json { render json: @story.errors, status: :unprocessable_entity }
#format.js
end
end
end
# PATCH/PUT /stories/1
# PATCH/PUT /stories/1.json
def update
respond_to do |format|
if @story.update(story_params)
format.json { head :no_content }
format.js
else
format.json { render json: @story.errors, status: :unprocessable_entity }
end
end
end
# DELETE /stories/1
# DELETE /stories/1.json
def destroy
@story.destroy
respond_to do |format|
format.js
format.html { redirect_to stories_url }
format.json { head :no_content }
end
end
def like
@story.liked_by current_user
respond_to do |format|
format.html { redirect_to :back }
format.js
end
end
def unlike
@story.unliked_by current_user
respond_to do |format|
format.html { redirect_to :back }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_story
@story = Story.find(params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def story_params
params.require(:story).permit(:story_video, :story_video_processing)
end
end