Пример #1
0
        public async Task RunExample(string[] args)
        {
            _configProvider = new ConfigProvider(args);
            _bitmovinApi    = BitmovinApi.Builder
                              .WithApiKey(_configProvider.GetBitmovinApiKey())
                              .WithLogger(new ConsoleLogger())
                              .Build();

            var encoding = await CreateEncoding("Multi codec encoding", "Encoding with different codecs and muxing types");

            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 H.264 video stream to the encoding
            var h265VideoConfig = await CreateH265VideoConfiguration();

            var h265VideoStream = await CreateStream(encoding, input, inputFilePath, h265VideoConfig);

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

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

            // Add an AC3 audio stream to the encoding
            var ac3Config = await CreateAc3AudioConfiguration();

            var ac3AudioStream = await CreateStream(encoding, input, inputFilePath, ac3Config);

            // Create an MP4 muxing with the H.264 and AAC streams
            await CreateMp4Muxing(encoding,
                                  output,
                                  "mp4-h264-aac",
                                  new List <Stream>() { h264VideoStream, aacAudioStream },
                                  "video.mp4");

            // Create an MP4 muxing with the H.265 and AC3 streams
            await CreateMp4Muxing(encoding, output,
                                  "mp4-h265-ac3",
                                  new List <Stream>() { h265VideoStream, ac3AudioStream },
                                  "video.mp4");

            // Create a progressive TS muxing with the H.264 and AAC streams
            await CreateProgressiveTsMuxing(encoding,
                                            output,
                                            "progressivets-h264-aac",
                                            new List <Stream>() { h264VideoStream, aacAudioStream },
                                            "video.ts");

            await ExecuteEncoding(encoding);
        }
Пример #2
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("Audio Mapping - Simple Handling - Implicit Handling (Baseline)",
                                                "Input with stereo track -> Output with stereo track");

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

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

            var h264VideoConfig = await CreateH264VideoConfiguration();

            var aacConfig = await CreateAacAudioConfiguration();

            var inputFilePath     = _configProvider.GetHttpInputFilePathWithStereoSound();
            var ingestInputStream = await CreateIngestInputStream(encoding, input, inputFilePath);

            var videoStream = await CreateStream(encoding, ingestInputStream, h264VideoConfig);

            var audioStream = await CreateStream(encoding, ingestInputStream, aacConfig);

            await CreateMp4Muxing(encoding, output, "/", new List <Stream>() { videoStream, audioStream },
                                  "stereo-track.mp4");

            await ExecuteEncoding(encoding);
        }
        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("Audio Mapping - Channel Mixing - Downmixing", "Input with 5.1 track -> Output with downmixed stereo track");

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

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

            var inputFilePath = _configProvider.GetHttpInputFilePathWithSurroundSound();

            // Create an H264 video configuration.
            var h264VideoConfig = await CreateH264VideoConfiguration();

            // Create an AAC audio configuration.
            var aacAudioConfig = await CreateAacAudioConfiguration();

            // Add video and audio ingest input streams.
            var videoIngestInputStream = await CreateIngestInputStream(encoding, input, inputFilePath);

            var audioIngestInputStream = await CreateIngestInputStream(encoding, input, inputFilePath);

            // Create the Downmixing configurations.
            var channelConfigLeft = new DownmixConfig(AudioMixChannelType.FRONT_LEFT);

            channelConfigLeft.AddSourceChannel(AudioMixSourceChannelType.FRONT_LEFT, 1.0);
            channelConfigLeft.AddSourceChannel(AudioMixSourceChannelType.BACK_LEFT, 0.8);
            channelConfigLeft.AddSourceChannel(AudioMixSourceChannelType.CENTER, 0.5);

            var channelConfigRight = new DownmixConfig(AudioMixChannelType.FRONT_RIGHT);

            channelConfigRight.AddSourceChannel(AudioMixSourceChannelType.FRONT_RIGHT, 1.0);
            channelConfigRight.AddSourceChannel(AudioMixSourceChannelType.BACK_RIGHT, 0.8);
            channelConfigRight.AddSourceChannel(AudioMixSourceChannelType.CENTER, 0.5);

            var audioMixInputStream = await CreateDownmixInputStream(encoding, audioIngestInputStream, new List <DownmixConfig>(new [] { channelConfigLeft, channelConfigRight }));

            // Create streams and add them to the encoding.
            var videoStream = await CreateStream(encoding, videoIngestInputStream, h264VideoConfig);

            var audioStream = await CreateStream(encoding, audioMixInputStream, aacAudioConfig);

            var streams = new List <Stream>();

            streams.Add(videoStream);
            streams.Add(audioStream);

            await CreateMp4Muxing(encoding, output, "/", streams, "stereo-track-downmixed.mp4");
            await ExecuteEncoding(encoding);
        }
