bitmovin-ruby 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/README.md +1 -1
- data/examples/create_encoding_finished_webhook.rb +21 -0
- data/examples/dash_hls_mp4_encoding_with_manifests.rb +502 -0
- data/examples/hls_multi_codec.rb +205 -0
- data/examples/simple_dash_with_http_input.rb +216 -0
- data/examples/simple_hls_with_aes128.rb +197 -0
- data/lib/bitmovin/encoding/codec_configurations/h265_configuration.rb +1 -0
- data/lib/bitmovin/encoding/encodings/muxings/drms/drm_muxing_resource.rb +54 -0
- data/lib/bitmovin/encoding/encodings/muxings/drms/drm_muxings.rb +6 -0
- data/lib/bitmovin/encoding/encodings/muxings/drms/ts_muxing_aes_encryption.rb +5 -0
- data/lib/bitmovin/encoding/encodings/muxings/drms/ts_muxing_aes_encryption_list.rb +15 -0
- data/lib/bitmovin/encoding/encodings/muxings/drms/ts_muxing_drm_list.rb +11 -0
- data/lib/bitmovin/encoding/encodings/muxings/mp4_muxing_list.rb +1 -1
- data/lib/bitmovin/encoding/encodings/muxings/ts_muxing.rb +15 -0
- data/lib/bitmovin/encoding/encodings/stream.rb +6 -1
- data/lib/bitmovin/encoding/encodings.rb +4 -0
- data/lib/bitmovin/encoding/inputs.rb +18 -0
- data/lib/bitmovin/encoding/manifests/hls_audio_media.rb +27 -0
- data/lib/bitmovin/encoding/manifests/hls_manifest.rb +43 -0
- data/lib/bitmovin/encoding/manifests/hls_variant_stream.rb +20 -0
- data/lib/bitmovin/encoding/manifests/hls_variant_stream_list.rb +22 -0
- data/lib/bitmovin/encoding/manifests/list.rb +39 -0
- data/lib/bitmovin/encoding/manifests.rb +3 -0
- data/lib/bitmovin/encoding/outputs.rb +2 -0
- data/lib/bitmovin/version.rb +1 -1
- data/lib/bitmovin/webhooks/encoding_finished_webhook.rb +5 -0
- data/lib/bitmovin/webhooks/webhook_encryption.rb +45 -0
- data/lib/bitmovin/webhooks/webhook_resource.rb +5 -0
- data/lib/bitmovin/webhooks/webhook_signature.rb +45 -0
- data/lib/bitmovin/webhooks.rb +8 -0
- data/lib/bitmovin-ruby.rb +1 -0
- metadata +22 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5de44e18db229a82ee80c332b3aee2728351fcde
|
4
|
+
data.tar.gz: c61b99260159081c6727925c5f6dd1704af4e887
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f2ee0b359e8cc3edc9a6da8c0962cfef95ff56a7fa9ba3188d43179d0dbae38fc8788ece33e0f3486156541fb565663f067ed2d765e4f8f311254bfe2b6837cd
|
7
|
+
data.tar.gz: c56d66a39a98fd244ba6aeb5da50b408141a1ca52657a5d0c781bf0054a7f37f477619f2ddca41c4d98452ed1f90430710da3f89222e777f358f6ac19cc6d80c
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Bitmovin::Ruby API Client
|
1
|
+
# [](http://www.bitmovin.com) Bitmovin::Ruby API Client
|
2
2
|
[](https://codecov.io/gh/bitmovin/bitmovin-ruby)
|
3
3
|
[](https://travis-ci.org/bitmovin/bitmovin-ruby)
|
4
4
|
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'bitmovin-ruby'
|
2
|
+
|
3
|
+
# Adding finished webhook to encoding
|
4
|
+
finished_webhook = Bitmovin::Webhooks::EncodingFinishedWebhook.new(
|
5
|
+
{
|
6
|
+
method: 'POST',
|
7
|
+
insecure_ssl: 'false',
|
8
|
+
url: 'http://httpbin.org/post',
|
9
|
+
encryption: Bitmovin::Webhooks::WebhookEncryption.new({
|
10
|
+
key: 'mySecretKey',
|
11
|
+
type: 'AES'
|
12
|
+
}),
|
13
|
+
signature: Bitmovin::Webhooks::WebhookSignature.new({
|
14
|
+
key: 'mySecretKey',
|
15
|
+
type: 'HMAC'
|
16
|
+
})
|
17
|
+
}
|
18
|
+
)
|
19
|
+
|
20
|
+
finished_webhook.save!
|
21
|
+
puts "Added finished webkook with id #{finished_webhook.id}!"
|
@@ -0,0 +1,502 @@
|
|
1
|
+
require 'bitmovin-ruby'
|
2
|
+
|
3
|
+
# CONFIGURATION
|
4
|
+
BITMOVIN_API_KEY = 'YOUR API KEY HERE'
|
5
|
+
|
6
|
+
S3_INPUT_ID = 'The ID of the Input'
|
7
|
+
S3_OUTPUT_ID = 'The ID of the Output'
|
8
|
+
OUTPUT_PATH = "/encoding_test/bitmovin-ruby/#{Time.now.strftime('%v-%H-%M')}/"
|
9
|
+
INPUT_FILE_PATH = 'your_input_file_name'
|
10
|
+
|
11
|
+
Bitmovin.init(BITMOVIN_API_KEY)
|
12
|
+
|
13
|
+
# This will create a Input Bucket you can reuse in future encodings
|
14
|
+
# To get a list of all your S3Inputs do:
|
15
|
+
# Bitmovin::Encoding::Inputs::S3Input.list
|
16
|
+
s3_input = Bitmovin::Encoding::Inputs::S3Input.find(S3_INPUT_ID)
|
17
|
+
|
18
|
+
# This will create a Output Bucket you can reuse in future encodings
|
19
|
+
# To get a list of all your Output do:
|
20
|
+
# Bitmovin::Encoding::Outputs::S3Output.list
|
21
|
+
s3_output = Bitmovin::Encoding::Outputs::S3Output.find(S3_OUTPUT_ID)
|
22
|
+
|
23
|
+
# Please note inputs/outputs are not individual files but rather the
|
24
|
+
# Bucket you are reading/writing files to and they can be reused between encodings.
|
25
|
+
|
26
|
+
|
27
|
+
# This hash contains the H264 Codec Configurations we want to create
|
28
|
+
# Codec Configurations are similar to Inputs/Outputs in that they are configured once
|
29
|
+
# and can be reused for future encodings.
|
30
|
+
video_configs = [
|
31
|
+
{name: 'h264_360p_600', profile: 'HIGH', height: 360, bitrate: 600000},
|
32
|
+
{name: 'h264_432p_700', profile: 'HIGH', height: 432, bitrate: 700000},
|
33
|
+
{name: 'h264_576p_1050', profile: 'HIGH', height: 576, bitrate: 1050000},
|
34
|
+
{name: 'h264_720p_1380', profile: 'HIGH', height: 720, bitrate: 1380000},
|
35
|
+
{name: 'h264_720p_1800', profile: 'HIGH', height: 720, bitrate: 1800000},
|
36
|
+
{name: 'h264_1080p_2150', profile: 'HIGH', height: 1080, bitrate: 2150000},
|
37
|
+
{name: 'h264_1080p_2900', profile: 'HIGH', height: 1080, bitrate: 2900000},
|
38
|
+
{name: 'h264_2160p_4000', profile: 'HIGH', height: 2160, bitrate: 4000000},
|
39
|
+
{name: 'h264_2160p_6000', profile: 'HIGH', height: 2160, bitrate: 6000000},
|
40
|
+
{name: 'h264_2160p_8500', profile: 'HIGH', height: 2160, bitrate: 8500000},
|
41
|
+
{name: 'h264_2160p_10000', profile: 'HIGH', height: 2160, bitrate: 10000000},
|
42
|
+
|
43
|
+
{name: 'h265_360p_420', profile: 'main', height: 360, bitrate: 420000},
|
44
|
+
{name: 'h265_432p_490', profile: 'main', height: 432, bitrate: 490000},
|
45
|
+
{name: 'h265_576p_735', profile: 'main', height: 576, bitrate: 735000},
|
46
|
+
{name: 'h265_720p_966', profile: 'main', height: 720, bitrate: 966000},
|
47
|
+
{name: 'h265_720p_1260', profile: 'main', height: 720, bitrate: 1260000},
|
48
|
+
{name: 'h265_1080p_1505', profile: 'main', height: 1080, bitrate: 1505000},
|
49
|
+
{name: 'h265_1080p_2030', profile: 'main', height: 1080, bitrate: 2030000},
|
50
|
+
{name: 'h265_2160p_2800', profile: 'main', height: 2160, bitrate: 2800000},
|
51
|
+
{name: 'h265_2160p_4200', profile: 'main', height: 2160, bitrate: 4200000},
|
52
|
+
{name: 'h265_2160p_5950', profile: 'main', height: 2160, bitrate: 5950000},
|
53
|
+
{name: 'h265_2160p_7000', profile: 'main', height: 2160, bitrate: 7000000}
|
54
|
+
]
|
55
|
+
|
56
|
+
# The actual instance of the encoding task you are about to start
|
57
|
+
enc = Bitmovin::Encoding::Encodings::EncodingTask.new({
|
58
|
+
name: 'VOD h264/h265 Encoding HLS'
|
59
|
+
})
|
60
|
+
enc.save!
|
61
|
+
|
62
|
+
# Create or load the Audio Config
|
63
|
+
#audio_config = Bitmovin::Encoding::CodecConfigurations::AacConfiguration.find("<EXISTING_AAC_CONFIG_ID>")
|
64
|
+
audio_config = Bitmovin::Encoding::CodecConfigurations::AacConfiguration.new({
|
65
|
+
name: 'AAC_PROFILE_128k',
|
66
|
+
bitrate: 128000,
|
67
|
+
rate: 48000
|
68
|
+
})
|
69
|
+
audio_config.save!
|
70
|
+
|
71
|
+
# Adding Audio Stream to Encoding
|
72
|
+
audio_stream = enc.streams.build(name: 'audio stream')
|
73
|
+
audio_stream.codec_configuration = audio_config
|
74
|
+
audio_stream.build_input_stream(input_path: INPUT_FILE_PATH, input_id: s3_input.id, selection_mode: 'AUTO')
|
75
|
+
audio_stream.conditions = {
|
76
|
+
type: 'CONDITION',
|
77
|
+
attribute: 'INPUTSTREAM',
|
78
|
+
operator: '==',
|
79
|
+
value: 'TRUE'
|
80
|
+
}
|
81
|
+
puts audio_stream.conditions.to_json
|
82
|
+
audio_stream.save!
|
83
|
+
|
84
|
+
# Audio Muxing
|
85
|
+
audio_muxing = enc.muxings.fmp4.build(name: 'audio-muxing', segment_length: 4)
|
86
|
+
audio_muxing.build_output({
|
87
|
+
output_id: s3_output.id,
|
88
|
+
output_path: File.join(OUTPUT_PATH, 'audio/aac')
|
89
|
+
})
|
90
|
+
audio_muxing.build_output({
|
91
|
+
output_id: s3_output.id,
|
92
|
+
output_path: File.join(OUTPUT_PATH, 'audio/aac'),
|
93
|
+
acl: [{
|
94
|
+
permission: 'PUBLIC_READ'
|
95
|
+
}]
|
96
|
+
})
|
97
|
+
audio_muxing.streams << audio_stream.id
|
98
|
+
audio_muxing.save!
|
99
|
+
|
100
|
+
# Let's also start the Manifest generation
|
101
|
+
# Multi Codec HLS Manifest
|
102
|
+
multi_hls_manifest = Bitmovin::Encoding::Manifests::HlsManifest.new({
|
103
|
+
name: 'Multi Codec HLS manifest',
|
104
|
+
description: 'Multi Codec HLS manifest',
|
105
|
+
manifest_name: 'multi_playlist.m3u8'
|
106
|
+
})
|
107
|
+
|
108
|
+
multi_hls_manifest.outputs << Bitmovin::Encoding::StreamOutput.new({
|
109
|
+
output_id: s3_output.id,
|
110
|
+
output_path: OUTPUT_PATH
|
111
|
+
})
|
112
|
+
multi_hls_manifest.save!
|
113
|
+
|
114
|
+
multi_hls_manifest.build_audio_medium({
|
115
|
+
name: 'HLS Audio Media',
|
116
|
+
group_id: 'audio_group',
|
117
|
+
segment_path: 'audio/aac',
|
118
|
+
encoding_id: enc.id,
|
119
|
+
stream_id: audio_stream.id,
|
120
|
+
muxing_id: audio_muxing.id,
|
121
|
+
language: 'en',
|
122
|
+
uri: 'audio_media.m3u8'
|
123
|
+
}).save!
|
124
|
+
|
125
|
+
# H264 HLS Manifest
|
126
|
+
h264_hls_manifest = Bitmovin::Encoding::Manifests::HlsManifest.new({
|
127
|
+
name: 'H264 HLS manifest',
|
128
|
+
description: 'Multi Codec HLS manifest',
|
129
|
+
manifest_name: 'h264_playlist.m3u8'
|
130
|
+
})
|
131
|
+
|
132
|
+
h264_hls_manifest.outputs << Bitmovin::Encoding::StreamOutput.new({
|
133
|
+
output_id: s3_output.id,
|
134
|
+
output_path: OUTPUT_PATH
|
135
|
+
})
|
136
|
+
h264_hls_manifest.save!
|
137
|
+
|
138
|
+
h264_hls_manifest.build_audio_medium({
|
139
|
+
name: 'HLS Audio Media',
|
140
|
+
group_id: 'audio_group',
|
141
|
+
segment_path: 'audio/aac',
|
142
|
+
encoding_id: enc.id,
|
143
|
+
stream_id: audio_stream.id,
|
144
|
+
muxing_id: audio_muxing.id,
|
145
|
+
language: 'en',
|
146
|
+
uri: 'audio_media.m3u8'
|
147
|
+
}).save!
|
148
|
+
# H265 HLS Manifest
|
149
|
+
h265_hls_manifest = Bitmovin::Encoding::Manifests::HlsManifest.new({
|
150
|
+
name: 'H265 HLS manifest',
|
151
|
+
description: 'Multi Codec HLS manifest',
|
152
|
+
manifest_name: 'h265_playlist.m3u8'
|
153
|
+
})
|
154
|
+
|
155
|
+
h265_hls_manifest.outputs << Bitmovin::Encoding::StreamOutput.new({
|
156
|
+
output_id: s3_output.id,
|
157
|
+
output_path: OUTPUT_PATH
|
158
|
+
})
|
159
|
+
h265_hls_manifest.save!
|
160
|
+
|
161
|
+
h265_hls_manifest.build_audio_medium({
|
162
|
+
name: 'HLS Audio Media',
|
163
|
+
group_id: 'audio_group',
|
164
|
+
segment_path: 'audio/aac',
|
165
|
+
encoding_id: enc.id,
|
166
|
+
stream_id: audio_stream.id,
|
167
|
+
muxing_id: audio_muxing.id,
|
168
|
+
language: 'en',
|
169
|
+
uri: 'audio_media.m3u8'
|
170
|
+
}).save!
|
171
|
+
|
172
|
+
hls_manifests = [multi_hls_manifest, h264_hls_manifest, h265_hls_manifest]
|
173
|
+
|
174
|
+
# H264 DASH Manifest
|
175
|
+
h264_dash_manifest = Bitmovin::Encoding::Manifests::DashManifest.new({
|
176
|
+
name: 'H264 DASH Manifest',
|
177
|
+
description: 'H264 DASH Manifest',
|
178
|
+
manifest_name: 'h264_manifest.mpd'
|
179
|
+
})
|
180
|
+
|
181
|
+
h264_dash_manifest.outputs << Bitmovin::Encoding::StreamOutput.new({
|
182
|
+
output_id: s3_output.id,
|
183
|
+
output_path: OUTPUT_PATH
|
184
|
+
})
|
185
|
+
h264_dash_manifest.save!
|
186
|
+
|
187
|
+
h264_period = Bitmovin::Encoding::Manifests::Period.new(
|
188
|
+
h264_dash_manifest.id
|
189
|
+
)
|
190
|
+
h264_period.save!
|
191
|
+
|
192
|
+
h264_video_adaptation_set = Bitmovin::Encoding::Manifests::VideoAdaptationSet.new(
|
193
|
+
h264_dash_manifest.id,
|
194
|
+
h264_period.id
|
195
|
+
)
|
196
|
+
h264_video_adaptation_set.save!
|
197
|
+
|
198
|
+
# Adding Audio Stream to H264 DASH Manifest
|
199
|
+
audio_adaptation_set = Bitmovin::Encoding::Manifests::AudioAdaptationSet.new(
|
200
|
+
h264_dash_manifest.id,
|
201
|
+
h264_period.id
|
202
|
+
)
|
203
|
+
audio_adaptation_set.save!
|
204
|
+
|
205
|
+
audio_adaptation_set.build_fmp4_representation({
|
206
|
+
encoding_id: enc.id,
|
207
|
+
muxing_id: audio_muxing.id,
|
208
|
+
segment_path: 'audio/aac',
|
209
|
+
type: 'TEMPLATE',
|
210
|
+
name: 'Audio Adaptation Set'
|
211
|
+
|
212
|
+
}).save!
|
213
|
+
|
214
|
+
# H265 DASH Manifest
|
215
|
+
h265_dash_manifest = Bitmovin::Encoding::Manifests::DashManifest.new({
|
216
|
+
name: 'H265 DASH Manifest',
|
217
|
+
description: 'H265 DASH Manifest',
|
218
|
+
manifest_name: 'h265_manifest.mpd'
|
219
|
+
})
|
220
|
+
|
221
|
+
h265_dash_manifest.outputs << Bitmovin::Encoding::StreamOutput.new({
|
222
|
+
output_id: s3_output.id,
|
223
|
+
output_path: OUTPUT_PATH
|
224
|
+
})
|
225
|
+
h265_dash_manifest.save!
|
226
|
+
|
227
|
+
h265_period = Bitmovin::Encoding::Manifests::Period.new(
|
228
|
+
h265_dash_manifest.id
|
229
|
+
)
|
230
|
+
h265_period.save!
|
231
|
+
|
232
|
+
h265_video_adaptation_set = Bitmovin::Encoding::Manifests::VideoAdaptationSet.new(
|
233
|
+
h265_dash_manifest.id,
|
234
|
+
h265_period.id
|
235
|
+
)
|
236
|
+
h265_video_adaptation_set.save!
|
237
|
+
|
238
|
+
# Adding Audio Stream to H265 DASH Manifest
|
239
|
+
audio_adaptation_set = Bitmovin::Encoding::Manifests::AudioAdaptationSet.new(
|
240
|
+
h265_dash_manifest.id,
|
241
|
+
h265_period.id
|
242
|
+
)
|
243
|
+
audio_adaptation_set.save!
|
244
|
+
|
245
|
+
audio_adaptation_set.build_fmp4_representation({
|
246
|
+
encoding_id: enc.id,
|
247
|
+
muxing_id: audio_muxing.id,
|
248
|
+
segment_path: 'audio/aac',
|
249
|
+
type: 'TEMPLATE',
|
250
|
+
name: 'Audio Adaptation Set'
|
251
|
+
|
252
|
+
}).save!
|
253
|
+
|
254
|
+
# Multi Codec DASH manifest
|
255
|
+
multi_codec_dash_manifest = Bitmovin::Encoding::Manifests::DashManifest.new({
|
256
|
+
name: 'MULTI CODEC DASH Manifest',
|
257
|
+
description: 'MULTI CODEC DASH Manifest',
|
258
|
+
manifest_name: 'multi_codec_manifest.mpd'
|
259
|
+
})
|
260
|
+
|
261
|
+
multi_codec_dash_manifest.outputs << Bitmovin::Encoding::StreamOutput.new({
|
262
|
+
output_id: s3_output.id,
|
263
|
+
output_path: OUTPUT_PATH
|
264
|
+
})
|
265
|
+
multi_codec_dash_manifest.save!
|
266
|
+
|
267
|
+
multi_codec_period = Bitmovin::Encoding::Manifests::Period.new(
|
268
|
+
multi_codec_dash_manifest.id
|
269
|
+
).save!
|
270
|
+
|
271
|
+
multi_h265_adaptation_set = Bitmovin::Encoding::Manifests::VideoAdaptationSet.new(
|
272
|
+
multi_codec_dash_manifest.id,
|
273
|
+
multi_codec_period.id
|
274
|
+
).save!
|
275
|
+
|
276
|
+
multi_h264_adaptation_set = Bitmovin::Encoding::Manifests::VideoAdaptationSet.new(
|
277
|
+
multi_codec_dash_manifest.id,
|
278
|
+
multi_codec_period.id
|
279
|
+
).save!
|
280
|
+
|
281
|
+
# Adding Audio Stream to Multi Codec DASH Manifest
|
282
|
+
audio_adaptation_set = Bitmovin::Encoding::Manifests::AudioAdaptationSet.new(
|
283
|
+
multi_codec_dash_manifest.id,
|
284
|
+
multi_codec_period.id
|
285
|
+
).save!
|
286
|
+
|
287
|
+
audio_adaptation_set.build_fmp4_representation({
|
288
|
+
encoding_id: enc.id,
|
289
|
+
muxing_id: audio_muxing.id,
|
290
|
+
segment_path: 'audio/aac',
|
291
|
+
type: 'TEMPLATE',
|
292
|
+
name: 'Audio Adaptation Set'
|
293
|
+
|
294
|
+
}).save!
|
295
|
+
|
296
|
+
dash_manifests = [multi_codec_dash_manifest, h264_dash_manifest, h265_dash_manifest]
|
297
|
+
|
298
|
+
def create_mp4(streams, name, enc, s3_output)
|
299
|
+
mp4_muxing = enc.muxings.mp4.build(name: "MP4 #{name} muxing", filename: "#{name}.mp4")
|
300
|
+
mp4_muxing.streams << streams.map {|stream| stream.id}
|
301
|
+
mp4_muxing.streams.flatten!
|
302
|
+
mp4_muxing.build_output({
|
303
|
+
output_id: s3_output.id,
|
304
|
+
output_path: File.join(OUTPUT_PATH, name),
|
305
|
+
acl: [{
|
306
|
+
permission: 'PUBLIC_READ'
|
307
|
+
}]
|
308
|
+
})
|
309
|
+
|
310
|
+
mp4_muxing.save!
|
311
|
+
puts "Added MP4 muxing #{mp4_muxing.name}"
|
312
|
+
end
|
313
|
+
|
314
|
+
# Adding Video Streams to Encoding
|
315
|
+
video_configs.each do |config|
|
316
|
+
|
317
|
+
if config[:name].start_with?('h264')
|
318
|
+
video_config_type = 'H264'
|
319
|
+
elsif config[:name].start_with?('h265')
|
320
|
+
video_config_type = 'H265'
|
321
|
+
else
|
322
|
+
video_config_type = 'NONE'
|
323
|
+
end
|
324
|
+
|
325
|
+
if video_config_type == 'H264'
|
326
|
+
codec_config = Bitmovin::Encoding::CodecConfigurations::H264Configuration.new(config).save!
|
327
|
+
config = OpenStruct.new(config)
|
328
|
+
|
329
|
+
str = enc.streams.build(name: codec_config.name)
|
330
|
+
str.codec_configuration = codec_config
|
331
|
+
str.build_input_stream(input_path: INPUT_FILE_PATH, input_id: s3_input.id, selection_mode: 'AUTO')
|
332
|
+
str.conditions = {
|
333
|
+
type: 'CONDITION',
|
334
|
+
attribute: 'HEIGHT',
|
335
|
+
operator: '>=',
|
336
|
+
value: codec_config.height
|
337
|
+
}
|
338
|
+
str.save!
|
339
|
+
|
340
|
+
create_mp4([str, audio_stream], codec_config.name, enc, s3_output)
|
341
|
+
|
342
|
+
fmp4_muxing = enc.muxings.fmp4.build(name: "#{codec_config.name} muxing", segment_length: 4)
|
343
|
+
fmp4_muxing.streams << str.id
|
344
|
+
fmp4_muxing.build_output({
|
345
|
+
output_id: s3_output.id,
|
346
|
+
output_path: File.join(OUTPUT_PATH, config.name),
|
347
|
+
acl: [{
|
348
|
+
permission: 'PUBLIC_READ'
|
349
|
+
}]
|
350
|
+
})
|
351
|
+
fmp4_muxing.save!
|
352
|
+
puts "Added FMP4 muxing #{fmp4_muxing.name}"
|
353
|
+
|
354
|
+
h264_video_adaptation_set.build_fmp4_representation(
|
355
|
+
encoding_id: enc.id,
|
356
|
+
muxing_id: fmp4_muxing.id,
|
357
|
+
type: 'TEMPLATE',
|
358
|
+
segment_path: config.name
|
359
|
+
).save!
|
360
|
+
puts "Added muxing #{fmp4_muxing.name} to #{video_config_type} only DASH manifest"
|
361
|
+
|
362
|
+
multi_h264_adaptation_set.build_fmp4_representation(
|
363
|
+
encoding_id: enc.id,
|
364
|
+
muxing_id: fmp4_muxing.id,
|
365
|
+
type: 'TEMPLATE',
|
366
|
+
segment_path: config.name
|
367
|
+
).save!
|
368
|
+
puts "Added muxing #{fmp4_muxing.name} to multi codec DASH manifest"
|
369
|
+
|
370
|
+
h264_hls_manifest.build_stream({
|
371
|
+
audio: 'audio_group',
|
372
|
+
closed_captions: 'NONE',
|
373
|
+
segmentPath: config.name,
|
374
|
+
encoding_id: enc.id,
|
375
|
+
muxing_id: fmp4_muxing.id,
|
376
|
+
stream_id: str.id,
|
377
|
+
uri: config.name + '.m3u8'
|
378
|
+
}).save!
|
379
|
+
|
380
|
+
puts "Added muxing #{fmp4_muxing.name} to #{video_config_type} HLS manifest"
|
381
|
+
else
|
382
|
+
codec_config = Bitmovin::Encoding::CodecConfigurations::H265Configuration.new(config)
|
383
|
+
codec_config.save!
|
384
|
+
config = OpenStruct.new(config)
|
385
|
+
|
386
|
+
str = enc.streams.build(name: codec_config.name)
|
387
|
+
str.codec_configuration = codec_config
|
388
|
+
str.build_input_stream(input_path: INPUT_FILE_PATH, input_id: s3_input.id, selection_mode: 'AUTO')
|
389
|
+
str.conditions = {
|
390
|
+
type: 'CONDITION',
|
391
|
+
attribute: 'HEIGHT',
|
392
|
+
operator: '>=',
|
393
|
+
value: codec_config.height
|
394
|
+
}
|
395
|
+
str.save!
|
396
|
+
|
397
|
+
create_mp4([str, audio_stream], codec_config.name, enc, s3_output)
|
398
|
+
|
399
|
+
fmp4_muxing = enc.muxings.fmp4.build(name: "#{codec_config.name} muxing", segment_length: 4)
|
400
|
+
fmp4_muxing.streams << str.id
|
401
|
+
fmp4_muxing.build_output({
|
402
|
+
output_id: s3_output.id,
|
403
|
+
output_path: File.join(OUTPUT_PATH, config.name),
|
404
|
+
acl: [{
|
405
|
+
permission: 'PUBLIC_READ'
|
406
|
+
}]
|
407
|
+
})
|
408
|
+
fmp4_muxing.save!
|
409
|
+
puts "Added FMP4 muxing #{fmp4_muxing.name}"
|
410
|
+
|
411
|
+
h265_video_adaptation_set.build_fmp4_representation(
|
412
|
+
encoding_id: enc.id,
|
413
|
+
muxing_id: fmp4_muxing.id,
|
414
|
+
type: 'TEMPLATE',
|
415
|
+
segment_path: config.name
|
416
|
+
).save!
|
417
|
+
puts "Added muxing #{fmp4_muxing.name} to #{video_config_type} only DASH manifest"
|
418
|
+
|
419
|
+
multi_h265_adaptation_set.build_fmp4_representation(
|
420
|
+
encoding_id: enc.id,
|
421
|
+
muxing_id: fmp4_muxing.id,
|
422
|
+
type: 'TEMPLATE',
|
423
|
+
segment_path: config.name
|
424
|
+
).save!
|
425
|
+
puts "Added muxing #{fmp4_muxing.name} to multi codec DASH manifest"
|
426
|
+
|
427
|
+
h265_hls_manifest.build_stream({
|
428
|
+
audio: 'audio_group',
|
429
|
+
closed_captions: 'NONE',
|
430
|
+
segmentPath: config.name,
|
431
|
+
encoding_id: enc.id,
|
432
|
+
muxing_id: fmp4_muxing.id,
|
433
|
+
stream_id: str.id,
|
434
|
+
uri: config.name + '.m3u8'
|
435
|
+
}).save!
|
436
|
+
|
437
|
+
puts "Added muxing #{fmp4_muxing.name} to #{video_config_type} HLS manifest"
|
438
|
+
end
|
439
|
+
|
440
|
+
# Add the Stream to the multi codec HLS Manifest
|
441
|
+
multi_hls_manifest.build_stream({
|
442
|
+
audio: 'audio_group',
|
443
|
+
closed_captions: 'NONE',
|
444
|
+
segmentPath: config.name,
|
445
|
+
encoding_id: enc.id,
|
446
|
+
muxing_id: fmp4_muxing.id,
|
447
|
+
stream_id: str.id,
|
448
|
+
uri: config.name + '.m3u8'
|
449
|
+
}).save!
|
450
|
+
|
451
|
+
puts "Added muxing #{fmp4_muxing.name} to multi codec HLS manifest"
|
452
|
+
end
|
453
|
+
|
454
|
+
# Starting an encoding and monitoring it's status
|
455
|
+
enc.start!
|
456
|
+
|
457
|
+
while enc.status != 'FINISHED' && enc.status != 'ERROR'
|
458
|
+
puts "Encoding Status is #{enc.status}"
|
459
|
+
progress = enc.progress
|
460
|
+
if progress > 0
|
461
|
+
puts "Progress: #{enc.progress} %"
|
462
|
+
end
|
463
|
+
sleep 2
|
464
|
+
end
|
465
|
+
puts "Encoding finished with status #{enc.status}!"
|
466
|
+
|
467
|
+
# Now that the encoding is finished we can start writing the m3u8 Manifest
|
468
|
+
hls_manifests.each do |hls_manifest|
|
469
|
+
|
470
|
+
hls_manifest.start!
|
471
|
+
|
472
|
+
while hls_manifest.status != 'FINISHED' && hls_manifest.status != 'ERROR'
|
473
|
+
puts "HLS Manifest status is #{hls_manifest.status}"
|
474
|
+
progress = hls_manifest.progress
|
475
|
+
if progress > 0
|
476
|
+
puts "Progress: #{hls_manifest.progress} %"
|
477
|
+
end
|
478
|
+
sleep 2
|
479
|
+
end
|
480
|
+
|
481
|
+
puts "HLS Manifest generation #{hls_manifest.name} finished with status #{hls_manifest.status}"
|
482
|
+
|
483
|
+
end
|
484
|
+
|
485
|
+
# Begin DASH manifests generation
|
486
|
+
dash_manifests.each do |dash_manifest|
|
487
|
+
|
488
|
+
dash_manifest.start!
|
489
|
+
|
490
|
+
while dash_manifest.status != 'FINISHED' && dash_manifest.status != 'ERROR'
|
491
|
+
puts "DASH manifest generation status is #{dash_manifest.status}"
|
492
|
+
progress = dash_manifest.progress
|
493
|
+
if progress > 0
|
494
|
+
puts "Progress: #{dash_manifest.progress}"
|
495
|
+
end
|
496
|
+
sleep 2
|
497
|
+
end
|
498
|
+
|
499
|
+
puts "DASH Manifest generation #{dash_manifest.name} finished with status #{dash_manifest.status}"
|
500
|
+
end
|
501
|
+
|
502
|
+
puts 'All Manifests generated!'
|