From b6ea0f94bd4254d4d8f7ca3c98ca0e0346b070eb Mon Sep 17 00:00:00 2001 From: Gernot Zwantschko Date: Mon, 13 Aug 2018 14:14:29 +0200 Subject: [PATCH 1/7] Updated generic S3 Input/Output properties (added ssl, s3signatureVersion support) --- .../api/encoding/S3SignatureVersion.java | 10 +++++++ .../api/encoding/inputs/GenericS3Input.java | 29 +++++++++++++++++++ .../api/encoding/outputs/GenericS3Output.java | 29 +++++++++++++++++++ 3 files changed, 68 insertions(+) create mode 100644 src/main/java/com/bitmovin/api/encoding/S3SignatureVersion.java diff --git a/src/main/java/com/bitmovin/api/encoding/S3SignatureVersion.java b/src/main/java/com/bitmovin/api/encoding/S3SignatureVersion.java new file mode 100644 index 0000000..8c6ab8e --- /dev/null +++ b/src/main/java/com/bitmovin/api/encoding/S3SignatureVersion.java @@ -0,0 +1,10 @@ +package com.bitmovin.api.encoding; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +@JsonIgnoreProperties(ignoreUnknown = true) +public enum S3SignatureVersion +{ + S3_V2, + S3_V4 +} diff --git a/src/main/java/com/bitmovin/api/encoding/inputs/GenericS3Input.java b/src/main/java/com/bitmovin/api/encoding/inputs/GenericS3Input.java index 89eb9a7..afc5a0e 100644 --- a/src/main/java/com/bitmovin/api/encoding/inputs/GenericS3Input.java +++ b/src/main/java/com/bitmovin/api/encoding/inputs/GenericS3Input.java @@ -1,5 +1,8 @@ package com.bitmovin.api.encoding.inputs; +import com.bitmovin.api.encoding.S3SignatureVersion; +import com.fasterxml.jackson.annotation.JsonProperty; + /** * Created by dmoser on 02.02.17. */ @@ -11,6 +14,12 @@ public class GenericS3Input extends Input private String host; private Integer port; + @JsonProperty(value = "signatureVersion") + private S3SignatureVersion signatureVersion; + + @JsonProperty(value = "ssl") + private Boolean ssl; + public GenericS3Input() { super(); @@ -66,4 +75,24 @@ public void setPort(Integer port) { this.port = port; } + + public S3SignatureVersion getSignatureVersion() + { + return this.signatureVersion; + } + + public void setSignatureVersion(S3SignatureVersion signatureVersion) + { + this.signatureVersion = signatureVersion; + } + + public Boolean getSsl() + { + return this.ssl; + } + + public void setSsl(Boolean ssl) + { + this.ssl = ssl; + } } diff --git a/src/main/java/com/bitmovin/api/encoding/outputs/GenericS3Output.java b/src/main/java/com/bitmovin/api/encoding/outputs/GenericS3Output.java index 89e9864..36857fb 100644 --- a/src/main/java/com/bitmovin/api/encoding/outputs/GenericS3Output.java +++ b/src/main/java/com/bitmovin/api/encoding/outputs/GenericS3Output.java @@ -1,5 +1,8 @@ package com.bitmovin.api.encoding.outputs; +import com.bitmovin.api.encoding.S3SignatureVersion; +import com.fasterxml.jackson.annotation.JsonProperty; + /** * Created by dmoser on 02.02.17. */ @@ -11,6 +14,12 @@ public class GenericS3Output extends Output private String host; private Integer port; + @JsonProperty(value = "signatureVersion") + private S3SignatureVersion signatureVersion; + + @JsonProperty(value = "ssl") + private Boolean ssl; + public GenericS3Output() { this.setType(OutputType.GENERIC_S3); @@ -65,4 +74,24 @@ public void setPort(Integer port) { this.port = port; } + + public S3SignatureVersion getSignatureVersion() + { + return this.signatureVersion; + } + + public void setSignatureVersion(S3SignatureVersion signatureVersion) + { + this.signatureVersion = signatureVersion; + } + + public Boolean getSsl() + { + return this.ssl; + } + + public void setSsl(Boolean ssl) + { + this.ssl = ssl; + } } From afca2e3749455181ba574008f1a8f8b9d1f2be5a Mon Sep 17 00:00:00 2001 From: Gernot Zwantschko Date: Mon, 13 Aug 2018 14:15:40 +0200 Subject: [PATCH 2/7] added example for generic S3 Input/Output encoding --- ...ithDashAndHlsAndConditionsOnGenericS3.java | 401 ++++++++++++++++++ 1 file changed, 401 insertions(+) create mode 100644 src/test/java/com/bitmovin/api/examples/CreateEncodingWithDashAndHlsAndConditionsOnGenericS3.java diff --git a/src/test/java/com/bitmovin/api/examples/CreateEncodingWithDashAndHlsAndConditionsOnGenericS3.java b/src/test/java/com/bitmovin/api/examples/CreateEncodingWithDashAndHlsAndConditionsOnGenericS3.java new file mode 100644 index 0000000..6092bf8 --- /dev/null +++ b/src/test/java/com/bitmovin/api/examples/CreateEncodingWithDashAndHlsAndConditionsOnGenericS3.java @@ -0,0 +1,401 @@ +package com.bitmovin.api.examples; + +import com.bitmovin.api.BitmovinApi; +import com.bitmovin.api.encoding.AclEntry; +import com.bitmovin.api.encoding.AclPermission; +import com.bitmovin.api.encoding.EncodingOutput; +import com.bitmovin.api.encoding.InputStream; +import com.bitmovin.api.encoding.codecConfigurations.AACAudioConfig; +import com.bitmovin.api.encoding.codecConfigurations.H264VideoConfiguration; +import com.bitmovin.api.encoding.codecConfigurations.enums.ProfileH264; +import com.bitmovin.api.encoding.encodings.Encoding; +import com.bitmovin.api.encoding.encodings.conditions.AbstractCondition; +import com.bitmovin.api.encoding.encodings.conditions.AndConjunction; +import com.bitmovin.api.encoding.encodings.conditions.Condition; +import com.bitmovin.api.encoding.encodings.conditions.ConditionAttribute; +import com.bitmovin.api.encoding.encodings.muxing.FMP4Muxing; +import com.bitmovin.api.encoding.encodings.muxing.MuxingStream; +import com.bitmovin.api.encoding.encodings.muxing.TSMuxing; +import com.bitmovin.api.encoding.encodings.streams.Stream; +import com.bitmovin.api.encoding.encodings.thumbnails.Sprite; +import com.bitmovin.api.encoding.encodings.thumbnails.Thumbnail; +import com.bitmovin.api.encoding.encodings.thumbnails.ThumbnailUnit; +import com.bitmovin.api.encoding.enums.CloudRegion; +import com.bitmovin.api.encoding.enums.DashMuxingType; +import com.bitmovin.api.encoding.enums.StreamSelectionMode; +import com.bitmovin.api.encoding.inputs.GenericS3Input; +import com.bitmovin.api.encoding.manifest.dash.*; +import com.bitmovin.api.encoding.manifest.hls.HlsManifest; +import com.bitmovin.api.encoding.manifest.hls.MediaInfo; +import com.bitmovin.api.encoding.manifest.hls.MediaInfoType; +import com.bitmovin.api.encoding.manifest.hls.StreamInfo; +import com.bitmovin.api.encoding.outputs.GenericS3Output; +import com.bitmovin.api.encoding.outputs.Output; +import com.bitmovin.api.encoding.status.Task; +import com.bitmovin.api.enums.Status; +import com.bitmovin.api.exceptions.BitmovinApiException; +import com.bitmovin.api.http.RestException; +import com.mashape.unirest.http.exceptions.UnirestException; +import org.junit.Assert; +import org.junit.Test; + +import java.io.IOException; +import java.net.URISyntaxException; +import java.util.*; + +public class CreateEncodingWithDashAndHlsAndConditionsOnGenericS3 +{ + private static String API_KEY = ""; + + private static CloudRegion CLOUD_REGION = CloudRegion.AWS_EU_WEST_1; + + private static String GENERIC_S3_INPUT_HOST = ""; + private static String GENERIC_S3_INPUT_ACCESSKEY = ""; + private static String GENERIC_S3_INPUT_SECRET_KEY = ""; + private static String GENERIC_S3_INPUT_BUCKET_NAME = "BUCKET_NAME"; + private static String GENERIC_S3_INPUT_PATH = ""; + + private static String GENERIC_S3_OUTPUT_HOST = ""; + private static String GENERIC_S3_OUTPUT_ACCESSKEY = ""; + private static String GENERIC_S3_OUTPUT_SECRET_KEY = ""; + private static String GENERIC_S3_OUTPUT_BUCKET_NAME = "BUCKET_NAME"; + private static String OUTPUT_BASE_PATH = "path/to/your/outputs/" + new Date().getTime(); + + private static BitmovinApi bitmovinApi; + + @Test + public void testEncoding() throws IOException, BitmovinApiException, UnirestException, URISyntaxException, RestException, InterruptedException + { + bitmovinApi = new BitmovinApi(API_KEY); + Encoding encoding = new Encoding(); + encoding.setName("Encoding JAVA with Generic S3 Input/Output"); + encoding.setCloudRegion(CLOUD_REGION); + encoding = bitmovinApi.encoding.create(encoding); + + GenericS3Input input = new GenericS3Input(); + input.setHost(GENERIC_S3_INPUT_HOST); + input.setAccessKey(GENERIC_S3_INPUT_ACCESSKEY); + input.setSecretKey(GENERIC_S3_INPUT_SECRET_KEY); + input.setBucketName(GENERIC_S3_INPUT_BUCKET_NAME); + input = bitmovinApi.input.genericS3.create(input); + + GenericS3Output output = new GenericS3Output(); + output.setHost(GENERIC_S3_OUTPUT_HOST); + output.setAccessKey(GENERIC_S3_OUTPUT_ACCESSKEY); + output.setSecretKey(GENERIC_S3_OUTPUT_SECRET_KEY); + output.setBucketName(GENERIC_S3_OUTPUT_BUCKET_NAME); + output = bitmovinApi.output.genericS3.create(output); + + AACAudioConfig aacConfiguration = new AACAudioConfig(); + aacConfiguration.setBitrate(128000L); + aacConfiguration.setRate(48000f); + aacConfiguration = bitmovinApi.configuration.audioAAC.create(aacConfiguration); + + // Add H264 configuration for encoding + H264VideoConfiguration videoConfiguration240p = new H264VideoConfiguration(); + videoConfiguration240p.setHeight(240); + videoConfiguration240p.setBitrate(400000L); + videoConfiguration240p.setProfile(ProfileH264.HIGH); + videoConfiguration240p = bitmovinApi.configuration.videoH264.create(videoConfiguration240p); + + H264VideoConfiguration videoConfiguration360p = new H264VideoConfiguration(); + videoConfiguration360p.setHeight(360); + videoConfiguration360p.setBitrate(800000L); + videoConfiguration360p.setProfile(ProfileH264.HIGH); + videoConfiguration360p = bitmovinApi.configuration.videoH264.create(videoConfiguration360p); + + H264VideoConfiguration videoConfiguration480p = new H264VideoConfiguration(); + videoConfiguration480p.setHeight(480); + videoConfiguration480p.setBitrate(1200000L); + videoConfiguration480p.setProfile(ProfileH264.HIGH); + videoConfiguration480p = bitmovinApi.configuration.videoH264.create(videoConfiguration480p); + + H264VideoConfiguration videoConfiguration720p = new H264VideoConfiguration(); + videoConfiguration720p.setHeight(720); + videoConfiguration720p.setBitrate(2400000L); + videoConfiguration720p.setProfile(ProfileH264.HIGH); + videoConfiguration720p = bitmovinApi.configuration.videoH264.create(videoConfiguration720p); + + H264VideoConfiguration videoConfiguration1080p = new H264VideoConfiguration(); + videoConfiguration1080p.setHeight(1080); + videoConfiguration1080p.setBitrate(4800000L); + videoConfiguration1080p.setProfile(ProfileH264.HIGH); + videoConfiguration1080p = bitmovinApi.configuration.videoH264.create(videoConfiguration1080p); + + InputStream inputStreamVideo = new InputStream(); + inputStreamVideo.setInputPath(GENERIC_S3_INPUT_PATH); + inputStreamVideo.setInputId(input.getId()); + inputStreamVideo.setSelectionMode(StreamSelectionMode.VIDEO_RELATIVE); + inputStreamVideo.setPosition(0); + + InputStream inputStreamAudio = new InputStream(); + inputStreamAudio.setInputPath(GENERIC_S3_INPUT_PATH); + inputStreamAudio.setInputId(input.getId()); + inputStreamAudio.setSelectionMode(StreamSelectionMode.AUDIO_RELATIVE); + inputStreamAudio.setPosition(0); + + // Add streams and add the condition for every stream that the input height must be >= than the height for the specific representation + Stream videoStream240p = new Stream(); + videoStream240p.setCodecConfigId(videoConfiguration240p.getId()); + videoStream240p.setInputStreams(Collections.singleton(inputStreamVideo)); + AndConjunction andConjunction240 = new AndConjunction(); + andConjunction240.setConditions(new ArrayList() {{ new Condition(ConditionAttribute.HEIGHT, ">=", "240"); }}); + videoStream240p.setConditions(andConjunction240); + videoStream240p = bitmovinApi.encoding.stream.addStream(encoding, videoStream240p); + + Stream videoStream360p = new Stream(); + videoStream360p.setCodecConfigId(videoConfiguration360p.getId()); + videoStream360p.setInputStreams(Collections.singleton(inputStreamVideo)); + AndConjunction andConjunction360 = new AndConjunction(); + andConjunction360.setConditions(new ArrayList() {{ new Condition(ConditionAttribute.HEIGHT, ">=", "360"); }}); + videoStream360p.setConditions(andConjunction360); + videoStream360p = bitmovinApi.encoding.stream.addStream(encoding, videoStream360p); + + Stream videoStream480p = new Stream(); + videoStream480p.setCodecConfigId(videoConfiguration480p.getId()); + videoStream480p.setInputStreams(Collections.singleton(inputStreamVideo)); + AndConjunction andConjunction480 = new AndConjunction(); + andConjunction480.setConditions(new ArrayList() {{ new Condition(ConditionAttribute.HEIGHT, ">=", "480"); }}); + videoStream480p.setConditions(andConjunction480); + videoStream480p = bitmovinApi.encoding.stream.addStream(encoding, videoStream480p); + + Stream videoStream720p = new Stream(); + videoStream720p.setCodecConfigId(videoConfiguration720p.getId()); + videoStream720p.setInputStreams(Collections.singleton(inputStreamVideo)); + AndConjunction andConjunction720 = new AndConjunction(); + andConjunction720.setConditions(new ArrayList() {{ new Condition(ConditionAttribute.HEIGHT, ">=", "720"); }}); + videoStream720p.setConditions(andConjunction720); + videoStream720p = bitmovinApi.encoding.stream.addStream(encoding, videoStream720p); + + Stream videoStream1080p = new Stream(); + videoStream1080p.setCodecConfigId(videoConfiguration1080p.getId()); + videoStream1080p.setInputStreams(Collections.singleton(inputStreamVideo)); + AndConjunction andConjunction1080 = new AndConjunction(); + andConjunction1080.setConditions(new ArrayList() {{ new Condition(ConditionAttribute.HEIGHT, ">=", "1080"); }}); + videoStream1080p.setConditions(andConjunction1080); + videoStream1080p = bitmovinApi.encoding.stream.addStream(encoding, videoStream1080p); + + Stream audioStream = new Stream(); + audioStream.setCodecConfigId(aacConfiguration.getId()); + audioStream.setInputStreams(Collections.singleton(inputStreamAudio)); + audioStream = bitmovinApi.encoding.stream.addStream(encoding, audioStream); + + FMP4Muxing muxingFmp4_240p = this.createFMP4Muxing(encoding, output, "/video/dash/240p/", videoStream240p); + FMP4Muxing muxingFmp4_360p = this.createFMP4Muxing(encoding, output, "/video/dash/360p/", videoStream360p); + FMP4Muxing muxingFmp4_480p = this.createFMP4Muxing(encoding, output, "/video/dash/480p/", videoStream480p); + FMP4Muxing muxingFmp4_720p = this.createFMP4Muxing(encoding, output, "/video/dash/720p/", videoStream720p); + FMP4Muxing muxingFmp4_1080p = this.createFMP4Muxing(encoding, output, "/video/dash/1080p/", videoStream1080p); + FMP4Muxing muxingFmp4_Audio = this.createFMP4Muxing(encoding, output, "/audio/dash/", audioStream); + + TSMuxing muxingTS_240p = this.createTSMuxing(encoding, output, "/video/hls/240p/", videoStream240p); + TSMuxing muxingTS_360p = this.createTSMuxing(encoding, output, "/video/hls/360p/", videoStream360p); + TSMuxing muxingTS_480p = this.createTSMuxing(encoding, output, "/video/hls/480p/", videoStream480p); + TSMuxing muxingTS_720p = this.createTSMuxing(encoding, output, "/video/hls/720p/", videoStream720p); + TSMuxing muxingTS_1080p = this.createTSMuxing(encoding, output, "/video/hls/1080p/", videoStream1080p); + TSMuxing muxingTS_Audio = this.createTSMuxing(encoding, output, "/audio/hls/", audioStream); + + // Create the thumbnail at position 10%, 20% and 30% of the input file + EncodingOutput thumbnailOutput = new EncodingOutput(); + thumbnailOutput.setOutputId(output.getId()); + thumbnailOutput.setOutputPath(OUTPUT_BASE_PATH + "/thumbnails"); + thumbnailOutput.setAcl(new ArrayList() + {{ + this.add(new AclEntry(AclPermission.PUBLIC_READ)); + }}); + Thumbnail thumbnail = new Thumbnail(); + thumbnail.setHeight(360); + thumbnail.setOutputs(Collections.singleton(thumbnailOutput)); + thumbnail.setUnit(ThumbnailUnit.PERCENTS); + Set thumbnailPositions = new HashSet<>(); + thumbnailPositions.add(10.0); + thumbnailPositions.add(20.0); + thumbnailPositions.add(30.0); + thumbnail.setPositions(thumbnailPositions); + thumbnail.setPattern("thumbnail_%number%.jpg"); + bitmovinApi.encoding.thumbnail.create(encoding, videoStream240p, thumbnail); + + // Create the sprite with an image every 10 seconds + EncodingOutput spriteOutput = new EncodingOutput(); + spriteOutput.setOutputId(output.getId()); + spriteOutput.setOutputPath(OUTPUT_BASE_PATH + "/sprites"); + spriteOutput.setAcl(new ArrayList() + {{ + this.add(new AclEntry(AclPermission.PUBLIC_READ)); + }}); + Sprite sprite = new Sprite(); + sprite.setDistance(10.0); + sprite.setWidth(640); + sprite.setHeight(360); + sprite.setOutputs(Collections.singleton(spriteOutput)); + sprite.setSpriteName("sprite.jpg"); + sprite.setVttName("sprite.vtt"); + bitmovinApi.encoding.sprite.create(encoding, videoStream360p, sprite); + + + bitmovinApi.encoding.start(encoding); + + Task status = bitmovinApi.encoding.getStatus(encoding); + while (status.getStatus() != Status.FINISHED && status.getStatus() != Status.ERROR) + { + status = bitmovinApi.encoding.getStatus(encoding); + Thread.sleep(2500); + } + + System.out.println(String.format("Encoding finished with status %s", status.getStatus().toString())); + + Assert.assertEquals(Status.FINISHED, status.getStatus()); + EncodingOutput manifestOutput = new EncodingOutput(); + manifestOutput.setOutputId(output.getId()); + manifestOutput.setOutputPath(OUTPUT_BASE_PATH); + manifestOutput.setAcl(new ArrayList() + {{ + this.add(new AclEntry(AclPermission.PUBLIC_READ)); + }}); + + // Create DASH manifest + DashManifest dashManifest = new DashManifest(); + dashManifest.setName("stream.mpd"); + dashManifest.setOutputs(Collections.singletonList(manifestOutput)); + dashManifest = bitmovinApi.manifest.dash.create(dashManifest); + Period period = bitmovinApi.manifest.dash.createPeriod(dashManifest, new Period()); + VideoAdaptationSet videoAdaptationSet = bitmovinApi.manifest.dash.addVideoAdaptationSetToPeriod(dashManifest, period, new VideoAdaptationSet()); + AudioAdaptationSet audioAdaptationSet = new AudioAdaptationSet(); + audioAdaptationSet.setLang("en"); + audioAdaptationSet = bitmovinApi.manifest.dash.addAudioAdaptationSetToPeriod(dashManifest, period, audioAdaptationSet); + + this.addDashRepresentationToAdaptationSet(DashMuxingType.TEMPLATE, encoding.getId(), + audioStream.getId(), muxingFmp4_Audio.getId(), "audio/dash", dashManifest, period, audioAdaptationSet); + + this.addDashRepresentationToAdaptationSet(DashMuxingType.TEMPLATE, encoding.getId(), + videoStream240p.getId(), muxingFmp4_240p.getId(), "video/dash/240p", dashManifest, period, videoAdaptationSet); + this.addDashRepresentationToAdaptationSet(DashMuxingType.TEMPLATE, encoding.getId(), + videoStream360p.getId(), muxingFmp4_360p.getId(), "video/dash/360p", dashManifest, period, videoAdaptationSet); + this.addDashRepresentationToAdaptationSet(DashMuxingType.TEMPLATE, encoding.getId(), + videoStream480p.getId(), muxingFmp4_480p.getId(), "video/dash/480p", dashManifest, period, videoAdaptationSet); + this.addDashRepresentationToAdaptationSet(DashMuxingType.TEMPLATE, encoding.getId(), + videoStream720p.getId(), muxingFmp4_720p.getId(), "video/dash/720p", dashManifest, period, videoAdaptationSet); + this.addDashRepresentationToAdaptationSet(DashMuxingType.TEMPLATE, encoding.getId(), + videoStream1080p.getId(), muxingFmp4_1080p.getId(), "video/dash/1080p", dashManifest, period, videoAdaptationSet); + + bitmovinApi.manifest.dash.startGeneration(dashManifest); + + Status dashStatus = bitmovinApi.manifest.dash.getGenerationStatus(dashManifest); + while (dashStatus != Status.FINISHED && dashStatus != Status.ERROR) + { + dashStatus = bitmovinApi.manifest.dash.getGenerationStatus(dashManifest); + Thread.sleep(2500); + } + + System.out.println(String.format("DASH Manifest generation finished with status %s", dashStatus.toString())); + Assert.assertEquals(Status.FINISHED, dashStatus); + + // Create HLS Manifest + HlsManifest hlsManifest = new HlsManifest(); + hlsManifest.setName("stream.m3u8"); + hlsManifest.setOutputs(Collections.singletonList(manifestOutput)); + hlsManifest = bitmovinApi.manifest.hls.create(hlsManifest); + + MediaInfo audioMediaInfo = new MediaInfo(); + audioMediaInfo.setGroupId("audio"); + audioMediaInfo.setName("audio.m3u8"); + audioMediaInfo.setUri("audio.m3u8"); + audioMediaInfo.setType(MediaInfoType.AUDIO); + audioMediaInfo.setEncodingId(encoding.getId()); + audioMediaInfo.setStreamId(audioStream.getId()); + audioMediaInfo.setMuxingId(muxingTS_Audio.getId()); + audioMediaInfo.setLanguage("en"); + audioMediaInfo.setAssocLanguage("en"); + audioMediaInfo.setAutoselect(true); + audioMediaInfo.setIsDefault(true); + audioMediaInfo.setForced(false); + audioMediaInfo.addCharacteristic("public.accessibility.describes-audio"); + audioMediaInfo.setSegmentPath("audio/hls/"); + audioMediaInfo = bitmovinApi.manifest.hls.createMediaInfo(hlsManifest, audioMediaInfo); + + this.addStreamInfo("video_240.m3u8", encoding.getId(), videoStream240p.getId(), muxingTS_240p.getId(), audioMediaInfo.getGroupId(), "video/hls/240p/", hlsManifest); + this.addStreamInfo("video_360.m3u8", encoding.getId(), videoStream360p.getId(), muxingTS_360p.getId(), audioMediaInfo.getGroupId(), "video/hls/360p/", hlsManifest); + this.addStreamInfo("video_480.m3u8", encoding.getId(), videoStream480p.getId(), muxingTS_480p.getId(), audioMediaInfo.getGroupId(), "video/hls/480p/", hlsManifest); + this.addStreamInfo("video_720.m3u8", encoding.getId(), videoStream720p.getId(), muxingTS_720p.getId(), audioMediaInfo.getGroupId(), "video/hls/720p/", hlsManifest); + this.addStreamInfo("video_1080.m3u8", encoding.getId(), videoStream1080p.getId(), muxingTS_1080p.getId(), audioMediaInfo.getGroupId(), "video/hls/1080p/", hlsManifest); + + bitmovinApi.manifest.hls.startGeneration(hlsManifest); + + Status hlsStatus = bitmovinApi.manifest.hls.getGenerationStatus(hlsManifest); + while (hlsStatus != Status.FINISHED && hlsStatus != Status.ERROR) + { + hlsStatus = bitmovinApi.manifest.hls.getGenerationStatus(hlsManifest); + Thread.sleep(2500); + } + + System.out.println(String.format("HLS Manifest generation finished with status %s", hlsStatus.toString())); + Assert.assertEquals(Status.FINISHED, hlsStatus); + + } + + private void addDashRepresentationToAdaptationSet(DashMuxingType type, String encodingId, String streamId, + String muxingId, String segmentPath, DashManifest manifest, + Period period, AdaptationSet adaptationSet) throws BitmovinApiException, URISyntaxException, RestException, UnirestException, IOException + { + DashFmp4Representation r = new DashFmp4Representation(); + r.setType(type); + r.setEncodingId(encodingId); + r.setStreamId(streamId); + r.setMuxingId(muxingId); + r.setSegmentPath(segmentPath); + bitmovinApi.manifest.dash.addRepresentationToAdaptationSet(manifest, period, adaptationSet, r); + } + + private void addStreamInfo(String uri, String encodingId, String streamId, String muxingId, String audioGroupId, String segmentPath, HlsManifest manifest) + throws URISyntaxException, BitmovinApiException, RestException, UnirestException, IOException + { + StreamInfo s = new StreamInfo(); + s.setUri(uri); + s.setEncodingId(encodingId); + s.setStreamId(streamId); + s.setMuxingId(muxingId); + s.setAudio(audioGroupId); + s.setSegmentPath(segmentPath); + bitmovinApi.manifest.hls.createStreamInfo(manifest, s); + } + + private FMP4Muxing createFMP4Muxing(Encoding encoding, Output output, String path, Stream videoStream) throws BitmovinApiException, IOException, RestException, URISyntaxException, UnirestException + { + EncodingOutput encodingOutput = new EncodingOutput(); + encodingOutput.setOutputId(output.getId()); + encodingOutput.setOutputPath(OUTPUT_BASE_PATH + path); + encodingOutput.setAcl(new ArrayList() + {{ + this.add(new AclEntry(AclPermission.PUBLIC_READ)); + }}); + FMP4Muxing fmp4Muxing = new FMP4Muxing(); + fmp4Muxing.setSegmentLength(4.0); + fmp4Muxing.setOutputs(Collections.singletonList(encodingOutput)); + List muxingStreams = new ArrayList<>(); + MuxingStream muxingStreamVideo = new MuxingStream(); + muxingStreamVideo.setStreamId(videoStream.getId()); + muxingStreams.add(muxingStreamVideo); + fmp4Muxing.setStreams(muxingStreams); + return bitmovinApi.encoding.muxing.addFmp4MuxingToEncoding(encoding, fmp4Muxing); + } + + private TSMuxing createTSMuxing(Encoding encoding, Output output, String path, Stream videoStream) throws BitmovinApiException, IOException, RestException, URISyntaxException, UnirestException + { + EncodingOutput encodingOutput = new EncodingOutput(); + encodingOutput.setOutputId(output.getId()); + encodingOutput.setOutputPath(OUTPUT_BASE_PATH + path); + encodingOutput.setAcl(new ArrayList() + {{ + this.add(new AclEntry(AclPermission.PUBLIC_READ)); + }}); + TSMuxing tsMuxing = new TSMuxing(); + tsMuxing.setSegmentLength(4.0); + tsMuxing.setOutputs(Collections.singletonList(encodingOutput)); + List muxingStreams = new ArrayList<>(); + MuxingStream muxingStreamVideo = new MuxingStream(); + muxingStreamVideo.setStreamId(videoStream.getId()); + muxingStreams.add(muxingStreamVideo); + tsMuxing.setStreams(muxingStreams); + return bitmovinApi.encoding.muxing.addTSMuxingToEncoding(encoding, tsMuxing); + } + +} From 1ad625e3414e0aa5acf7e478bd726438f1f95463 Mon Sep 17 00:00:00 2001 From: Gernot Zwantschko Date: Mon, 13 Aug 2018 14:24:44 +0200 Subject: [PATCH 3/7] added "signature version" settings to generic s3 example --- ...teEncodingWithDashAndHlsAndConditionsOnGenericS3.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/test/java/com/bitmovin/api/examples/CreateEncodingWithDashAndHlsAndConditionsOnGenericS3.java b/src/test/java/com/bitmovin/api/examples/CreateEncodingWithDashAndHlsAndConditionsOnGenericS3.java index 6092bf8..6a9c194 100644 --- a/src/test/java/com/bitmovin/api/examples/CreateEncodingWithDashAndHlsAndConditionsOnGenericS3.java +++ b/src/test/java/com/bitmovin/api/examples/CreateEncodingWithDashAndHlsAndConditionsOnGenericS3.java @@ -1,10 +1,7 @@ package com.bitmovin.api.examples; import com.bitmovin.api.BitmovinApi; -import com.bitmovin.api.encoding.AclEntry; -import com.bitmovin.api.encoding.AclPermission; -import com.bitmovin.api.encoding.EncodingOutput; -import com.bitmovin.api.encoding.InputStream; +import com.bitmovin.api.encoding.*; import com.bitmovin.api.encoding.codecConfigurations.AACAudioConfig; import com.bitmovin.api.encoding.codecConfigurations.H264VideoConfiguration; import com.bitmovin.api.encoding.codecConfigurations.enums.ProfileH264; @@ -54,12 +51,14 @@ public class CreateEncodingWithDashAndHlsAndConditionsOnGenericS3 private static String GENERIC_S3_INPUT_SECRET_KEY = ""; private static String GENERIC_S3_INPUT_BUCKET_NAME = "BUCKET_NAME"; private static String GENERIC_S3_INPUT_PATH = ""; + private static S3SignatureVersion GENERIC_S3_INPUT_SIGNATURE_VERSION = S3SignatureVersion.S3_V2; //optional private static String GENERIC_S3_OUTPUT_HOST = ""; private static String GENERIC_S3_OUTPUT_ACCESSKEY = ""; private static String GENERIC_S3_OUTPUT_SECRET_KEY = ""; private static String GENERIC_S3_OUTPUT_BUCKET_NAME = "BUCKET_NAME"; private static String OUTPUT_BASE_PATH = "path/to/your/outputs/" + new Date().getTime(); + private static S3SignatureVersion GENERIC_S3_OUTPUT_SIGNATURE_VERSION = S3SignatureVersion.S3_V2; //optional private static BitmovinApi bitmovinApi; @@ -77,6 +76,7 @@ public void testEncoding() throws IOException, BitmovinApiException, UnirestExce input.setAccessKey(GENERIC_S3_INPUT_ACCESSKEY); input.setSecretKey(GENERIC_S3_INPUT_SECRET_KEY); input.setBucketName(GENERIC_S3_INPUT_BUCKET_NAME); + input.setSignatureVersion(GENERIC_S3_INPUT_SIGNATURE_VERSION); input = bitmovinApi.input.genericS3.create(input); GenericS3Output output = new GenericS3Output(); @@ -84,6 +84,7 @@ public void testEncoding() throws IOException, BitmovinApiException, UnirestExce output.setAccessKey(GENERIC_S3_OUTPUT_ACCESSKEY); output.setSecretKey(GENERIC_S3_OUTPUT_SECRET_KEY); output.setBucketName(GENERIC_S3_OUTPUT_BUCKET_NAME); + output.setSignatureVersion(GENERIC_S3_OUTPUT_SIGNATURE_VERSION); output = bitmovinApi.output.genericS3.create(output); AACAudioConfig aacConfiguration = new AACAudioConfig(); From ec7229eefe97d6e92d2e46c2023fb06bb77d5e70 Mon Sep 17 00:00:00 2001 From: Gernot Zwantschko Date: Mon, 13 Aug 2018 14:27:13 +0200 Subject: [PATCH 4/7] added "ssl" settings to generic s3 example --- ...ateEncodingWithDashAndHlsAndConditionsOnGenericS3.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/test/java/com/bitmovin/api/examples/CreateEncodingWithDashAndHlsAndConditionsOnGenericS3.java b/src/test/java/com/bitmovin/api/examples/CreateEncodingWithDashAndHlsAndConditionsOnGenericS3.java index 6a9c194..7e3d8c8 100644 --- a/src/test/java/com/bitmovin/api/examples/CreateEncodingWithDashAndHlsAndConditionsOnGenericS3.java +++ b/src/test/java/com/bitmovin/api/examples/CreateEncodingWithDashAndHlsAndConditionsOnGenericS3.java @@ -51,14 +51,16 @@ public class CreateEncodingWithDashAndHlsAndConditionsOnGenericS3 private static String GENERIC_S3_INPUT_SECRET_KEY = ""; private static String GENERIC_S3_INPUT_BUCKET_NAME = "BUCKET_NAME"; private static String GENERIC_S3_INPUT_PATH = ""; - private static S3SignatureVersion GENERIC_S3_INPUT_SIGNATURE_VERSION = S3SignatureVersion.S3_V2; //optional + private static S3SignatureVersion GENERIC_S3_INPUT_SIGNATURE_VERSION = S3SignatureVersion.S3_V2; + private static boolean GENERIC_S3_INPUT_SSL = false; private static String GENERIC_S3_OUTPUT_HOST = ""; private static String GENERIC_S3_OUTPUT_ACCESSKEY = ""; private static String GENERIC_S3_OUTPUT_SECRET_KEY = ""; private static String GENERIC_S3_OUTPUT_BUCKET_NAME = "BUCKET_NAME"; private static String OUTPUT_BASE_PATH = "path/to/your/outputs/" + new Date().getTime(); - private static S3SignatureVersion GENERIC_S3_OUTPUT_SIGNATURE_VERSION = S3SignatureVersion.S3_V2; //optional + private static S3SignatureVersion GENERIC_S3_OUTPUT_SIGNATURE_VERSION = S3SignatureVersion.S3_V2; + private static boolean GENERIC_S3_OUTPUT_SSL = false; private static BitmovinApi bitmovinApi; @@ -77,6 +79,7 @@ public void testEncoding() throws IOException, BitmovinApiException, UnirestExce input.setSecretKey(GENERIC_S3_INPUT_SECRET_KEY); input.setBucketName(GENERIC_S3_INPUT_BUCKET_NAME); input.setSignatureVersion(GENERIC_S3_INPUT_SIGNATURE_VERSION); + input.setSsl(GENERIC_S3_INPUT_SSL); input = bitmovinApi.input.genericS3.create(input); GenericS3Output output = new GenericS3Output(); @@ -85,6 +88,7 @@ public void testEncoding() throws IOException, BitmovinApiException, UnirestExce output.setSecretKey(GENERIC_S3_OUTPUT_SECRET_KEY); output.setBucketName(GENERIC_S3_OUTPUT_BUCKET_NAME); output.setSignatureVersion(GENERIC_S3_OUTPUT_SIGNATURE_VERSION); + output.setSsl(GENERIC_S3_OUTPUT_SSL); output = bitmovinApi.output.genericS3.create(output); AACAudioConfig aacConfiguration = new AACAudioConfig(); From 7975dd822f931d5b5d153efccd6a71f814156882 Mon Sep 17 00:00:00 2001 From: Gernot Zwantschko Date: Mon, 13 Aug 2018 14:30:28 +0200 Subject: [PATCH 5/7] added "port" settings to generic s3 example --- .../CreateEncodingWithDashAndHlsAndConditionsOnGenericS3.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/test/java/com/bitmovin/api/examples/CreateEncodingWithDashAndHlsAndConditionsOnGenericS3.java b/src/test/java/com/bitmovin/api/examples/CreateEncodingWithDashAndHlsAndConditionsOnGenericS3.java index 7e3d8c8..8e66a84 100644 --- a/src/test/java/com/bitmovin/api/examples/CreateEncodingWithDashAndHlsAndConditionsOnGenericS3.java +++ b/src/test/java/com/bitmovin/api/examples/CreateEncodingWithDashAndHlsAndConditionsOnGenericS3.java @@ -47,6 +47,7 @@ public class CreateEncodingWithDashAndHlsAndConditionsOnGenericS3 private static CloudRegion CLOUD_REGION = CloudRegion.AWS_EU_WEST_1; private static String GENERIC_S3_INPUT_HOST = ""; + private static Integer GENERIC_S3_INPUT_PORT = 1234; private static String GENERIC_S3_INPUT_ACCESSKEY = ""; private static String GENERIC_S3_INPUT_SECRET_KEY = ""; private static String GENERIC_S3_INPUT_BUCKET_NAME = "BUCKET_NAME"; @@ -55,6 +56,7 @@ public class CreateEncodingWithDashAndHlsAndConditionsOnGenericS3 private static boolean GENERIC_S3_INPUT_SSL = false; private static String GENERIC_S3_OUTPUT_HOST = ""; + private static Integer GENERIC_S3_OUTPUT_PORT = 1234; private static String GENERIC_S3_OUTPUT_ACCESSKEY = ""; private static String GENERIC_S3_OUTPUT_SECRET_KEY = ""; private static String GENERIC_S3_OUTPUT_BUCKET_NAME = "BUCKET_NAME"; @@ -75,6 +77,7 @@ public void testEncoding() throws IOException, BitmovinApiException, UnirestExce GenericS3Input input = new GenericS3Input(); input.setHost(GENERIC_S3_INPUT_HOST); + input.setPort(GENERIC_S3_INPUT_PORT); input.setAccessKey(GENERIC_S3_INPUT_ACCESSKEY); input.setSecretKey(GENERIC_S3_INPUT_SECRET_KEY); input.setBucketName(GENERIC_S3_INPUT_BUCKET_NAME); @@ -84,6 +87,7 @@ public void testEncoding() throws IOException, BitmovinApiException, UnirestExce GenericS3Output output = new GenericS3Output(); output.setHost(GENERIC_S3_OUTPUT_HOST); + output.setPort(GENERIC_S3_OUTPUT_PORT); output.setAccessKey(GENERIC_S3_OUTPUT_ACCESSKEY); output.setSecretKey(GENERIC_S3_OUTPUT_SECRET_KEY); output.setBucketName(GENERIC_S3_OUTPUT_BUCKET_NAME); From 130f0998b0002f121da88c56f9de6b46de7417b2 Mon Sep 17 00:00:00 2001 From: Gernot Zwantschko Date: Mon, 13 Aug 2018 15:52:25 +0200 Subject: [PATCH 6/7] added "encoderVersion" settings to generic s3 example --- ...ithDashAndHlsAndConditionsOnGenericS3.java | 62 +------------------ 1 file changed, 2 insertions(+), 60 deletions(-) diff --git a/src/test/java/com/bitmovin/api/examples/CreateEncodingWithDashAndHlsAndConditionsOnGenericS3.java b/src/test/java/com/bitmovin/api/examples/CreateEncodingWithDashAndHlsAndConditionsOnGenericS3.java index 8e66a84..76fdd18 100644 --- a/src/test/java/com/bitmovin/api/examples/CreateEncodingWithDashAndHlsAndConditionsOnGenericS3.java +++ b/src/test/java/com/bitmovin/api/examples/CreateEncodingWithDashAndHlsAndConditionsOnGenericS3.java @@ -6,17 +6,10 @@ import com.bitmovin.api.encoding.codecConfigurations.H264VideoConfiguration; import com.bitmovin.api.encoding.codecConfigurations.enums.ProfileH264; import com.bitmovin.api.encoding.encodings.Encoding; -import com.bitmovin.api.encoding.encodings.conditions.AbstractCondition; -import com.bitmovin.api.encoding.encodings.conditions.AndConjunction; -import com.bitmovin.api.encoding.encodings.conditions.Condition; -import com.bitmovin.api.encoding.encodings.conditions.ConditionAttribute; import com.bitmovin.api.encoding.encodings.muxing.FMP4Muxing; import com.bitmovin.api.encoding.encodings.muxing.MuxingStream; import com.bitmovin.api.encoding.encodings.muxing.TSMuxing; import com.bitmovin.api.encoding.encodings.streams.Stream; -import com.bitmovin.api.encoding.encodings.thumbnails.Sprite; -import com.bitmovin.api.encoding.encodings.thumbnails.Thumbnail; -import com.bitmovin.api.encoding.encodings.thumbnails.ThumbnailUnit; import com.bitmovin.api.encoding.enums.CloudRegion; import com.bitmovin.api.encoding.enums.DashMuxingType; import com.bitmovin.api.encoding.enums.StreamSelectionMode; @@ -45,6 +38,7 @@ public class CreateEncodingWithDashAndHlsAndConditionsOnGenericS3 private static String API_KEY = ""; private static CloudRegion CLOUD_REGION = CloudRegion.AWS_EU_WEST_1; + private static String ENCODER_VERSION = "STABLE"; private static String GENERIC_S3_INPUT_HOST = ""; private static Integer GENERIC_S3_INPUT_PORT = 1234; @@ -73,6 +67,7 @@ public void testEncoding() throws IOException, BitmovinApiException, UnirestExce Encoding encoding = new Encoding(); encoding.setName("Encoding JAVA with Generic S3 Input/Output"); encoding.setCloudRegion(CLOUD_REGION); + encoding.setEncoderVersion(ENCODER_VERSION); encoding = bitmovinApi.encoding.create(encoding); GenericS3Input input = new GenericS3Input(); @@ -147,41 +142,26 @@ public void testEncoding() throws IOException, BitmovinApiException, UnirestExce Stream videoStream240p = new Stream(); videoStream240p.setCodecConfigId(videoConfiguration240p.getId()); videoStream240p.setInputStreams(Collections.singleton(inputStreamVideo)); - AndConjunction andConjunction240 = new AndConjunction(); - andConjunction240.setConditions(new ArrayList() {{ new Condition(ConditionAttribute.HEIGHT, ">=", "240"); }}); - videoStream240p.setConditions(andConjunction240); videoStream240p = bitmovinApi.encoding.stream.addStream(encoding, videoStream240p); Stream videoStream360p = new Stream(); videoStream360p.setCodecConfigId(videoConfiguration360p.getId()); videoStream360p.setInputStreams(Collections.singleton(inputStreamVideo)); - AndConjunction andConjunction360 = new AndConjunction(); - andConjunction360.setConditions(new ArrayList() {{ new Condition(ConditionAttribute.HEIGHT, ">=", "360"); }}); - videoStream360p.setConditions(andConjunction360); videoStream360p = bitmovinApi.encoding.stream.addStream(encoding, videoStream360p); Stream videoStream480p = new Stream(); videoStream480p.setCodecConfigId(videoConfiguration480p.getId()); videoStream480p.setInputStreams(Collections.singleton(inputStreamVideo)); - AndConjunction andConjunction480 = new AndConjunction(); - andConjunction480.setConditions(new ArrayList() {{ new Condition(ConditionAttribute.HEIGHT, ">=", "480"); }}); - videoStream480p.setConditions(andConjunction480); videoStream480p = bitmovinApi.encoding.stream.addStream(encoding, videoStream480p); Stream videoStream720p = new Stream(); videoStream720p.setCodecConfigId(videoConfiguration720p.getId()); videoStream720p.setInputStreams(Collections.singleton(inputStreamVideo)); - AndConjunction andConjunction720 = new AndConjunction(); - andConjunction720.setConditions(new ArrayList() {{ new Condition(ConditionAttribute.HEIGHT, ">=", "720"); }}); - videoStream720p.setConditions(andConjunction720); videoStream720p = bitmovinApi.encoding.stream.addStream(encoding, videoStream720p); Stream videoStream1080p = new Stream(); videoStream1080p.setCodecConfigId(videoConfiguration1080p.getId()); videoStream1080p.setInputStreams(Collections.singleton(inputStreamVideo)); - AndConjunction andConjunction1080 = new AndConjunction(); - andConjunction1080.setConditions(new ArrayList() {{ new Condition(ConditionAttribute.HEIGHT, ">=", "1080"); }}); - videoStream1080p.setConditions(andConjunction1080); videoStream1080p = bitmovinApi.encoding.stream.addStream(encoding, videoStream1080p); Stream audioStream = new Stream(); @@ -203,44 +183,6 @@ public void testEncoding() throws IOException, BitmovinApiException, UnirestExce TSMuxing muxingTS_1080p = this.createTSMuxing(encoding, output, "/video/hls/1080p/", videoStream1080p); TSMuxing muxingTS_Audio = this.createTSMuxing(encoding, output, "/audio/hls/", audioStream); - // Create the thumbnail at position 10%, 20% and 30% of the input file - EncodingOutput thumbnailOutput = new EncodingOutput(); - thumbnailOutput.setOutputId(output.getId()); - thumbnailOutput.setOutputPath(OUTPUT_BASE_PATH + "/thumbnails"); - thumbnailOutput.setAcl(new ArrayList() - {{ - this.add(new AclEntry(AclPermission.PUBLIC_READ)); - }}); - Thumbnail thumbnail = new Thumbnail(); - thumbnail.setHeight(360); - thumbnail.setOutputs(Collections.singleton(thumbnailOutput)); - thumbnail.setUnit(ThumbnailUnit.PERCENTS); - Set thumbnailPositions = new HashSet<>(); - thumbnailPositions.add(10.0); - thumbnailPositions.add(20.0); - thumbnailPositions.add(30.0); - thumbnail.setPositions(thumbnailPositions); - thumbnail.setPattern("thumbnail_%number%.jpg"); - bitmovinApi.encoding.thumbnail.create(encoding, videoStream240p, thumbnail); - - // Create the sprite with an image every 10 seconds - EncodingOutput spriteOutput = new EncodingOutput(); - spriteOutput.setOutputId(output.getId()); - spriteOutput.setOutputPath(OUTPUT_BASE_PATH + "/sprites"); - spriteOutput.setAcl(new ArrayList() - {{ - this.add(new AclEntry(AclPermission.PUBLIC_READ)); - }}); - Sprite sprite = new Sprite(); - sprite.setDistance(10.0); - sprite.setWidth(640); - sprite.setHeight(360); - sprite.setOutputs(Collections.singleton(spriteOutput)); - sprite.setSpriteName("sprite.jpg"); - sprite.setVttName("sprite.vtt"); - bitmovinApi.encoding.sprite.create(encoding, videoStream360p, sprite); - - bitmovinApi.encoding.start(encoding); Task status = bitmovinApi.encoding.getStatus(encoding); From 2da094e80c462db621b301daf4e43ab3a64bf6b5 Mon Sep 17 00:00:00 2001 From: Gernot Zwantschko Date: Mon, 13 Aug 2018 16:04:58 +0200 Subject: [PATCH 7/7] renamed generic S3 example --- ...ericS3.java => CreateEncodingWithDashAndHlsOnGenericS3.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/test/java/com/bitmovin/api/examples/{CreateEncodingWithDashAndHlsAndConditionsOnGenericS3.java => CreateEncodingWithDashAndHlsOnGenericS3.java} (99%) diff --git a/src/test/java/com/bitmovin/api/examples/CreateEncodingWithDashAndHlsAndConditionsOnGenericS3.java b/src/test/java/com/bitmovin/api/examples/CreateEncodingWithDashAndHlsOnGenericS3.java similarity index 99% rename from src/test/java/com/bitmovin/api/examples/CreateEncodingWithDashAndHlsAndConditionsOnGenericS3.java rename to src/test/java/com/bitmovin/api/examples/CreateEncodingWithDashAndHlsOnGenericS3.java index 76fdd18..2dfe187 100644 --- a/src/test/java/com/bitmovin/api/examples/CreateEncodingWithDashAndHlsAndConditionsOnGenericS3.java +++ b/src/test/java/com/bitmovin/api/examples/CreateEncodingWithDashAndHlsOnGenericS3.java @@ -33,7 +33,7 @@ import java.net.URISyntaxException; import java.util.*; -public class CreateEncodingWithDashAndHlsAndConditionsOnGenericS3 +public class CreateEncodingWithDashAndHlsOnGenericS3 { private static String API_KEY = "";