/// <summary>
        /// The encoding will be started with the per title object and the auto representations set. If the auto
        /// representation is set, stream configurations will be automatically added to the Per-Title profile. In that case
        /// at least one PER_TITLE_TEMPLATE stream configuration must be available. All other configurations will be
        /// automatically chosen by the Per-Title algorithm. All relevant settings for streams and muxings will be taken from
        /// the closest PER_TITLE_TEMPLATE stream defined. The closest stream will be chosen based on the resolution
        /// specified in the codec configuration.
        /// </summary>
        /// <param name="encoding">The reference of the encoding</param>
        private static void StartEncoding(Encoding.Encoding encoding)
        {
            var h264PerTitleConfig = new H264PerTitleConfiguration
            {
                AutoRepresentations = new AutoRepresentation()
            };

            var startEncodingRequest = new StartEncodingRequest
            {
                PerTitle     = new PerTitle(h264PerTitleConfig),
                EncodingMode = EncodingMode.THREE_PASS,
            };

            bitmovin.Encoding.Encoding.Start(encoding.Id, startEncodingRequest);

            var encodingTask = bitmovin.Encoding.Encoding.RetrieveStatus(encoding.Id);

            // Wait for the encoding to finish
            while (encodingTask.Status != Status.ERROR && encodingTask.Status != Status.FINISHED)
            {
                encodingTask = bitmovin.Encoding.Encoding.RetrieveStatus(encoding.Id);
                Console.WriteLine("Status: {0}, Progress: {1}%", encodingTask.Status, encodingTask.Progress);
                Thread.Sleep(5000);
            }

            if (encodingTask.Status != Status.FINISHED)
            {
                Console.WriteLine("Encoding could not be finished successfully.");
                return;
            }
        }
        /// <summary>
        /// Starts the actual encoding process and periodically polls its status until it reaches a final state<para />
        ///
        /// API endpoints:
        /// https://bitmovin.com/docs/encoding/api-reference/all#/Encoding/PostEncodingEncodingsStartByEncodingId
        /// <br />
        /// https://bitmovin.com/docs/encoding/api-reference/sections/encodings#/Encoding/GetEncodingEncodingsStatusByEncodingId
        /// <para />
        /// Please note that you can also use our webhooks API instead of polling the status. For more
        /// information consult the API spec:
        /// https://bitmovin.com/docs/encoding/api-reference/sections/notifications-webhooks
        /// </summary>
        /// <param name="encoding">The encoding to be started</param>
        /// <exception cref="System.SystemException"></exception>
        private async Task ExecuteEncoding(Models.Encoding encoding)
        {
            var startEncodingRequest = new StartEncodingRequest()
            {
                PerTitle = new PerTitle()
                {
                    H264Configuration = new H264PerTitleConfiguration()
                    {
                        AutoRepresentations = new AutoRepresentation()
                    }
                }
            };
            await _bitmovinApi.Encoding.Encodings.StartAsync(encoding.Id, startEncodingRequest);

            ServiceTaskStatus serviceTaskStatus;

            do
            {
                await Task.Delay(5000);

                serviceTaskStatus = await _bitmovinApi.Encoding.Encodings.StatusAsync(encoding.Id);

                Console.WriteLine($"Encoding status is {serviceTaskStatus.Status} (progress: {serviceTaskStatus.Progress} %)");
            } while (serviceTaskStatus.Status != Status.FINISHED && serviceTaskStatus.Status != Status.ERROR);

            if (serviceTaskStatus.Status == Status.ERROR)
            {
                LogTaskErrors(serviceTaskStatus);
                throw new SystemException("Encoding failed");
            }

            Console.WriteLine("Encoding finished successfully");
        }
