erwenden von CarrierWave mit Amazon Elastic Transcoder in einer Rails-A
Ich habe vorher zwei zusätzliche Fragen zu Stack Overflow gestellt, aber nur sehr wenig Hilfe bekommen, und ich dachte, ich würde der Nachwelt eine offene Frage stellen. Ich habe Zeit damit verbracht, die AWS-SDK-API-Dokumente zu analysieren, und nur sehr wenige direkte Antworten auf meine Anforderungen gefunden. Ich habe auch in den AWS-Foren gepostet und dort keine gute Antwort erhalten. Es scheint unmöglich, eine einfache, umfassende und schrittweise Lösung zu finden.
Was ich abgeschlossen habe:
Upload mit CarrierWave direkt auf s3. Ich folgte Railscast # 383 und passte es meinen Bedürfnissen an.Ich kann meine Dateien aus meinem S3-Bucket "abrufen".Details darüber, was ich bisher gemacht habe:
Ich habe Carrierwave-Direct verwendet, um direkt auf s3 hochzuladen (dies nutzt Nebel, um das Hochladen direkt auf s3 zu erledigen). Der Upload wird in einem Hintergrundjob mit Sidekiq verarbeitet. Nachdem die Datei in den Eimer gelegt wurde, rufe ich sie einfach durch Iteration durch die Uploads eines Benutzers ab und rufe die Datei über die URL des Uploads von s3 auf.
Hier bin ich verloren:
Ich muss Videos mit dem von AWS bereitgestellten Elastic Transcoder umcodieren.Ich muss die hochgeladenen / konvertierten Videos aus dem Ausgabe-Bucket zurückrufen. Wie verlinke ich aus dem "Ausgabe-Bucket" auf die URL? Handelt es sich um eine neue URL-Referenz oder stimmt die URL mit der ursprünglichen "Upload-URL" überein?Ich muss die transkodierten Videos vom Transkodierer in Cloudfront integrieren und sie mit JWPlayer anzeigen.Wie binde ich den API-Code im Hintergrund in meinen Upload-Prozess ein?Hier ist mein Code bisher:
Mein Uploader:
class VideoUploader < CarrierWave::Uploader::Base
include CarrierWaveDirect::Uploader
end
Mein Initialisierer, der die s3-Details verarbeitet:
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
Mein Upload-Modell:
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
Meine Sicht
Um alle Uploads des Benutzers anzuzeigen:
<% @user.uploads.each do |upload| %>
<%= link_to upload.title, upload_url(upload) %>
<% end %>
Um den Upload anzuzeigen (im Moment handelt es sich nur um einen Download-Link):
<h1><%= @upload.title %></h1>
<p><%= link_to @upload.video_url %></p>
Ich glaube nicht, dass mein Schema oder meine Formulare relevant sind.
Ein ähnliches Beispiel für die Funktionsweise des Codes:
Ich würde diesen Code dem Sidekiq-Worker hinzufügen, bin mir aber nicht sicher, ob ich das richtig mache. Ich bin mir auch nicht sicher, wie ich meinen "Upload" mit dem "konvertierten Upload" verbinden soll.
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 zu einem hilfreichen Artikel und den Dokumenten zum Elastic Transcoder:
http: //www.techdarkside.com/getting-started-with-the-aws-elastic-transcoder-api-in-rail
http: //docs.aws.amazon.com/sdkforruby/api/Aws/ElasticTranscoder.htm