Пример #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("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);
        }
Пример #5
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);
        }
        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("Audio Mapping - Simple Handling - Distinct Input Files",
                                                "Separate inputs for video, stereo and surround tracks -> Output with 2 audio tracks");

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

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

            var videoInputFilePath    = _configProvider.GetHttpInputFilePath();
            var stereoInputFilePath   = _configProvider.GetHttpInputFilePathWithStereoSound();
            var surroundInputFilePath = _configProvider.GetHttpInputFilePathWithSurroundSound();

            // Create an H264 video configuration.
            var h264VideoConfig = await CreateH264VideoConfiguration();

            // Create an AAC audio configuration.
            var aacAudioConfig = await CreateAacAudioConfiguration();

            // Create a Dolby Digital audio configuration.
            var ddConfig = createDolbyDigitalSurroundAudioConfig();

            // Add video and audio ingest input streams.
            var videoIngestInputStream = await CreateIngestInputStream(encoding, input, videoInputFilePath);

            var stereoIngestInputStream = await CreateIngestInputStream(encoding, input, stereoInputFilePath);

            var surroundIngestInputStream = await CreateIngestInputStream(encoding, input, surroundInputFilePath);

            // Create streams and add them to the encoding.
            var videoStream = await CreateStream(encoding, videoIngestInputStream, h264VideoConfig);

            var audioStream1 = await CreateStream(encoding, stereoIngestInputStream, aacAudioConfig);

            var audioStream2 = await CreateStream(encoding, surroundIngestInputStream, aacAudioConfig);

            var streams = new List <Stream>();

            streams.Add(videoStream);
            streams.Add(audioStream1);
            streams.Add(audioStream2);

            await CreateMp4Muxing(encoding, output, "/", streams, "stereo-and-surround-tracks.mp4");
            await ExecuteEncoding(encoding);
        }
Пример #7
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("Filter example",
                                                "Encoding with multiple filters applied to the video stream");

            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 filters = new List <Filter>()
            {
                await CreateWatermarkFilter(),
                await CreateTextFilter(),
                await CreateDeinterlaceFilter()
            };

            await CreateStreamFilterList(encoding, h264VideoStream, filters);

            // Create an MP4 muxing with the H.264 and AAC streams
            await CreateMp4Muxing(encoding,
                                  output,
                                  "/",
                                  new List <Stream>() { h264VideoStream, aacAudioStream },
                                  "filter_applied.mp4");

            await ExecuteEncoding(encoding);
        }
        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("Multi-language BroadcastTS",
                                                "BroadcastTS muxing example with multiple audio streams");

            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,
                                                     StreamSelectionMode.VIDEO_RELATIVE, 0);

            var mp2Config = await CreateMp2AudioConfiguration();

            var audioStreams = new Dictionary <string, Stream>()
            {
                {
                    "eng",
                    await CreateStream(encoding, input, inputFilePath, mp2Config, StreamSelectionMode.AUDIO_RELATIVE, 0)
                },
                {
                    "deu",
                    await CreateStream(encoding, input, inputFilePath, mp2Config, StreamSelectionMode.AUDIO_RELATIVE, 1)
                }
            };

            await CreateBroadcastTsMuxing(encoding, h264VideoStream, audioStreams, output, "/");

            await ExecuteEncoding(encoding);
        }
        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("Multiple MP4 muxings", "Encoding with multiple MP4 muxings");

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

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

            var inputFilePath = _configProvider.GetHttpInputFilePath();

            var h264VideoConfigurations = new List <H264VideoConfiguration>
            {
                await CreateH264VideoConfiguration(1080, 4_800_000L),
                await CreateH264VideoConfiguration(720, 2_400_000L),
                await CreateH264VideoConfiguration(480, 1_200_000L),
                await CreateH264VideoConfiguration(360, 800_000L),
                await CreateH264VideoConfiguration(240, 400_000L),
            };

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

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

            // Create a video stream and a progressive MP4 muxing per video codec configuration
            foreach (var videoConfiguration in h264VideoConfigurations)
            {
                var videoStream = await CreateStream(encoding, input, inputFilePath, videoConfiguration);
                await CreateMp4Muxing(encoding, output, videoConfiguration.Height.ToString(),
                                      new List <Stream>() { videoStream, aacAudioStream }, "video_h264.mp4");
            }

            await ExecuteEncoding(encoding);
        }
        public async Task RunExample(string[] args)
        {
            _configProvider = new ConfigProvider(args);
            _bitmovinApi    = BitmovinApi.Builder
                              .WithApiKey(_configProvider.GetBitmovinApiKey())
                              .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");

            await ExecuteEncoding(encoding);

            await GenerateDashManifest(encoding, output, "/");
            await GenerateHlsManifest(encoding, output, "/");
        }
