Usando CarrierWave com o Amazon Elastic Transcoder em um aplicativo Rails

Eu fiz duas perguntas adicionais antes disso no Stack Overflow, mas recebi muito pouca ajuda e pensei em fazer uma pergunta aberta para a posteridade. Passei um tempo analisando os documentos da API do AWS-SDK e encontrei muito poucas respostas diretas para minhas necessidades. Também publiquei nos fóruns da AWS e não consegui obter uma boa resposta lá. Uma solução simples, abrangente e passo a passo parece impossível de encontrar.

O que eu completei:

Upload com CarrierWave direto para s3. Segui o Railscast # 383 e o adaptei às minhas necessidades.Eu sou capaz de "recuperar" meus arquivos do meu bucket s3.

Detalhes sobre o que eu fiz até agora:

Usei o Carrierwave-Direct para fazer upload direto para o s3 (isso utiliza neblina para lidar com o upload direto para o s3). O upload é processado em um trabalho em segundo plano com o Sidekiq. Depois que o arquivo é colocado no balde, eu apenas o recupero iterando através dos uploads de um usuário e chamo o arquivo pelo URL do upload do s3.

Aqui é onde eu estou perdido:

Preciso transcodificar vídeos com o Elastic Transcoder fornecido pela AWS.Preciso recuperar os vídeos enviados / convertidos do intervalo de saída. Como faço para vincular o URL a partir do "balde de saída"? É uma nova referência de URL ou permanece igual ao "URL de upload" original?Preciso integrar os vídeos transcodificados do transcodificador ao Cloudfront e exibi-los usando o JWPlayer.Como integro o código da API ao meu processo de upload em segundo plano?

Aqui esta o meu codigo ate agora:

Meu remetente:

class VideoUploader < CarrierWave::Uploader::Base
 include CarrierWaveDirect::Uploader
end

Meu inicializador que lida com os detalhes do s3:

CarrierWave.configure do |config|

 config.fog_credentials = {
 provider:              'AWS',
 aws_access_key_id:     'AWS_ACCESS_KEY_ID',
 aws_secret_access_key: 'AWS_SECRET_ACCESS_KEY',
 region:                'us-west-1'}

 config.fog_directory  = 'video-input'
 config.fog_public     = false                                        # optional, defaults to true
 config.fog_attributes = { 'Cache-Control' => "max-age=#{365.day.to_i}" } # optional, defaults to {}
end

Meu modelo de upload:

class Upload < ActiveRecord::Base
 belongs_to :user
 mount_uploader :video, VideoUploader


 after_save :enqueue_video

 def enqueue_video
  VideoWorker.perform_async(id, key) if key.present?
 end

 class VideoWorker
  include Sidekiq::Worker

  def perform(id, key)
    upload = Upload.find(id)
    upload.key = key
    video.remote_video_url = upload.video.direct_fog_url(with_path: true)
    upload.save!
  end
 end
end

Minha visão:

Para mostrar os envios de todos os usuários:

<% @user.uploads.each do |upload| %>
  <%= link_to upload.title, upload_url(upload) %>
<% end %>

Para mostrar o upload (agora é apenas um link de download):

<h1><%= @upload.title %></h1>
<p><%= link_to @upload.video_url %></p>

Não acho que meu esquema ou formulário seja relevante.

Um exemplo semelhante de como acho que o código pode funcionar:

Eu adicionaria esse código ao trabalhador do Sidekiq, mas não tenho certeza se estou fazendo isso corretamente. Também não tenho certeza sobre como vou conectar meu "upload" ao "upload convertido".

 upload.update_column 'converted_video', 
 File.basename(upload.video.path)

transcoder = AWS::ElasticTranscoder::Client.new
transcoder.create_job(
  pipeline_id: APP_CONFIG[Rails.env][:pipeline_id],
  input: {
    key: upload.video.path,
    frame_rate: 'auto',
    resolution: 'auto',
    aspect_ratio: 'auto',
    interlaced: 'auto',
    container: 'auto'
  },
  output: {
    key: upload.converted_video.path,
    preset_id: WEB_M4_PRESET_ID,
    thumbnail_pattern: "",
    rotate: '0'
  }
)

Links para um artigo útil e os documentos sobre o transcodificador elástico:

http://www.techdarkside.com/getting-started-with-the-aws-elastic-transcoder-api-in-rails

http://docs.aws.amazon.com/sdkforruby/api/Aws/ElasticTranscoder.html

questionAnswers(1)

yourAnswerToTheQuestion