この前に Stack Overflow でさらに 2 つの質問をしましたが、ほとんど助けが得られなかったので、後世のために公開質問をしようと思いました。AWS-SDK API ドキュメントの解析に時間を費やしましたが、私のニーズに対する直接的な答えはほとんど見つかりませんでした。AWS フォーラムにも投稿しましたが、良い反応を得ることができませんでした。シンプルで包括的で段階的な解決策を見つけるのは不可能に思えます。
私が完了したこと:
- CarrierWave を使用して s3 に直接アップロードします。私は Railscast #383 に従い、それを自分のニーズに合わせました。
- s3 バケットからファイルを「取得」できます。
私がこれまでに行ったことの詳細:
Carrierwave-Direct を使用して s3 に直接アップロードしました (これはフォグを利用して s3 への直接アップロードを処理します)。アップロードは、Sidekiq のバックグラウンド ジョブで処理されます。ファイルがバケットに置かれた後、ユーザーのアップロードを繰り返して取得し、s3 からのアップロードの URL でファイルを呼び出します。
これが私が迷っているところです:
- AWS が提供する Elastic Transcoder を使用して動画をトランスコードする必要があります。
- アップロード/変換された動画を出力バケットから呼び出す必要があります。「output-bucket」から URL にリンクするにはどうすればよいですか? 新しい URL 参照ですか、それとも URL は元の「アップロード URL」と同じままですか?
- トランスコードされたビデオをトランスコーダーから Cloudfront に統合し、JWPlayer を使用して表示する必要があります。
- バックグラウンドで API コードをアップロード プロセスに統合するにはどうすればよいですか?
これまでの私のコードは次のとおりです。
私のアップローダ:
class VideoUploader < CarrierWave::Uploader::Base
include CarrierWaveDirect::Uploader
end
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
私のアップロード モデル:
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
私の見解:
すべてのユーザーのアップロードを表示するには:
<% @user.uploads.each do |upload| %>
<%= link_to upload.title, upload_url(upload) %>
<% end %>
アップロードを表示するには (現在はダウンロード リンクのみです):
<h1><%= @upload.title %></h1>
<p><%= link_to @upload.video_url %></p>
私のスキーマやフォームは関連性がないと思います。
コードがどのように機能すると思うかの同様のサンプル:
このコードを Sidekiq ワーカーに追加しますが、これが正しいかどうかはわかりません。また、「アップロード」を「変換されたアップロード」にどのように接続するかについても不明です。
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'
}
)
Elastic Transcoder に関する役立つ記事とドキュメントへのリンク:
http://www.techdarkside.com/getting-started-with-the-aws-elastic-transcoder-api-in-rails
http://docs.aws.amazon.com/sdkforruby/api/Aws/ElasticTranscoder.html