Пример #11
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 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();

            // 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);

            await CreateFmp4Muxing(encoding, output, "video", h264VideoStream);
            await CreateFmp4Muxing(encoding, output, "audio", aacAudioStream);

            await ExecuteEncoding(encoding);

            await GenerateDashManifest(encoding, output, "/");
            await GenerateHlsManifest(encoding, output, "/");
        }
Пример #12
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/{aacConfig.Bitrate / 1000}kbs",
                                   aacAudioStream);

            await ExecuteEncoding(encoding);

            await GenerateDashManifest(encoding, output, "/");
            await GenerateHlsManifest(encoding, output, "/");
        }
        public async Task RunExample(string[] args)
        {
            _configProvider = new ConfigProvider(args);
            _bitmovinApi    = BitmovinApi.Builder
                              .WithApiKey(_configProvider.GetBitmovinApiKey())
                              .WithLogger(new ConsoleLogger())
                              .Build();

            var encoding = await CreateEncoding("Live encoding example", "Live encoding with RTMP input");

            var input = await GetRtmpInput();

            var inputFilePath = "live";

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

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

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

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

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

            await CreateFmp4Muxing(encoding, output, $"/video/${h264VideoConfig.Height}p", h264VideoStream);
            await CreateFmp4Muxing(encoding, output, $"/audio/${aacConfig.Bitrate! / 1000}kbs", aacAudioStream);

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

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

            var liveDashManifest = new LiveDashManifest()
            {
                ManifestId = dashManifest.Id
            };

            var liveHlsManifest = new LiveHlsManifest()
            {
                ManifestId = hlsManifest.Id
            };

            var startLiveEncodingRequest = new StartLiveEncodingRequest()
            {
                DashManifests = new List <LiveDashManifest>()
                {
                    liveDashManifest
                },
                HlsManifests = new List <LiveHlsManifest>()
                {
                    liveHlsManifest
                },
                StreamKey = StreamKey
            };

            await StartLiveEncodingAndWaitUntilRunning(encoding, startLiveEncodingRequest);

            var liveEncoding = await WaitForLiveEncodingDetails(encoding);

            Console.WriteLine("Live encoding is up and ready for ingest. " +
                              $"RTMP URL: rtmp://{liveEncoding.EncoderIp}/live StreamKey: {liveEncoding.StreamKey}");

            /*
             * This will enable you to shut down the live encoding from within your script.
             * In production, it is naturally recommended to stop the encoding by using the Bitmovin dashboard
             * or an independent API call - https://bitmovin.com/docs/encoding/api-reference/sections/encodings#/Encoding/PostEncodingEncodingsLiveStopByEncodingId
             */
            Console.WriteLine("Press any key to shutdown the live encoding...");
            Console.ReadKey();

            Console.WriteLine("Shutting down live encoding.");
            await _bitmovinApi.Encoding.Encodings.Live.StopAsync(encoding.Id);

            await WaitUntilEncodingIsInState(encoding, Status.FINISHED);
        }
        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);

            await ExecuteEncoding(encoding);

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

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

            await PlaceAudioAdvertisementTags(manifestHls, 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,
                    manifestHls,
                    $"video_${key.Height}.m3u8",
                    videoMuxings[key],
                    $"video/${key.Height}",
                    audioMediaInfo
                    );
                await PlaceVideoAdvertisementTags(manifestHls, streamInfo, keyframes);
            }

            await ExecuteHlsManifestCreation(manifestHls);
        }
        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(ClassName, "Encoding with a concatenation in MP4 muxing");

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

            var mainFilePath   = _configProvider.GetHttpInputFilePath();
            var bumperFilePath = _configProvider.GetHttpInputBumperFilePath();
            var promoFilePath  = _configProvider.GetHttpInputPromoFilePath();

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

            // Define a video and audio stream as an IngestInputStream to represent each input file (main, bumper, and promo)
            var main = await CreateIngestInputStream(encoding, httpInput, mainFilePath, StreamSelectionMode.AUTO);

            var bumper = await CreateIngestInputStream(encoding, httpInput, bumperFilePath, StreamSelectionMode.AUTO);

            var promo = await CreateIngestInputStream(encoding, httpInput, promoFilePath, StreamSelectionMode.AUTO);

            // In this example, we trim the main input file and create two separated streams as TimeBasedTrimmingInputStream
            var mainPart1 = await CreateTimeBasedTrimmingInputStream(encoding, main, 10.0, 90.0);

            var mainPart2 = await CreateTimeBasedTrimmingInputStream(encoding, main, 100.0, 60.0);

            // Define each concatenation input configuration with "isMain" flag and "position" setting
            // And create a concatenation input stream for the main part 1 and 2 together with bumper and promo

            var bumperConfig = new ConcatenationInputConfiguration()
            {
                InputStreamId = mainPart1.Id,
                IsMain        = false,
                Position      = 0
            };

            var part1Config = new ConcatenationInputConfiguration()
            {
                InputStreamId = mainPart1.Id,
                IsMain        = true,
                Position      = 1
            };

            var promo1Config = new ConcatenationInputConfiguration()
            {
                InputStreamId = promo.Id,
                IsMain        = false,
                Position      = 2
            };

            var part2Config = new ConcatenationInputConfiguration()
            {
                InputStreamId = mainPart2.Id,
                IsMain        = false,
                Position      = 3
            };

            var promo2Config = new ConcatenationInputConfiguration()
            {
                InputStreamId = promo.Id,
                IsMain        = false,
                Position      = 4
            };

            var concatenationInputConfigurations = new List <ConcatenationInputConfiguration>()
            {
                bumperConfig, part1Config, promo1Config, part2Config, promo2Config
            };
            var allTogether = await CreateConcatenationInputStream(encoding, concatenationInputConfigurations);

            // Create an audio codec configuration and the stream
            // In this sample, we use AAc with 128kbps as a pre-defined audio codec
            var aacAudioConfiguration = await CreateAacAudioConfiguration();

            var aacAudioStream = await CreateStreamWithConcatenationInputStream(encoding, allTogether, aacAudioConfiguration);

            // Create a video codec configuration and the stream
            var videoConfiguration = await CreateH264VideoConfiguration(1080, 4800000);

            var videoStream = await CreateStreamWithConcatenationInputStream(encoding, allTogether, videoConfiguration);

            await CreateMp4Muxing(encoding, output, "/MultipleInputsConcatenation", new List <Stream>(){ videoStream, aacAudioStream }, "MultipleInputsConcatenationMp4");
            await ExecuteEncoding(encoding);
        }
        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("Audio Mapping - Stream Merging",
                                                "Multiple stereo input tracks -> Output with single merged stereo track");

            var h264Config = await CreateH264VideoConfiguration();

            var aacConfig = await CreateAacAudioConfiguration();

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

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

            var inputFilePath          = _configProvider.GetHttpInputFilePathWithTwoStereoTracks();
            var videoIngestInputStream = await CreateIngestInputStream(encoding, input, inputFilePath);

            var mainAudioIngestInputStream =
                await CreateIngestInputStreamForAudioTrack(encoding, input, inputFilePath, 0);

            var secondaryAudioIngestInputStream =
                await CreateIngestInputStreamForAudioTrack(encoding, input, inputFilePath, 1);

            var secondaryAudioMixInputStream = new AudioMixInputStream
            {
                ChannelLayout = AudioMixInputChannelLayout.CL_STEREO
            };

            for (var i = 0; i <= 1; i++)
            {
                var sourceChannel = new AudioMixInputStreamSourceChannel
                {
                    Type          = AudioMixSourceChannelType.CHANNEL_NUMBER,
                    ChannelNumber = i,
                    Gain          = 0.5
                };

                var inputStreamChannel = new AudioMixInputStreamChannel
                {
                    InputStreamId       = secondaryAudioIngestInputStream.Id,
                    OutputChannelType   = AudioMixChannelType.CHANNEL_NUMBER,
                    OutputChannelNumber = i,
                    SourceChannels      = new List <AudioMixInputStreamSourceChannel>()
                    {
                        sourceChannel
                    }
                };

                secondaryAudioMixInputStream.AudioMixChannels.Add(inputStreamChannel);
            }

            secondaryAudioMixInputStream = await _bitmovinApi.Encoding.Encodings.InputStreams.AudioMix.CreateAsync(
                encoding.Id, secondaryAudioMixInputStream);

            var videoStream =
                await CreateStream(encoding, new List <InputStream>() { videoIngestInputStream }, h264Config);

            var audioStream =
                await CreateStream(
                    encoding,
                    new List <InputStream>() { mainAudioIngestInputStream, secondaryAudioMixInputStream },
                    aacConfig);

            await CreateMp4Muxing(
                encoding,
                output,
                "/",
                new List <Stream>() { videoStream, audioStream },
                "stereo-and-surround-tracks-mapped.mp4");

            await ExecuteEncoding(encoding);
        }
        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("Audio Mapping - Channel Mixing - Swapping Channels",
                                                "Input with stereo track -> Output with swapped stereo tracks");

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

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

            var inputFilePath = _configProvider.GetHttpInputFilePathWithStereoSound();

            // Create an H264 video configuration.
            var h264VideoConfig = await CreateH264VideoConfiguration();

            // Create an AAC audio configuration.
            var aacAudioConfig = await CreateAacAudioConfiguration();

            // Add video and audio ingest input streams.
            var videoIngestInputStream = await CreateIngestInputStream(encoding, input, inputFilePath);

            var audioIngestInputStream = await CreateIngestInputStream(encoding, input, inputFilePath);

            var audioMixInputStream = new AudioMixInputStream()
            {
                Name          = "Swapping channels 0 and 1",
                ChannelLayout = AudioMixInputChannelLayout.CL_STEREO
            };

            var sourceChannel0 = new AudioMixInputStreamSourceChannel()
            {
                Type          = AudioMixSourceChannelType.CHANNEL_NUMBER,
                ChannelNumber = 0
            };

            var sourceChannel1 = new AudioMixInputStreamSourceChannel()
            {
                Type          = AudioMixSourceChannelType.CHANNEL_NUMBER,
                ChannelNumber = 1
            };

            var outputChannel0 = new AudioMixInputStreamChannel()
            {
                InputStreamId       = audioIngestInputStream.Id,
                OutputChannelType   = AudioMixChannelType.CHANNEL_NUMBER,
                OutputChannelNumber = 0,
                SourceChannels      = new List <AudioMixInputStreamSourceChannel> {
                    sourceChannel1
                }
            };

            var outputChannel1 = new AudioMixInputStreamChannel()
            {
                InputStreamId       = audioIngestInputStream.Id,
                OutputChannelType   = AudioMixChannelType.CHANNEL_NUMBER,
                OutputChannelNumber = 1,
                SourceChannels      = new List <AudioMixInputStreamSourceChannel> {
                    sourceChannel0
                }
            };

            var audioMixChannels = new List <AudioMixInputStreamChannel>()
            {
                outputChannel0, outputChannel1
            };

            audioMixInputStream = await CreateAudioMixInputStream(encoding, audioMixInputStream, audioMixChannels);

            // Create streams and add them to the encoding.
            var videoStream = await CreateStream(encoding, videoIngestInputStream, h264VideoConfig);

            var audioStream = await CreateStream(encoding, audioMixInputStream, aacAudioConfig);

            var streams = new List <Stream>();

            streams.Add(videoStream);
            streams.Add(audioStream);

            await CreateMp4Muxing(encoding, output, "/", streams, "stereo-track-swapped.mp4");
            await ExecuteEncoding(encoding);
        }
        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);
        }
