Module: ActiveEncode::EngineAdapters::MediaConvertOutput

Defined in:
lib/active_encode/engine_adapters/media_convert_output.rb

Constant Summary collapse

AUDIO_SETTINGS =
{
  "AAC" => :aac_settings,
  "AC3" => :ac3_settings,
  "AIFF" => :aiff_settings,
  "EAC3_ATMOS" => :eac_3_atmos_settings,
  "EAC3" => :eac_3_settings,
  "MP2" => :mp_2_settings,
  "MP3" => :mp_3_settings,
  "OPUS" => :opus_settings,
  "VORBIS" => :vorbis_settings,
  "WAV" => :wav_settings
}.freeze
VIDEO_SETTINGS =
{
  "AV1" => :av_1_settings,
  "AVC_INTRA" => :avc_intra_settings,
  "FRAME_CAPTURE" => :frame_capture_settings,
  "H_264" => :h264_settings,
  "H_265" => :h265_settings,
  "MPEG2" => :mpeg_2_settings,
  "PRORES" => :prores_settings,
  "VC3" => :vc_3_settings,
  "VP8" => :vp_8_settings,
  "VP9" => :vp_9_settings,
  "XAVC" => :xavc_settings
}.freeze

Class Method Summary collapse

Class Method Details

.construct_output_url(destination:, file_input_url:, name_modifier:, file_suffix:) ⇒ Object

constructs an ‘s3:` output URL from the MediaConvert job params, the same way MediaConvert will.

Examples:

construct_output_filename(
  destination: "s3://bucket/base_name",
  original_filename: "foo.mp3",
  name_modifier: "-1080",
  suffix: "m3u8")
# =>  "s3://bucket/base_name-1080.m3u8"
construct_output_filename(
  destination: "s3://bucket/directory_end_in_slash/",
  original_filename: "original-filename.mp3",
  name_modifier: "-1080",
  suffix: "m3u8")
# =>  "s3://bucket/directory_end_in_slash/original_filename-1080.m3u8"
construct_output_filename(
  destination: "s3://bucket/directory_end_in_slash/",
  original_filename: "original-filename.mp3",
  name_modifier: nil,
  suffix: "m3u8")
# =>  "s3://bucket/directory_end_in_slash/original_filename.m3u8"


95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# File 'lib/active_encode/engine_adapters/media_convert_output.rb', line 95

def construct_output_url(destination:, file_input_url:, name_modifier:, file_suffix:)
  output = destination

  # MediaConvert operates such that if you give a destination ending in '/',
  # it'll use the original file name as part of output url.
  if output.end_with?('/')
    # ".*" on the end will strip extension off
    output += File.basename(file_input_url, '.*')
  end

  output += name_modifier if name_modifier

  output += "." + file_suffix

  output
end

.extract_audio_bitrate(settings) ⇒ Object



136
137
138
139
140
# File 'lib/active_encode/engine_adapters/media_convert_output.rb', line 136

def extract_audio_bitrate(settings)
  codec_settings = extract_audio_codec_settings(settings)
  return nil if codec_settings.nil?
  try(codec_settings, :bitrate)
end

.extract_audio_codec(settings) ⇒ Object



112
113
114
115
116
# File 'lib/active_encode/engine_adapters/media_convert_output.rb', line 112

def extract_audio_codec(settings)
  settings.audio_descriptions.first.codec_settings.codec
rescue
  nil
end

.extract_audio_codec_settings(settings) ⇒ Object



118
119
120
121
# File 'lib/active_encode/engine_adapters/media_convert_output.rb', line 118

def extract_audio_codec_settings(settings)
  codec_key = AUDIO_SETTINGS[extract_audio_codec(settings)]
  settings.audio_descriptions.first.codec_settings[codec_key]
end

.extract_video_bitrate(settings) ⇒ Object



142
143
144
145
146
# File 'lib/active_encode/engine_adapters/media_convert_output.rb', line 142

def extract_video_bitrate(settings)
  codec_settings = extract_video_codec_settings(settings)
  return nil if codec_settings.nil?
  try(codec_settings, :bitrate) || try(codec_settings, :max_bitrate)
end

.extract_video_codec(settings) ⇒ Object



123
124
125
126
127
# File 'lib/active_encode/engine_adapters/media_convert_output.rb', line 123

def extract_video_codec(settings)
  settings.video_description.codec_settings.codec
rescue
  nil
end

.extract_video_codec_settings(settings) ⇒ Object



129
130
131
132
133
134
# File 'lib/active_encode/engine_adapters/media_convert_output.rb', line 129

def extract_video_codec_settings(settings)
  codec_key = VIDEO_SETTINGS[extract_video_codec(settings)]
  settings.video_description.codec_settings[codec_key]
rescue
  nil
end

.extract_video_frame_rate(settings) ⇒ Object



148
149
150
151
152
153
154
# File 'lib/active_encode/engine_adapters/media_convert_output.rb', line 148

def extract_video_frame_rate(settings)
  codec_settings = extract_video_codec_settings(settings)
  return nil if codec_settings.nil?
  (codec_settings.framerate_numerator.to_f / codec_settings.framerate_denominator.to_f).round(2)
rescue
  nil
end

.tech_metadata_from_logged(settings, logged_output) ⇒ Object



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/active_encode/engine_adapters/media_convert_output.rb', line 52

def (settings, logged_output)
  url = logged_output.dig('outputFilePaths', 0)
  {
    width: logged_output.dig('videoDetails', 'widthInPx'),
    height: logged_output.dig('videoDetails', 'heightInPx'),
    frame_rate: extract_video_frame_rate(settings),
    duration: logged_output['durationInMs'],
    audio_codec: extract_audio_codec(settings),
    video_codec: extract_video_codec(settings),
    audio_bitrate: extract_audio_bitrate(settings),
    video_bitrate: extract_video_bitrate(settings),
    url: url,
    label: File.basename(url),
    suffix: settings.name_modifier
  }
end

.tech_metadata_from_settings(output_url:, output_settings:, output_detail_settings:) ⇒ Object

Parameters:

  • output_url (String)

    url, expected to be ‘s3://`

  • output_settings (Aws::MediaConvert::Types::Output)
  • output_detail_settings (Aws::MediaConvert::Types::OutputDetail)


36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/active_encode/engine_adapters/media_convert_output.rb', line 36

def (output_url:, output_settings:, output_detail_settings:)
  {
    width: output_detail_settings.video_details.width_in_px,
    height: output_detail_settings.video_details.height_in_px,
    frame_rate: extract_video_frame_rate(output_settings),
    duration: output_detail_settings.duration_in_ms,
    audio_codec: extract_audio_codec(output_settings),
    video_codec: extract_video_codec(output_settings),
    audio_bitrate: extract_audio_bitrate(output_settings),
    video_bitrate: extract_video_bitrate(output_settings),
    url: output_url,
    label: (output_url ? File.basename(output_url) : output_settings.name_modifier),
    suffix: output_settings.name_modifier
  }
end