Esempio n. 3
0
        public async Task RunExample(string[] args)
        {
            _configProvider = new ConfigProvider(args);
            _bitmovinApi    = BitmovinApi.Builder
                              .WithApiKey(_configProvider.GetBitmovinApiKey())
                              // uncomment the following line if you are working with a multi-tenant account
                              // .WithTenantOrgIdKey(_configProvider.GetBitmovinTenantOrgId())
                              .WithLogger(new ConsoleLogger())
                              .Build();

            var encoding = await CreateEncoding("Per-Title encoding", "Per-Title encoding with HLS and DASH manifest");

            var input = await CreateHttpInput(_configProvider.GetHttpInputHost());

            var output = await CreateS3Output(_configProvider.GetS3OutputBucketName(),
                                              _configProvider.GetS3OutputAccessKey(),
                                              _configProvider.GetS3OutputSecretKey());

            var inputFilePath = _configProvider.GetHttpInputFilePath();

            // Add an H.264 video stream to the encoding
            var h264VideoConfig = await CreateH264VideoConfiguration();

            var h264VideoStream = await CreateStream(encoding, input, inputFilePath, h264VideoConfig, StreamMode.PER_TITLE_TEMPLATE);

            // Add an AAC audio stream to the encoding
            var aacConfig = await CreateAacAudioConfiguration();

            var aacAudioStream = await CreateStream(encoding, input, inputFilePath, aacConfig, StreamMode.STANDARD);

            await CreateFmp4Muxing(encoding, output, "video/{height}/{bitrate}_{uuid}", h264VideoStream);
            await CreateFmp4Muxing(encoding, output, $"/audio", aacAudioStream);

            var dashManifest = await CreateDefaultDashManifest(encoding, output, "/");

            var hlsManifest = await CreateDefaultHlsManifest(encoding, output, "/");

            var startEncodingRequest = new StartEncodingRequest()
            {
                PerTitle = new PerTitle()
                {
                    H264Configuration = new H264PerTitleConfiguration()
                    {
                        AutoRepresentations = new AutoRepresentation()
                    }
                },
                ManifestGenerator = ManifestGenerator.V2,
                VodDashManifests  = new List <ManifestResource>()
                {
                    BuildManifestResource(dashManifest)
                },
                VodHlsManifests = new List <ManifestResource>()
                {
                    BuildManifestResource(hlsManifest)
                }
            };

            await ExecuteEncoding(encoding, startEncodingRequest);
        }
Esempio n. 4
0
        public async Task RunExample(string[] args)
        {
            _configProvider = new ConfigProvider(args);
            _bitmovinApi    = BitmovinApi.Builder
                              .WithApiKey(_configProvider.GetBitmovinApiKey())
                              // uncomment the following line if you are working with a multi-tenant account
                              // .WithTenantOrgIdKey(_configProvider.GetBitmovinTenantOrgId())
                              .WithLogger(new ConsoleLogger())
                              .Build();

            var encoding =
                await CreateEncoding("fMP4 muxing with CENC DRM", "Example with CENC DRM content protection");

            var input = await CreateHttpInput(_configProvider.GetHttpInputHost());

            var output = await CreateS3Output(_configProvider.GetS3OutputBucketName(),
                                              _configProvider.GetS3OutputAccessKey(),
                                              _configProvider.GetS3OutputSecretKey());

            var inputFilePath = _configProvider.GetHttpInputFilePath();

            // Add an H.264 video stream to the encoding
            var h264VideoConfig = await CreateH264VideoConfiguration();

            var h264VideoStream = await CreateStream(encoding, input, inputFilePath, h264VideoConfig);

            // Add an AAC audio stream to the encoding
            var aacConfig = await CreateAacAudioConfiguration();

            var aacAudioStream = await CreateStream(encoding, input, inputFilePath, aacConfig);

            var videoMuxing = await CreateFmp4Muxing(encoding, h264VideoStream);

            var audioMuxing = await CreateFmp4Muxing(encoding, aacAudioStream);

            await CreateDrmConfig(encoding, videoMuxing, output, "video");
            await CreateDrmConfig(encoding, audioMuxing, output, "audio");

            var dashManifest = await CreateDefaultDashManifest(encoding, output, "/");

            var hlsManifest = await CreateDefaultHlsManifest(encoding, output, "/");

            var startEncodingRequest = new StartEncodingRequest()
            {
                ManifestGenerator = ManifestGenerator.V2,
                VodDashManifests  = new List <ManifestResource>()
                {
                    BuildManifestResource(dashManifest)
                },
                VodHlsManifests = new List <ManifestResource>()
                {
                    BuildManifestResource(hlsManifest)
                }
            };

            await ExecuteEncoding(encoding, startEncodingRequest);
        }
