4

У меня есть приложение rails, которое загружает видео в ковш AWS S3, используя их конфигурацию CORS, когда это будет завершено, и создается видеообъект с рельсами, созданное для кодирования задания Elastic Transcoder видео в формате .mp4 и генерировать уменьшенное изображение, AWS SNS позволяет отправлять push-уведомления, когда задание завершено.Извлечь файл и файл эскиза из задания AWS Elastic Transcoder

Процесс работает хорошо, и я получаю уведомление SNS, когда загрузка завершена, однако я могу получить URL-адрес видео только отлично, но уведомление содержит только шаблон эскизов, а не фактическое имя файла.

Ниже представлено типичное уведомление, которое я получаю от AWS SNS. NB. Это из выходов хэш

{"id"=>"1", "presetId"=>"1351620000001-000040", "key"=>"uploads/video/150/557874e9-4c67-40f0-8f98-8c59506647e5/IMG_0587.mp4", "thumbnailPattern"=>"uploads/video/150/557874e9-4c67-40f0-8f98-8c59506647e5/{count}IMG_0587", "rotate"=>"auto", "status"=>"Complete", "statusDetail"=>"The transcoding job is completed.", "duration"=>10, "width"=>202, "height"=>360} 

Как вы можете видеть под thumbnailPattern это только FilePattern использовать, а не сам файл создан.

Кто-нибудь знает, как я могу получить URLS для файлов, созданных с помощью эластичного транскодера и SNS?

transcoder.rb # => Я создаю новый объект перекодирования, когда видео было сохраненной

class Transcoder < Video 
    def initialize(video) 
    @video = video 
    @directory = "uploads/video/#{@video.id}/#{SecureRandom.uuid}/" 
    @filename = File.basename(@video.file, File.extname(@video.file)) 
    end 

    def create 
    transcoder = AWS::ElasticTranscoder::Client.new(region: "us-east-1") 
    options = { 
     pipeline_id: CONFIG[:aws_pipeline_id], 
     input: { 
     key: @video.file.split("/")[3..-1].join("/"), # slice off the amazon.com bit 
     frame_rate: "auto", 
     resolution: 'auto', 
     aspect_ratio: 'auto', 
     interlaced: 'auto', 
     container: 'auto' 
     }, 
     outputs: [ 
     { 
      key: "#{@filename}.mp4", 
      preset_id: '1351620000001-000040', 
      rotate: "auto", 
      thumbnail_pattern: "{count}#{@filename}" 
     } 
     ], 
     output_key_prefix: "#{@directory}" 
    } 
    job = transcoder.create_job(options) 
    @video.job_id = job.data[:job][:id] 
    @video.save! 
    end 
end 

VideosController #create

class VideosController < ApplicationController 
    def create 
    @video = current_user.videos.build(params[:video]) 
    respond_to do |format| 
     if @video.save 
     transcode = Transcoder.new(@video) 
     transcode.create 
     format.html { redirect_to videos_path, notice: 'Video was successfully uploaded.' } 
     format.json { render json: @video, status: :created, location: @video } 
     format.js 
     else 
     format.html { render action: "new" } 
     format.json { render json: @video.errors, status: :unprocessable_entity } 
     end 
    end 
    end 
end 

ответ

7

Это не кажется, что фактическое имя эскизы передаются обратно либо из уведомлений SNS, либо из ответа на запрос при создании задания:

http://docs.aws.amazon.com/elastictranscoder/latest/developerguide/create-job.html#create-job-examples

http://docs.aws.amazon.com/elastictranscoder/latest/developerguide/notifications.html

Поскольку базовый путь/имя ваших эскизов известно, и порядковый номер всегда будет начинаться с 00001, вы можете перемещаться оттуда, чтобы определить, если/сколько эскизов существует после завершения работы. Убедитесь, что вы используете HEAD-запросы против объектов в S3, чтобы определить их присутствие; его примерно в 10 раз дешевле, чем запрос LIST.

+3

кажется сумасшедшим, что URL-адреса не отправляются/не обновляются в задании или в уведомлении SNS – dodgerogers747

+0

Я согласен; мы надеемся, что команда AWS ETS согласится с тем, что у нее есть запрос на повышение/особенность, основанный на сообщении форума AWS. –

Смежные вопросы