Пример #19
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("Audio Mapping - Stream Mapping - Multiple Mono Tracks",
                                                "Input with multiple mono tracks -> Output with stereo and surround tracks");

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

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

            var h264Config = await CreateH264VideoConfiguration();

            var aacConfig = await CreateAacAudioConfiguration();

            var ddConfig = await CreateDdSurroundAudioConfiguration();

            var inputFilePath          = _configProvider.GetHttpInputFilePathWithMultipleMonoAudioTracks();
            var videoIngestInputStream = await CreateIngestInputStream(encoding, input, inputFilePath);

            var stereoMap = new List <ChannelMappingConfiguration>()
            {
                new(AudioMixChannelType.FRONT_LEFT, 0),
                new(AudioMixChannelType.FRONT_RIGHT, 1)
            };
            var surroundMap = new List <ChannelMappingConfiguration>()
            {
                new(AudioMixChannelType.FRONT_LEFT, 2),
                new(AudioMixChannelType.FRONT_RIGHT, 3),
                new(AudioMixChannelType.BACK_LEFT, 4),
                new(AudioMixChannelType.BACK_RIGHT, 5),
                new(AudioMixChannelType.CENTER, 6),
                new(AudioMixChannelType.LOW_FREQUENCY, 7),
            };

            var stereoAudioMixStreams =
                await CreateAudioMixInputStreamChannels(encoding, input, inputFilePath, stereoMap);

            var stereoMixInputStream =
                await CreateAudioMixInputStream(encoding, AudioMixInputChannelLayout.CL_STEREO, stereoAudioMixStreams);

            var surroundAudioMixStreams =
                await CreateAudioMixInputStreamChannels(encoding, input, inputFilePath, surroundMap);

            var surroundMixInputStream = await CreateAudioMixInputStream(
                encoding, AudioMixInputChannelLayout.CL_5_1_BACK, surroundAudioMixStreams);

            var videoStream = await CreateStream(encoding, videoIngestInputStream, h264Config);

            var stereoAudioStream = await CreateStream(encoding, stereoMixInputStream, aacConfig);

            var surroundAudioStream = await CreateStream(encoding, surroundMixInputStream, ddConfig);

            await CreateMp4Muxing(
                encoding,
                output,
                "/",
                new List <Stream>() { videoStream, stereoAudioStream, surroundAudioStream },
                "stereo-and-surround-tracks-mapped.mp4");

            await ExecuteEncoding(encoding);
        }
        public async Task RunExample(string[] args)
        {
            _configProvider = new ConfigProvider(Environment.GetCommandLineArgs());
            _bitmovinApi    = BitmovinApi.Builder
                              .WithApiKey(_configProvider.GetBitmovinApiKey())
                              .WithLogger(new ConsoleLogger())
                              .Build();

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

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

            var codecConfigurations = new List <CodecConfiguration>()
            {
                await CreateH264VideoConfiguration(480, 800_000L),
                await CreateH264VideoConfiguration(720, 1_200_000L),
                await CreateH264VideoConfiguration(1080, 2_000_000L),
                await CreateAacAudioConfiguration()
            };

            var jobDispatcher = new JobDispatcher();

            do
            {
                var queuedEncodings = await CountQueuedEncodings();

                var freeSlots = TargetQueueSize - queuedEncodings;

                if (freeSlots > 0)
                {
                    var jobsToStart = jobDispatcher.GetJobsToStart(freeSlots);

                    if (jobsToStart.Count > 0)
                    {
                        Console.WriteLine($"There are currently {queuedEncodings} encodings queued. " +
                                          $"Starting {jobsToStart.Count} more to reach target queue size " +
                                          $"of {TargetQueueSize}");

                        await StartEncodings(jobsToStart, codecConfigurations, input, output);
                    }
                    else
                    {
                        Console.WriteLine("No more jobs to start. Waiting for " +
                                          $"{jobDispatcher.GetStartedJobs().Count} jobs to finish.");
                    }
                }
                else
                {
                    Console.WriteLine($"There are currently {queuedEncodings} encodings queued. " +
                                      "Waiting for free slots...");
                }

                await Task.Delay(10000);

                foreach (var job in jobDispatcher.GetStartedJobs())
                {
                    await UpdateEncodingJob(job);

                    await Task.Delay(300);
                }
            } while (!jobDispatcher.AllJobsFinished());

            Console.WriteLine("All encodings jobs are finished!");

            jobDispatcher.LogFailedJobs();
        }