Esempio n. 5
0
        /// <summary>
        /// Starts the actual encoding process and periodically polls its status until it reaches a final state<para />
        ///
        /// API endpoints:
        /// https://bitmovin.com/docs/encoding/api-reference/all#/Encoding/PostEncodingEncodingsStartByEncodingId
        /// <br />
        /// https://bitmovin.com/docs/encoding/api-reference/sections/encodings#/Encoding/GetEncodingEncodingsStatusByEncodingId
        /// <para />
        ///
        /// Please note that you can also use our webhooks API instead of polling the status. For more
        /// information consult the API spec:
        /// https://bitmovin.com/docs/encoding/api-reference/sections/notifications-webhooks
        /// </summary>
        /// <param name="encoding">The encoding to be started</param>
        /// <param name="startEncodingRequest">The request object to be sent with the start call</param>
        /// <exception cref="System.SystemException"></exception>
        private async Task ExecuteEncoding(Models.Encoding encoding, StartEncodingRequest startEncodingRequest)
        {
            await _bitmovinApi.Encoding.Encodings.StartAsync(encoding.Id, startEncodingRequest);

            ServiceTaskStatus serviceTaskStatus;

            do
            {
                await Task.Delay(5000);

                serviceTaskStatus = await _bitmovinApi.Encoding.Encodings.StatusAsync(encoding.Id);

                Console.WriteLine($"Encoding status is {serviceTaskStatus.Status} (progress: {serviceTaskStatus.Progress} %)");
            } while (serviceTaskStatus.Status != Status.FINISHED && serviceTaskStatus.Status != Status.ERROR);

            if (serviceTaskStatus.Status == Status.ERROR)
            {
                LogTaskErrors(serviceTaskStatus);
                throw new SystemException("Encoding failed");
            }

            Console.WriteLine("Encoding finished successfully");
        }
Esempio n. 6
0
        public async Task <string> StartAsync(string id, StartEncodingRequest s)
        {
            var postUrl = string.Format("{0}/{1}/start", _url, id);

            return(await _restClient.PostAndGetIdAsync <StartEncodingRequest>(postUrl, s));
        }
Esempio n. 7
0
        public string Start(string id, StartEncodingRequest s)
        {
            var postUrl = string.Format("{0}/{1}/start", _url, id);

            return(_restClient.PostAndGetId <StartEncodingRequest>(postUrl, s));
        }
