/// <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"); }
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); }
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); }
/// <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"); }
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)); }
public string Start(string id, StartEncodingRequest s) { var postUrl = string.Format("{0}/{1}/start", _url, id); return(_restClient.PostAndGetId <StartEncodingRequest>(postUrl, s)); }
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); }