2

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
Cole Phiper
  • 349
  • 1
  • 13

0 Answers0