Esempio n. 8
0
        public async Task RunExample(string[] args)
        {
            _configProvider = new ConfigProvider(args);
            _bitmovinApi    = BitmovinApi.Builder
                              .WithApiKey(_configProvider.GetBitmovinApiKey())
                              // uncomment the following line if you are working with a multi-tenant account
                              // .WithTenantOrgIdKey(_configProvider.GetBitmovinTenantOrgId())
                              .WithLogger(new ConsoleLogger())
                              .Build();

            var encoding = await CreateEncoding("Encoding with SSAI",
                                                "Encoding Example - SSAI conditioned HLS streams");

            var input = await CreateHttpInput(_configProvider.GetHttpInputHost());

            var inputFilePath = _configProvider.GetHttpInputFilePath();

            var output = await CreateS3Output(_configProvider.GetS3OutputBucketName(),
                                              _configProvider.GetS3OutputAccessKey(),
                                              _configProvider.GetS3OutputSecretKey());

            var videoConfigurations = new List <H264VideoConfiguration>()
            {
                await CreateH264VideoConfiguration(1080, 4_800_000),
                await CreateH264VideoConfiguration(720, 2_400_000),
                await CreateH264VideoConfiguration(480, 1_200_000),
                await CreateH264VideoConfiguration(360, 800_000),
                await CreateH264VideoConfiguration(240, 400_000)
            };

            // create a stream and fMP4 muxing for each video codec configuration
            var videoMuxings = new Dictionary <VideoConfiguration, Fmp4Muxing>();

            foreach (var videoConfig in videoConfigurations)
            {
                var videoStream = await CreateStream(encoding, input, inputFilePath, videoConfig);

                var muxing = await CreateFmp4Muxing(encoding, output, $"video/{videoConfig.Height}", videoStream);

                videoMuxings[videoConfig] = muxing;
            }

            // create a stream and fMP4 muxing for audio
            var aacConfig = await CreateAacAudioConfiguration();

            var aacAudioStream = await CreateStream(encoding, input, inputFilePath, aacConfig);

            var aacAudioMuxing = await CreateFmp4Muxing(encoding, output, "audio", aacAudioStream);

            // seconds in which to add a custom HLS tag for ad placement, as well as when to insert a
            // keyframe/split a segment
            var adBreakPlacements = new List <double>()
            {
                5.0, 15.0
            };

            // define keyframes that are used to insert advertisement tags into the manifest
            var keyframes = await CreateKeyframes(encoding, adBreakPlacements);

            // create the master manifest that references audio and video playlists
            var manifest = await CreateHlsMasterManifest(output, "/");

            // create an audio playlist and provide it with custom tags for ad-placement
            var audioMediaInfo = await CreateAudioMediaPlaylist(encoding, manifest, aacAudioMuxing, "audio/");

            await PlaceAudioAdvertisementTags(manifest, audioMediaInfo, keyframes);

            // create a video playlist for each video muxing and provide it with custom tags for ad-placement
            foreach (var key in videoMuxings.Keys)
            {
                var streamInfo = await CreateVideoStreamPlaylist(
                    encoding,
                    manifest,
                    $"video_{key.Height}.m3u8",
                    videoMuxings[key],
                    $"video/{key.Height}",
                    audioMediaInfo
                    );
                await PlaceVideoAdvertisementTags(manifest, streamInfo, keyframes);
            }

            var startEncodingRequest = new StartEncodingRequest()
            {
                ManifestGenerator = ManifestGenerator.V2,
                VodHlsManifests   = new List <ManifestResource>()
                {
                    BuildManifestResource(manifest)
                }
            };

            await ExecuteEncoding(encoding, startEncodingRequest);
        }
        public async Task RunExample(string[] args)
        {
            _configProvider = new ConfigProvider(args);
            _bitmovinApi    = BitmovinApi.Builder
                              .WithApiKey(_configProvider.GetBitmovinApiKey())
                              // uncomment the following line if you are working with a multi-tenant account
                              // .WithTenantOrgIdKey(_configProvider.GetBitmovinTenantOrgId())
                              .WithLogger(new ConsoleLogger())
                              .Build();

            var encoding = await CreateEncoding("Encoding with default manifests",
                                                "Encoding with HLS and DASH default manifests");

            var input = await CreateHttpInput(_configProvider.GetHttpInputHost());

            var output = await CreateS3Output(_configProvider.GetS3OutputBucketName(),
                                              _configProvider.GetS3OutputAccessKey(),
                                              _configProvider.GetS3OutputSecretKey());

            var inputFilePath = _configProvider.GetHttpInputFilePath();

            // ABR Ladder - H264
            var h264VideoConfig_720_3000000 = await CreateH264VideoConfiguration(1280, 720, 3000000L);

            var h264VideoConfig_720_4608000 = await CreateH264VideoConfiguration(1280, 720, 4608000L);

            var h264VideoConfig_1080_6144000 = await CreateH264VideoConfiguration(1920, 1080, 6144000L);

            var h264VideoConfig_1080_7987200 = await CreateH264VideoConfiguration(1920, 1080, 7987200L);

            var videoConfigs = new List <H264VideoConfiguration>()
            {
                h264VideoConfig_720_3000000, h264VideoConfig_720_4608000, h264VideoConfig_1080_6144000, h264VideoConfig_1080_7987200
            };

            // create video streams and muxings
            foreach (H264VideoConfiguration config in videoConfigs)
            {
                var h264VideoStream = await CreateStream(encoding, input, inputFilePath, config);
                await CreateFmp4Muxing(encoding, output, String.Format("/video/{0}", config.Bitrate), h264VideoStream);
            }

            // Audio - ACC
            var aacConfig_192000 = await CreateAacAudioConfiguration(192000L);

            var aacConfig_64000 = await CreateAacAudioConfiguration(64000L);

            var audioConfigs = new List <AacAudioConfiguration>()
            {
                aacConfig_192000, aacConfig_64000
            };

            // create video streams and muxings
            foreach (AacAudioConfiguration config in audioConfigs)
            {
                var aacAudioStream = await CreateStream(encoding, input, inputFilePath, config);
                await CreateFmp4Muxing(encoding, output, String.Format("/audio/{0}", config.Bitrate), aacAudioStream);
            }

            var dashManifest = await CreateDefaultDashManifest(encoding, output, "/");

            var hlsManifest = await CreateDefaultHlsManifest(encoding, output, "/");

            var startEncodingRequest = new StartEncodingRequest()
            {
                ManifestGenerator = ManifestGenerator.V2,
                VodDashManifests  = new List <ManifestResource>()
                {
                    BuildManifestResource(dashManifest)
                },
                VodHlsManifests = new List <ManifestResource>()
                {
                    BuildManifestResource(hlsManifest)
                }
            };

            await ExecuteEncoding(encoding, startEncodingRequest);
        }