def _get_sample_muxing(self): video_stream = self._get_sample_video_stream() video_stream_response = self.bitmovin.encodings.Stream.create(object_=video_stream, encoding_id=self.sampleEncoding.id) self.assertIsNotNone(video_stream_response) self.assertIsNotNone(video_stream_response.resource) self.assertIsNotNone(video_stream_response.resource.id) audio_stream = self._get_sample_audio_stream() audio_stream_response = self.bitmovin.encodings.Stream.create(object_=audio_stream, encoding_id=self.sampleEncoding.id) self.assertIsNotNone(audio_stream_response) self.assertIsNotNone(audio_stream_response.resource) self.assertIsNotNone(audio_stream_response.resource.id) muxing_video_stream = MuxingStream(stream_id=video_stream_response.resource.id) muxing_audio_stream = MuxingStream(stream_id=audio_stream_response.resource.id) broadcast_ts_muxing_configuration = self._get_sample_broadcast_ts_muxing_configuration( video_stream_id=video_stream_response.resource.id, audio_stream_id=audio_stream_response.resource.id ) return BroadcastTsMuxing(streams=[muxing_video_stream, muxing_audio_stream], segment_length=4, outputs=video_stream.outputs, name='Sample BroadcastTS Muxing', filename='pythontest.ts', configuration=broadcast_ts_muxing_configuration)
def create_muxing(encoding, output, video_stream, audio_stream): acl_entry = ACLEntry(permission=ACLPermission.PUBLIC_READ) video_muxing_output = EncodingOutput(output_id=output.id, output_path=S3_OUTPUT_BUCKETNAME+OUTPUT_BASE_PATH, acl=[acl_entry]) video_muxing_stream = MuxingStream(video_stream.id) audio_muxing_stream = MuxingStream(audio_stream.id) muxing = WebMMuxing(streams=[video_muxing_stream, audio_muxing_stream], outputs=[video_muxing_output], segment_naming="segment_%number%.chk", segment_length=4.0, init_segment_name="init.hdr") muxing = bitmovin.encodings.Muxing.WebM.create(object_=muxing, encoding_id=encoding.id).resource
def _get_sample_muxing(self): stream = self._get_sample_stream() create_stream_response = self.bitmovin.encodings.Stream.create( object_=stream, encoding_id=self.sampleEncoding.id) self.assertIsNotNone(create_stream_response) self.assertIsNotNone(create_stream_response.resource) self.assertIsNotNone(create_stream_response.resource.id) muxing_stream = MuxingStream( stream_id=create_stream_response.resource.id) time_code = TimeCode(time_code_start='01:00:00:00') internal_chunk_length = InternalChunkLength( mode=InternalChunkLengthMode.CUSTOM, custom_chunk_length=3.0) muxing = MP4Muxing( streams=[muxing_stream], filename='myprogressive.mp4', outputs=stream.outputs, name='Sample MP4 Muxing', fragment_duration=5, time_code=time_code, stream_conditions_mode=StreamConditionsMode.DROP_MUXING, internal_chunk_length=internal_chunk_length) return muxing
def create_muxing(encoding, output, video_stream, audio_stream, filename): acl_entry = ACLEntry(permission=ACLPermission.PUBLIC_READ) video_muxing_output = EncodingOutput(output_id=output.id, output_path=OUTPUT_BASE_PATH, acl=[acl_entry]) video_muxing_stream = MuxingStream(video_stream.id) audio_muxing_stream = MuxingStream(audio_stream.id) muxing = MP4Muxing(streams=[video_muxing_stream, audio_muxing_stream], outputs=[video_muxing_output], filename=filename) muxing = bitmovin.encodings.Muxing.MP4.create( object_=muxing, encoding_id=encoding.id).resource
def create_fmp4_muxing(encoding, stream): muxing_stream = MuxingStream(stream.id) muxing = FMP4Muxing(segment_length=6.0, streams=[muxing_stream], name='fmp4 muxing') return bitmovin.encodings.Muxing.FMP4.create( object_=muxing, encoding_id=encoding.id).resource
def _get_sample_muxing(self): output = self._get_sample_encoding_output() muxing_stream = MuxingStream(stream_id=self.sampleStream.id) muxing = FMP4Muxing(streams=[muxing_stream], segment_length=4, segment_naming='seg_%number%.m4s', init_segment_name='init.mp4', outputs=[output], name='Sample FMP4 Muxing') return muxing
def _get_sample_muxing(self): stream = self._get_sample_stream() create_stream_response = self.bitmovin.encodings.Stream.create(object_=stream, encoding_id=self.sampleEncoding.id) self.assertIsNotNone(create_stream_response) self.assertIsNotNone(create_stream_response.resource) self.assertIsNotNone(create_stream_response.resource.id) muxing_stream = MuxingStream(stream_id=create_stream_response.resource.id) muxing = ProgressiveTSMuxing(streams=[muxing_stream], segment_length=4, filename='myprogressive.ts', outputs=stream.outputs, name='Sample ProgressiveTSMuxing') return muxing
def _get_sample_webm_muxing(self): stream = self._get_sample_stream() create_stream_response = self.bitmovin.encodings.Stream.create(object_=stream, encoding_id=self.sampleEncoding.id) self.assertIsNotNone(create_stream_response) self.assertIsNotNone(create_stream_response.resource) self.assertIsNotNone(create_stream_response.resource.id) muxing_stream = MuxingStream(stream_id=create_stream_response.resource.id) muxing = WebMMuxing(streams=[muxing_stream], segment_length=4, segment_naming='seg_%number%.chk', outputs=stream.outputs, name='Sample WebM Muxing') return muxing
def create_mp4_muxing(encoding, s3_output, video_stream, audio_stream): """ An MP4 muxing will be created for with the Per-Title video stream template and the audio stream. This muxing must define either {uuid} or {bitrate} in the output path. These placeholders will be replaced during the generation of the Per-Title. :param encoding: The reference of the encoding :param s3_output: The output the files should be written to :param video_stream: The Per-Title template video stream :param audio_stream: The audio stream :return: """ acl_entry = ACLEntry(permission=ACLPermission.PUBLIC_READ) mp4_muxing_output = EncodingOutput(output_id=s3_output.id, output_path=OUTPUT_BASE_PATH + "{width}_{bitrate}_{uuid}/", acl=[acl_entry]) mp4_muxing = MP4Muxing( streams=[MuxingStream(video_stream.id), MuxingStream(audio_stream.id)], filename='per_title_mp4.mp4', outputs=[mp4_muxing_output], name='MP4 Muxing') bitmovin.encodings.Muxing.MP4.create(object_=mp4_muxing, encoding_id=encoding.id)
def _get_sample_muxing(self): stream = self._get_sample_stream() create_stream_response = self.bitmovin.encodings.Stream.create(object_=stream, encoding_id=self.sampleEncoding.id) self.assertIsNotNone(create_stream_response) self.assertIsNotNone(create_stream_response.resource) self.assertIsNotNone(create_stream_response.resource.id) muxing_stream = MuxingStream(stream_id=create_stream_response.resource.id) muxing = ProgressiveWebMMuxing(streams=[muxing_stream], filename='keyframeArchiveTest.mov', outputs=stream.outputs, name='Sample ProgressiveWebMMuxing') return muxing
def make_ts_muxing(bitmovin, encoding, stream, output, muxing_output_path): """ Makes a TS muxing. """ acl_entry = ACLEntry(permission=ACLPermission.PUBLIC_READ) muxing_stream = MuxingStream(stream.id) muxing_output = EncodingOutput(output_id=output.id, output_path=muxing_output_path, acl=[acl_entry]) ts_muxing = TSMuxing(segment_length=4, segment_naming='segment_%number%.ts', streams=[muxing_stream], outputs=[muxing_output]) return bitmovin.encodings.Muxing.TS.create( object_=ts_muxing, encoding_id=encoding.id).resource
def _get_sample_muxing(self): stream = self._get_sample_stream() create_stream_response = self.bitmovin.encodings.Stream.create( object_=stream, encoding_id=self.sampleEncoding.id) self.assertIsNotNone(create_stream_response) self.assertIsNotNone(create_stream_response.resource) self.assertIsNotNone(create_stream_response.resource.id) muxing_stream = MuxingStream( stream_id=create_stream_response.resource.id) muxing = MP4Muxing(streams=[muxing_stream], filename="myrendition.ismv", fragment_duration=4000, outputs=stream.outputs, name='Sample MP4 Muxing') return (muxing, create_stream_response.resource)
def _get_sample_muxing(self): stream = self._get_sample_stream() create_stream_response = self.bitmovin.encodings.Stream.create( object_=stream, encoding_id=self.sampleEncoding.id) self.assertIsNotNone(create_stream_response) self.assertIsNotNone(create_stream_response.resource) self.assertIsNotNone(create_stream_response.resource.id) muxing_stream = MuxingStream( stream_id=create_stream_response.resource.id) muxing = MP4Muxing(streams=[muxing_stream], filename='myprogressive.mp4', outputs=stream.outputs, name='Sample MP4 Muxing', fragment_duration=5) return muxing
def make_fmp4_muxing(bitmovin, encoding, stream, output, muxing_output_path): """ Makes a fMP4 muxing. """ acl_entry = ACLEntry(permission=ACLPermission.PUBLIC_READ) muxing_stream = MuxingStream(stream.id) muxing_output = EncodingOutput(output_id=output.id, output_path=muxing_output_path, acl=[acl_entry]) fmp4_muxing = FMP4Muxing(segment_length=4, segment_naming='segment_%number%.m4s', init_segment_name='init.mp4', streams=[muxing_stream], outputs=[muxing_output]) return bitmovin.encodings.Muxing.FMP4.create( object_=fmp4_muxing, encoding_id=encoding.id).resource
def make_webm_muxing(bitmovin, encoding, stream, output, muxing_output_path): """ Makes a WebM muxing. """ acl_entry = ACLEntry(permission=ACLPermission.PUBLIC_READ) muxing_stream = MuxingStream(stream.id) muxing_output = EncodingOutput(output_id=output.id, output_path=muxing_output_path, acl=[acl_entry]) webm_muxing = WebMMuxing(segment_length=4, segment_naming='segment_%number%.chk', init_segment_name='init.hdr', streams=[muxing_stream], outputs=[muxing_output]) return bitmovin.encodings.Muxing.WebM.create( object_=webm_muxing, encoding_id=encoding.id).resource
def main(): bitmovin = Bitmovin(api_key=API_KEY) # Create an S3 input. This resource is then used as base bucket for the input file. s3_input = S3Input(access_key=S3_INPUT_ACCESSKEY, secret_key=S3_INPUT_SECRETKEY, bucket_name=S3_INPUT_BUCKETNAME, name='S3 Input') s3_input = bitmovin.inputs.S3.create(s3_input).resource # Create an S3 Output. This will be used as target bucket for the muxings, sprites and manifests s3_output = S3Output(access_key=S3_OUTPUT_ACCESSKEY, secret_key=S3_OUTPUT_SECRETKEY, bucket_name=S3_OUTPUT_BUCKETNAME, name='S3 Output') s3_output = bitmovin.outputs.S3.create(s3_output).resource # Create an Encoding. This will run in AWS_EU_WEST_1. This is the base entity used to configure the encoding. encoding = Encoding(name='Encoding with video/audio and stream condition', cloud_region=CloudRegion.AWS_EU_WEST_1) encoding = bitmovin.encodings.Encoding.create(encoding).resource encoding_configs = [] # Iterate over all encoding profiles and create the H264 configuration with the defined height and bitrate. for idx, _ in enumerate(encoding_profiles_h264): profile_h264 = encoding_profiles_h264[idx] encoding_config = dict(profile_h264=profile_h264) h264_codec_height = H264CodecConfiguration( name='H264 Codec {}p {}k Configuration'.format(profile_h264.get('height'), profile_h264.get('bitrate')), bitrate=profile_h264.get('bitrate') * 1000, height=profile_h264.get('height'), profile=profile_h264.get('profile'), rate=profile_h264.get("fps")) encoding_config['h264_codec_ar_gt_1'] = bitmovin.codecConfigurations.H264.create(h264_codec_height).resource h264_codec_height_landscape = H264CodecConfiguration( name='H264 Codec {}p {}k Configuration'.format(profile_h264.get('height'), profile_h264.get('bitrate')), bitrate=profile_h264.get('bitrate') * 1000, height=profile_h264.get('height_landscape'), profile=profile_h264.get('profile'), rate=profile_h264.get("fps")) encoding_config['h264_codec_ar_lt_1'] = bitmovin.codecConfigurations.H264.create(h264_codec_height_landscape).resource encoding_configs.append(encoding_config) # Also the AAC configuration has to be created, which will be later on used to create the streams. audio_codec_configuration = AACCodecConfiguration(name='AAC Codec Configuration', bitrate=128000, rate=48000) audio_codec_configuration = bitmovin.codecConfigurations.AAC.create(audio_codec_configuration).resource video_input_stream = StreamInput(input_id=s3_input.id, input_path=S3_INPUT_PATH, selection_mode=SelectionMode.VIDEO_RELATIVE, position=0) audio_input_stream = StreamInput(input_id=s3_input.id, input_path=S3_INPUT_PATH, selection_mode=SelectionMode.AUDIO_RELATIVE, position=0) # With the configurations and the input file streams are now created and muxed later on. for encoding_config in encoding_configs: encoding_profile = encoding_config.get("profile_h264") video_stream_condition_ar_gt_1 = Condition(attribute="ASPECTRATIO", operator=">=", value="1") video_stream_h264 = Stream(codec_configuration_id=encoding_config.get("h264_codec_ar_gt_1").id, input_streams=[video_input_stream], conditions=video_stream_condition_ar_gt_1, name='Stream H264 {}p_{}k'.format(encoding_profile.get('height'), encoding_profile.get('bitrate'))) encoding_config['h264_stream_ar_gt_1'] = bitmovin.encodings.Stream.create(object_=video_stream_h264, encoding_id=encoding.id).resource video_stream_condition_ar_lt_1 = Condition(attribute="ASPECTRATIO", operator="<", value="1") video_stream_h264 = Stream(codec_configuration_id=encoding_config.get("h264_codec_ar_lt_1").id, input_streams=[video_input_stream], conditions=video_stream_condition_ar_lt_1, name='Stream H264 {}p_{}k'.format(encoding_profile.get('height'), encoding_profile.get('bitrate'))) encoding_config['h264_stream_ar_lt_1'] = bitmovin.encodings.Stream.create(object_=video_stream_h264, encoding_id=encoding.id).resource audio_stream_condition = Condition(attribute="INPUTSTREAM", operator="==", value="TRUE") audio_stream = Stream(codec_configuration_id=audio_codec_configuration.id, input_streams=[audio_input_stream], conditions=audio_stream_condition, name='Audio Stream') audio_stream = bitmovin.encodings.Stream.create(object_=audio_stream, encoding_id=encoding.id).resource acl_entry = ACLEntry(permission=ACLPermission.PUBLIC_READ) # Create FMP4 muxings which are later used for the DASH manifest. The current settings will set a segment length # of 4 seconds. for encoding_config in encoding_configs: encoding_profile = encoding_config.get("profile_h264") video_muxing_stream_h264_ar_gt_1 = MuxingStream(encoding_config.get("h264_stream_ar_gt_1").id) video_muxing_output_h264 = EncodingOutput(output_id=s3_output.id, output_path=OUTPUT_BASE_PATH + 'video/h264/dash/{}p_{}k/'.format( encoding_profile.get('height'), encoding_profile.get('bitrate')), acl=[acl_entry]) video_muxing_h264_ar_gt_1 = FMP4Muxing(segment_length=4, segment_naming='seg_%number%.m4s', init_segment_name='init.mp4', streams=[video_muxing_stream_h264_ar_gt_1], outputs=[video_muxing_output_h264], name='FMP4 H264 Muxing {}p_{}k'.format(encoding_profile.get('height'), encoding_profile.get('bitrate'))) encoding_config['h264_muxing_ar_gt_1'] = bitmovin.encodings.Muxing.FMP4.create( object_=video_muxing_h264_ar_gt_1, encoding_id=encoding.id).resource video_ts_muxing_output_h264 = EncodingOutput(output_id=s3_output.id, output_path=OUTPUT_BASE_PATH + 'video/h264/hls/{}p_{}k/'.format( encoding_profile.get('height'), encoding_profile.get('bitrate')), acl=[acl_entry]) video_ts_muxing_h264_ar_gt_1 = TSMuxing(segment_length=4, segment_naming='seg_%number%.ts', streams=[video_muxing_stream_h264_ar_gt_1], outputs=[video_ts_muxing_output_h264], name='FMP4 H264 Muxing {}p_{}k'.format(encoding_profile.get('height'), encoding_profile.get('bitrate'))) encoding_config['h264_ts_muxing_ar_gt_1'] = bitmovin.encodings.Muxing.TS.create( object_=video_ts_muxing_h264_ar_gt_1, encoding_id=encoding.id).resource video_muxing_stream_h264_ar_lt_1 = MuxingStream(encoding_config.get("h264_stream_ar_lt_1").id) video_muxing_output_h264 = EncodingOutput(output_id=s3_output.id, output_path=OUTPUT_BASE_PATH + 'video/h264/dash/{}p_{}k/'.format( encoding_profile.get('height'), encoding_profile.get('bitrate')), acl=[acl_entry]) video_muxing_h264_ar_lt_1 = FMP4Muxing(segment_length=4, segment_naming='seg_%number%.m4s', init_segment_name='init.mp4', streams=[video_muxing_stream_h264_ar_lt_1], outputs=[video_muxing_output_h264], name='FMP4 H264 Muxing {}p_{}k'.format(encoding_profile.get('height'), encoding_profile.get('bitrate'))) encoding_config['h264_muxing_ar_lt_1'] = bitmovin.encodings.Muxing.FMP4.create( object_=video_muxing_h264_ar_lt_1, encoding_id=encoding.id).resource video_ts_muxing_output_h264 = EncodingOutput(output_id=s3_output.id, output_path=OUTPUT_BASE_PATH + 'video/h264/hls/{}p_{}k/'.format( encoding_profile.get('height'), encoding_profile.get('bitrate')), acl=[acl_entry]) video_ts_muxing_h264_ar_lt_1 = TSMuxing(segment_length=4, segment_naming='seg_%number%.ts', streams=[video_muxing_stream_h264_ar_lt_1], outputs=[video_ts_muxing_output_h264], name='FMP4 H264 Muxing {}p_{}k'.format(encoding_profile.get('height'), encoding_profile.get('bitrate'))) encoding_config['h264_ts_muxing_ar_lt_1'] = bitmovin.encodings.Muxing.TS.create( object_=video_ts_muxing_h264_ar_lt_1, encoding_id=encoding.id).resource audio_muxing_stream = MuxingStream(audio_stream.id) # mp4 audio muxing audio_muxing_output = EncodingOutput(output_id=s3_output.id, output_path=OUTPUT_BASE_PATH + "audio/dash/", acl=[acl_entry]) audio_muxing = FMP4Muxing(segment_length=4, segment_naming='seg_%number%.m4s', init_segment_name='init.mp4', streams=[audio_muxing_stream], outputs=[audio_muxing_output], name='Audio Dash Muxing') audio_muxing = bitmovin.encodings.Muxing.FMP4.create(object_=audio_muxing, encoding_id=encoding.id).resource # TS audio muxing hls_audio_muxing_output = EncodingOutput(output_id=s3_output.id, output_path=OUTPUT_BASE_PATH + "audio/hls/", acl=[acl_entry]) hls_audio_muxing = TSMuxing(segment_length=4, segment_naming='seg_%number%.ts', streams=[audio_muxing_stream], outputs=[hls_audio_muxing_output], name='Audio TS Muxing') hls_audio_muxing = bitmovin.encodings.Muxing.TS.create(object_=hls_audio_muxing, encoding_id=encoding.id).resource bitmovin.encodings.Encoding.start(encoding_id=encoding.id) try: bitmovin.encodings.Encoding.wait_until_finished(encoding_id=encoding.id) except BitmovinError as bitmovin_error: print("Exception occurred while waiting for encoding to finish:") pprint(bitmovin_error) exit(-1) # Specify the output for manifest which will be in the OUTPUT_BASE_PATH. manifest_output = EncodingOutput(output_id=s3_output.id, output_path=OUTPUT_BASE_PATH, acl=[acl_entry]) # Create a DASH H264 manifest and add one period with an adaptation set for audio and video dash_manifest_h264 = DashManifest(manifest_name='stream.mpd', outputs=[manifest_output], name='DASH H264 Manifest') dash_manifest_h264 = bitmovin.manifests.DASH.create(dash_manifest_h264).resource period_h264 = Period() period_h264 = bitmovin.manifests.DASH.add_period(object_=period_h264, manifest_id=dash_manifest_h264.id).resource video_adaptation_set_h264 = VideoAdaptationSet() video_adaptation_set_h264 = bitmovin.manifests.DASH.add_video_adaptation_set(object_=video_adaptation_set_h264, manifest_id=dash_manifest_h264.id, period_id=period_h264.id).resource audio_adaptation_set_h264 = AudioAdaptationSet(lang='en') audio_adaptation_set_h264 = bitmovin.manifests.DASH.add_audio_adaptation_set(object_=audio_adaptation_set_h264, manifest_id=dash_manifest_h264.id, period_id=period_h264.id).resource fmp4_representation_audio = FMP4Representation(FMP4RepresentationType.TEMPLATE, encoding_id=encoding.id, muxing_id=audio_muxing.id, segment_path="audio/dash/") bitmovin.manifests.DASH.add_fmp4_representation(object_=fmp4_representation_audio, manifest_id=dash_manifest_h264.id, period_id=period_h264.id, adaptationset_id=audio_adaptation_set_h264.id) # Add all representation to the video adaption set for encoding_config in encoding_configs: encoding_profile = encoding_config.get("profile_h264") h264_muxing_ar_gt_1 = encoding_config.get('h264_muxing_ar_gt_1') fmp4_representation = FMP4Representation(FMP4RepresentationType.TEMPLATE, encoding_id=encoding.id, muxing_id=h264_muxing_ar_gt_1.id, segment_path='video/h264/dash/{}p_{}k/'.format( encoding_profile.get('height'), encoding_profile.get('bitrate'))) encoding_config['h264_dash'] = bitmovin.manifests.DASH.add_fmp4_representation( object_=fmp4_representation, manifest_id=dash_manifest_h264.id, period_id=period_h264.id, adaptationset_id=video_adaptation_set_h264.id ).resource h264_muxing_ar_lt_1 = encoding_config.get('h264_muxing_ar_lt_1') fmp4_representation = FMP4Representation(FMP4RepresentationType.TEMPLATE, encoding_id=encoding.id, muxing_id=h264_muxing_ar_lt_1.id, segment_path='video/h264/dash/{}p_{}k/'.format( encoding_profile.get('height'), encoding_profile.get('bitrate'))) encoding_config['h264_dash'] = bitmovin.manifests.DASH.add_fmp4_representation( object_=fmp4_representation, manifest_id=dash_manifest_h264.id, period_id=period_h264.id, adaptationset_id=video_adaptation_set_h264.id ).resource bitmovin.manifests.DASH.start(manifest_id=dash_manifest_h264.id) # Create a HLS H264 manifest and add one period with an adaptation set for audio and video hls_manifest = HlsManifest(manifest_name='stream.m3u8', outputs=[manifest_output], name='HLS H264 Manifest') hls_manifest = bitmovin.manifests.HLS.create(object_=hls_manifest).resource hls_audio_media = AudioMedia(name='en', group_id='audio_group', segment_path="audio/hls/", encoding_id=encoding.id, stream_id=audio_stream.id, muxing_id=hls_audio_muxing.id, language='en', uri="audio.m3u8") bitmovin.manifests.HLS.AudioMedia.create(manifest_id=hls_manifest.id, object_=hls_audio_media) # Add all representation to the video adaption set for encoding_config in encoding_configs: encoding_profile = encoding_config.get("profile_h264") video_muxing_stream_h264_ar_gt_1 = encoding_config.get("h264_stream_ar_gt_1") ts_muxing_ar_gt_1 = encoding_config.get('h264_ts_muxing_ar_gt_1') # append another variant stream for this video quality to our hls renditions. hls_variant_stream = VariantStream(audio="audio_group", segment_path='video/h264/hls/{}p_{}k/'.format( encoding_profile.get('height'), encoding_profile.get('bitrate')), uri='video_{}p_{}.m3u8'.format( encoding_profile.get('height'), encoding_profile.get('bitrate')), encoding_id=encoding.id, stream_id=video_muxing_stream_h264_ar_gt_1.id, muxing_id=ts_muxing_ar_gt_1.id) bitmovin.manifests.HLS.VariantStream.create(manifest_id=hls_manifest.id, object_=hls_variant_stream) video_muxing_stream_h264_ar_lt_1 = encoding_config.get("h264_stream_ar_lt_1") ts_muxing_ar_lt_1 = encoding_config.get('h264_ts_muxing_ar_lt_1') # append another variant stream for this video quality to our hls renditions. hls_variant_stream = VariantStream(audio="audio_group", segment_path='video/h264/hls/{}p_{}k/'.format( encoding_profile.get('height'), encoding_profile.get('bitrate')), uri='video_{}p_{}.m3u8'.format( encoding_profile.get('height'), encoding_profile.get('bitrate')), encoding_id=encoding.id, stream_id=video_muxing_stream_h264_ar_lt_1.id, muxing_id=ts_muxing_ar_lt_1.id) bitmovin.manifests.HLS.VariantStream.create(manifest_id=hls_manifest.id, object_=hls_variant_stream) bitmovin.manifests.HLS.start(manifest_id=hls_manifest.id) try: bitmovin.manifests.DASH.wait_until_finished(manifest_id=dash_manifest_h264.id) except BitmovinError as bitmovin_error: print("Exception occurred while waiting for manifest creation to finish: {}".format(bitmovin_error)) exit(-1) try: bitmovin.manifests.HLS.wait_until_finished(manifest_id=hls_manifest.id) except BitmovinError as bitmovin_error: print("Exception occurred while waiting for manifest creation to finish: {}".format(bitmovin_error)) exit(-1)
def encode_file_to_fmp4(encoding, input, input_path, output, output_path, encoding_configs): video_input_stream = StreamInput(input_id=input.id, input_path=input_path, selection_mode=SelectionMode.AUTO) audio_input_stream = StreamInput(input_id=input.id, input_path=input_path, selection_mode=SelectionMode.AUTO) new_encoding_configs = copy.deepcopy(encoding_configs) # With the configurations and the input file streams are now created and muxed later on. for encoding_config in new_encoding_configs: encoding_type = encoding_config.get("type") if encoding_type == 'video': encoding_profile = encoding_config.get("profile") video_stream = Stream( codec_configuration_id=encoding_config.get("codec").id, input_streams=[video_input_stream], name='Stream {}p_{}k'.format(encoding_profile.get('height'), encoding_profile.get('bitrate'))) encoding_config['stream'] = bitmovin.encodings.Stream.create( object_=video_stream, encoding_id=encoding.id).resource if encoding_type == 'audio': audio_stream = Stream( codec_configuration_id=encoding_config.get("codec").id, input_streams=[audio_input_stream], name='Audio Stream') encoding_config['stream'] = bitmovin.encodings.Stream.create( object_=audio_stream, encoding_id=encoding.id).resource acl_entry = ACLEntry(permission=ACLPermission.PUBLIC_READ) # Create FMP4 muxings which are later used for the DASH manifest. The current settings will set a segment length # of 4 seconds. for encoding_config in new_encoding_configs: encoding_type = encoding_config.get("type") if encoding_type == 'video': encoding_profile = encoding_config.get("profile") video_muxing_stream = MuxingStream( encoding_config.get("stream").id) video_muxing_output = EncodingOutput( output_id=output.id, output_path=output_path + 'video/{}p_{}k/'.format(encoding_profile.get('height'), encoding_profile.get('bitrate')), acl=[acl_entry]) video_muxing = FMP4Muxing(segment_length=4, segment_naming='seg_%number%.m4s', init_segment_name='init.mp4', streams=[video_muxing_stream], outputs=[video_muxing_output], name='FMP4 Muxing {}p_{}k'.format( encoding_profile.get('height'), encoding_profile.get('bitrate'))) encoding_config['muxing'] = bitmovin.encodings.Muxing.FMP4.create( object_=video_muxing, encoding_id=encoding.id).resource if encoding_type == 'audio': audio_muxing_stream = MuxingStream( encoding_config.get("stream").id) audio_muxing_output = EncodingOutput(output_id=output.id, output_path=output_path + 'audio/', acl=[acl_entry]) audio_muxing = FMP4Muxing(segment_length=4, segment_naming='seg_%number%.m4s', init_segment_name='init.mp4', streams=[audio_muxing_stream], outputs=[audio_muxing_output], name='Audio FMP4 Muxing') encoding_config['muxing'] = bitmovin.encodings.Muxing.FMP4.create( object_=audio_muxing, encoding_id=encoding.id).resource start_encoding_request = StartEncodingRequest( encoding_mode=EncodingMode.SINGLE_PASS) bitmovin.encodings.Encoding.start( encoding_id=encoding.id, start_encoding_request=start_encoding_request) try: bitmovin.encodings.Encoding.wait_until_finished( encoding_id=encoding.id, check_interval=5) return new_encoding_configs except BitmovinError as bitmovin_error: print("Exception occurred while waiting for encoding to finish: {}". format(bitmovin_error))
def main(): bitmovin = Bitmovin(api_key=API_KEY) https_input = HTTPSInput(name='create_simple_encoding HTTPS input', host=HTTPS_INPUT_HOST) https_input = bitmovin.inputs.HTTPS.create(https_input).resource s3_output = S3Output(access_key=S3_OUTPUT_ACCESSKEY, secret_key=S3_OUTPUT_SECRETKEY, bucket_name=S3_OUTPUT_BUCKETNAME, name='Sample S3 Output') s3_output = bitmovin.outputs.S3.create(s3_output).resource encoding = Encoding( name='example hls progressive ts encoding with various id3 tags', cloud_region=CloudRegion.GOOGLE_EUROPE_WEST_1) encoding = bitmovin.encodings.Encoding.create(encoding).resource video_codec_configuration_480p = H264CodecConfiguration( name='example_video_codec_configuration_480p', bitrate=1200000, height=480, profile=H264Profile.MAIN, rate=None) video_codec_configuration_480p = bitmovin.codecConfigurations.H264.create( video_codec_configuration_480p).resource video_codec_configuration_360p = H264CodecConfiguration( name='example_video_codec_configuration_360p', bitrate=800000, height=360, profile=H264Profile.MAIN, rate=None) video_codec_configuration_360p = bitmovin.codecConfigurations.H264.create( video_codec_configuration_360p).resource audio_codec_configuration = AACCodecConfiguration( name='example_audio_codec_configuration_english', bitrate=128000, rate=44100) audio_codec_configuration = bitmovin.codecConfigurations.AAC.create( audio_codec_configuration).resource video_input_stream = StreamInput(input_id=https_input.id, input_path=HTTPS_INPUT_PATH, selection_mode=SelectionMode.AUTO) audio_input_stream = StreamInput(input_id=https_input.id, input_path=HTTPS_INPUT_PATH, selection_mode=SelectionMode.AUTO) video_stream_480p = Stream( codec_configuration_id=video_codec_configuration_480p.id, input_streams=[video_input_stream], name='Sample Stream 480p') video_stream_480p = bitmovin.encodings.Stream.create( object_=video_stream_480p, encoding_id=encoding.id).resource video_stream_360p = Stream( codec_configuration_id=video_codec_configuration_360p.id, input_streams=[video_input_stream], name='Sample Stream 360p') video_stream_360p = bitmovin.encodings.Stream.create( object_=video_stream_360p, encoding_id=encoding.id).resource audio_stream = Stream(codec_configuration_id=audio_codec_configuration.id, input_streams=[audio_input_stream], name='Sample Stream AUDIO') audio_stream = bitmovin.encodings.Stream.create( object_=audio_stream, encoding_id=encoding.id).resource acl_entry = ACLEntry(permission=ACLPermission.PUBLIC_READ) video_muxing_stream_480p = MuxingStream(video_stream_480p.id) video_muxing_stream_360p = MuxingStream(video_stream_360p.id) audio_muxing_stream = MuxingStream(audio_stream.id) muxing_480p_path = '480p' muxing_480p_output = EncodingOutput(output_id=s3_output.id, output_path=OUTPUT_BASE_PATH + muxing_480p_path, acl=[acl_entry]) muxing_480p = ProgressiveTSMuxing( segment_length=4, filename='progressive.ts', streams=[video_muxing_stream_480p, audio_muxing_stream], outputs=[muxing_480p_output], name='Sample Muxing 480p') muxing_480p = bitmovin.encodings.Muxing.ProgressiveTS.create( object_=muxing_480p, encoding_id=encoding.id).resource muxing_360p_path = '360p' muxing_360p_output = EncodingOutput(output_id=s3_output.id, output_path=OUTPUT_BASE_PATH + muxing_360p_path, acl=[acl_entry]) muxing_360p = ProgressiveTSMuxing( segment_length=4, filename='progressive.ts', streams=[video_muxing_stream_360p, audio_muxing_stream], outputs=[muxing_360p_output], name='Sample Muxing 360p') muxing_360p = bitmovin.encodings.Muxing.ProgressiveTS.create( object_=muxing_360p, encoding_id=encoding.id).resource raw_id3_tag_1 = RawID3Tag( position_mode=ID3TagPositionMode.TIME, time=1.0, bytes_=base64.b64encode(b'My awesome Raw ID3 Tag #1').decode('utf-8'), name='Raw ID3 #1', description='Just some descriptive information') raw_id3_tag_2 = RawID3Tag( position_mode=ID3TagPositionMode.TIME, time=2.0, bytes_=base64.b64encode(b'My awesome Raw ID3 Tag #2').decode('utf-8'), name='Raw ID3 #2', description='Just some descriptive information') frame_id_id3_tag_1 = FrameIdID3Tag( position_mode=ID3TagPositionMode.TIME, time=5.12, frame_id='ABCD', bytes_=base64.b64encode(b'My awesome FrameId ID3 Tag #1').decode( 'utf-8'), name='FrameId ID3 #1', description='Just some descriptive information') frame_id_id3_tag_2 = FrameIdID3Tag( position_mode=ID3TagPositionMode.TIME, time=6.3422172, frame_id='EFGH', bytes_=base64.b64encode(b'My awesome FrameId ID3 Tag #2').decode( 'utf-8'), name='FrameId ID3 #2', description='Just some descriptive information') plain_text_id3_tag_1 = PlainTextID3Tag( position_mode=ID3TagPositionMode.TIME, time=8.34, frame_id='IJKL', text='My awesome PlainText ID3 Tag #1', name='PlainText ID3 #1', description='Just some descriptive information') plain_text_id3_tag_2 = PlainTextID3Tag( position_mode=ID3TagPositionMode.TIME, time=9.013, frame_id='MNOP', text='My awesome PlainText ID3 Tag #2', name='PlainText ID3 #2', description='Just some descriptive information') bitmovin.encodings.Muxing.ProgressiveTS.ID3Tags.Raw.create( object_=raw_id3_tag_1, encoding_id=encoding.id, muxing_id=muxing_360p.id) bitmovin.encodings.Muxing.ProgressiveTS.ID3Tags.Raw.create( object_=raw_id3_tag_1, encoding_id=encoding.id, muxing_id=muxing_480p.id) bitmovin.encodings.Muxing.ProgressiveTS.ID3Tags.Raw.create( object_=raw_id3_tag_2, encoding_id=encoding.id, muxing_id=muxing_360p.id) bitmovin.encodings.Muxing.ProgressiveTS.ID3Tags.Raw.create( object_=raw_id3_tag_2, encoding_id=encoding.id, muxing_id=muxing_480p.id) bitmovin.encodings.Muxing.ProgressiveTS.ID3Tags.FrameId.create( object_=frame_id_id3_tag_1, encoding_id=encoding.id, muxing_id=muxing_360p.id) bitmovin.encodings.Muxing.ProgressiveTS.ID3Tags.FrameId.create( object_=frame_id_id3_tag_1, encoding_id=encoding.id, muxing_id=muxing_480p.id) bitmovin.encodings.Muxing.ProgressiveTS.ID3Tags.FrameId.create( object_=frame_id_id3_tag_2, encoding_id=encoding.id, muxing_id=muxing_360p.id) bitmovin.encodings.Muxing.ProgressiveTS.ID3Tags.FrameId.create( object_=frame_id_id3_tag_2, encoding_id=encoding.id, muxing_id=muxing_480p.id) bitmovin.encodings.Muxing.ProgressiveTS.ID3Tags.PlainText.create( object_=plain_text_id3_tag_1, encoding_id=encoding.id, muxing_id=muxing_360p.id) bitmovin.encodings.Muxing.ProgressiveTS.ID3Tags.PlainText.create( object_=plain_text_id3_tag_1, encoding_id=encoding.id, muxing_id=muxing_480p.id) bitmovin.encodings.Muxing.ProgressiveTS.ID3Tags.PlainText.create( object_=plain_text_id3_tag_2, encoding_id=encoding.id, muxing_id=muxing_360p.id) bitmovin.encodings.Muxing.ProgressiveTS.ID3Tags.PlainText.create( object_=plain_text_id3_tag_2, encoding_id=encoding.id, muxing_id=muxing_480p.id) bitmovin.encodings.Encoding.start(encoding_id=encoding.id) try: bitmovin.encodings.Encoding.wait_until_finished( encoding_id=encoding.id) except BitmovinError as bitmovin_error: print("Exception occurred while waiting for encoding to finish: {}". format(bitmovin_error)) manifest_output = EncodingOutput(output_id=s3_output.id, output_path=OUTPUT_BASE_PATH, acl=[acl_entry]) hls_manifest = HlsManifest( manifest_name='master.m3u8', outputs=[manifest_output], name='Sample HLS Manifest - Master - ProgressiveTS+ID3') hls_manifest = bitmovin.manifests.HLS.create(object_=hls_manifest).resource variant_stream_480p = VariantStream( closed_captions='NONE', segment_path='{}/'.format(muxing_480p_path), uri='480p.m3u8', encoding_id=encoding.id, stream_id=video_stream_480p.id, muxing_id=muxing_480p.id) variant_stream_480p = bitmovin.manifests.HLS.VariantStream.create( manifest_id=hls_manifest.id, object_=variant_stream_480p) variant_stream_360p = VariantStream( closed_captions='NONE', segment_path='{}/'.format(muxing_360p_path), uri='360p.m3u8', encoding_id=encoding.id, stream_id=video_stream_360p.id, muxing_id=muxing_360p.id) variant_stream_360p = bitmovin.manifests.HLS.VariantStream.create( manifest_id=hls_manifest.id, object_=variant_stream_360p) bitmovin.manifests.HLS.start(manifest_id=hls_manifest.id) try: bitmovin.manifests.HLS.wait_until_finished(manifest_id=hls_manifest.id) except BitmovinError as bitmovin_error: print( "Exception occurred while waiting for HLS manifest creation to finish: {}" .format(bitmovin_error))
def main(): bitmovin = Bitmovin(api_key=API_KEY) s3_input = S3Input(access_key=S3_INPUT_ACCESSKEY, secret_key=S3_INPUT_SECRETKEY, bucket_name=S3_INPUT_BUCKETNAME, name='Sample S3 Output') s3_input = bitmovin.inputs.S3.create(s3_input).resource s3_output = S3Output(access_key=S3_OUTPUT_ACCESSKEY, secret_key=S3_OUTPUT_SECRETKEY, bucket_name=S3_OUTPUT_BUCKETNAME, name='Sample S3 Output') s3_output = bitmovin.outputs.S3.create(s3_output).resource acl_entry = ACLEntry(permission=ACLPermission.PUBLIC_READ) encoding = Encoding(name='example mp4 encoding for smooth', cloud_region=CloudRegion.GOOGLE_EUROPE_WEST_1) encoding = bitmovin.encodings.Encoding.create(encoding).resource encoding_configs = [] # Iterate over all encoding profiles and create the H264 configuration with the defined height and bitrate. for idx, _ in enumerate(encoding_profiles_h264): profile_h264 = encoding_profiles_h264[idx] encoding_config = dict(profile_h264=profile_h264) h264_codec = H264CodecConfiguration( name='H264 Codec {}p {}k Configuration'.format( profile_h264.get('height'), profile_h264.get('bitrate')), bitrate=profile_h264.get('bitrate') * 1000, height=profile_h264.get('height'), profile=profile_h264.get('profile'), rate=profile_h264.get("fps")) encoding_config[ 'h264_codec'] = bitmovin.codecConfigurations.H264.create( h264_codec).resource encoding_configs.append(encoding_config) audio_codec_configuration = AACCodecConfiguration( name='example_audio_codec_configuration_english', bitrate=128000, rate=48000) audio_codec_configuration = bitmovin.codecConfigurations.AAC.create( audio_codec_configuration).resource video_input_stream = StreamInput(input_id=s3_input.id, input_path=S3_INPUT_PATH, selection_mode=SelectionMode.AUTO) audio_input_stream = StreamInput(input_id=s3_input.id, input_path=S3_INPUT_PATH, selection_mode=SelectionMode.AUTO) # With the configurations and the input file streams are now created and muxed later on. for encoding_config in encoding_configs: encoding_profile = encoding_config.get("profile_h264") video_stream_condition = Condition(attribute="HEIGHT", operator=">=", value=str( encoding_profile.get('height'))) video_stream_h264 = Stream( codec_configuration_id=encoding_config.get("h264_codec").id, input_streams=[video_input_stream], conditions=video_stream_condition, name='Stream H264 {}p_{}k'.format(encoding_profile.get('height'), encoding_profile.get('bitrate'))) encoding_config['h264_stream'] = bitmovin.encodings.Stream.create( object_=video_stream_h264, encoding_id=encoding.id).resource audio_stream_condition = Condition(attribute="INPUTSTREAM", operator="==", value="TRUE") audio_stream = Stream(codec_configuration_id=audio_codec_configuration.id, input_streams=[audio_input_stream], conditions=audio_stream_condition, name='Sample Stream AUDIO') audio_stream = bitmovin.encodings.Stream.create( object_=audio_stream, encoding_id=encoding.id).resource for encoding_config in encoding_configs: encoding_profile = encoding_config.get("profile_h264") video_muxing_stream_h264 = MuxingStream( encoding_config.get("h264_stream").id) video_muxing_output_h264 = EncodingOutput(output_id=s3_output.id, output_path=OUTPUT_BASE_PATH, acl=[acl_entry]) video_muxing_h264 = MP4Muxing( filename='video_{}p.ismv'.format(encoding_profile.get('height')), fragment_duration=4000, streams=[video_muxing_stream_h264], outputs=[video_muxing_output_h264], name='Sample Muxing {}p'.format(encoding_profile.get('height'))) encoding_config['h264_muxing'] = bitmovin.encodings.Muxing.MP4.create( object_=video_muxing_h264, encoding_id=encoding.id).resource audio_muxing_stream = MuxingStream(audio_stream.id) audio_muxing_output = EncodingOutput(output_id=s3_output.id, output_path=OUTPUT_BASE_PATH, acl=[acl_entry]) audio_muxing = MP4Muxing(filename='audio.isma', fragment_duration=4000, streams=[audio_muxing_stream], outputs=[audio_muxing_output], name='Sample Muxing AUDIO') audio_muxing = bitmovin.encodings.Muxing.MP4.create( object_=audio_muxing, encoding_id=encoding.id).resource bitmovin.encodings.Encoding.start(encoding_id=encoding.id) try: bitmovin.encodings.Encoding.wait_until_finished( encoding_id=encoding.id) except BitmovinError as bitmovin_error: print("Exception occurred while waiting for encoding to finish: {}". format(bitmovin_error)) manifest_output = EncodingOutput(output_id=s3_output.id, output_path=OUTPUT_BASE_PATH, acl=[acl_entry]) smooth_manifest = SmoothManifest( server_manifest_name='example_manifest_smooth.ism', client_manifest_name='example_manifest_smooth.ismc', outputs=[manifest_output], name='Sample SmoothStreaming Manifest') smooth_manifest = bitmovin.manifests.Smooth.create( object_=smooth_manifest).resource mp4_representation_audio = MP4Representation(encoding_id=encoding.id, muxing_id=audio_muxing.id, media_file='audio.isma') mp4_representation_audio = bitmovin.manifests.Smooth.MP4Representation.create( manifest_id=smooth_manifest.id, object_=mp4_representation_audio) for encoding_config in encoding_configs: encoding_profile = encoding_config.get("profile_h264") muxing = encoding_config.get('h264_muxing') mp4_representation = MP4Representation( encoding_id=encoding.id, muxing_id=muxing.id, media_file='video_{}p.ismv'.format(encoding_profile.get('height'))) encoding_config[ 'h264_smooth'] = bitmovin.manifests.Smooth.MP4Representation.create( manifest_id=smooth_manifest.id, object_=mp4_representation) bitmovin.manifests.Smooth.start(manifest_id=smooth_manifest.id) try: bitmovin.manifests.Smooth.wait_until_finished( manifest_id=smooth_manifest.id) except BitmovinError as bitmovin_error: print( "Exception occurred while waiting for Smooth manifest creation to finish: {}" .format(bitmovin_error))
def createH264Rendition(encoding, dash_manifest, period, adaptation_set, hls_manifest, audio_group_id, video_input_stream, output, output_path, bitrate, rate, width, height, profile): dash_output_path = output_path + '/dash' hls_output_path = output_path + '/hls' stream_identifier = str(bitrate) + '_' + str(width) + 'x' + str(height) codec_configuration = H264CodecConfiguration(name='h264_config_' + stream_identifier, bitrate=bitrate, rate=rate, width=width, height=height, profile=profile) codec_configuration = bitmovin.codecConfigurations.H264.create( codec_configuration).resource video_stream = Stream(name='stream_' + stream_identifier, codec_configuration_id=codec_configuration.id, input_streams=[video_input_stream]) video_stream = bitmovin.encodings.Stream.create( object_=video_stream, encoding_id=encoding.id).resource video_muxing_stream = MuxingStream(video_stream.id) acl_entry = ACLEntry(permission=ACLPermission.PUBLIC_READ) video_muxing_fmp4_output = EncodingOutput(output_id=output.id, output_path=OUTPUT_BASE_PATH + dash_output_path, acl=[acl_entry]) video_muxing_fmp4 = FMP4Muxing(name='fmp4_muxing_' + stream_identifier, segment_length=SEGMENT_LENGTH, segment_naming='seg_%number%.m4s', init_segment_name='init.mp4', streams=[video_muxing_stream], outputs=[video_muxing_fmp4_output]) video_muxing_fmp4 = bitmovin.encodings.Muxing.FMP4.create( object_=video_muxing_fmp4, encoding_id=encoding.id).resource video_muxing_ts_output = EncodingOutput(output_id=output.id, output_path=OUTPUT_BASE_PATH + hls_output_path, acl=[acl_entry]) video_muxing_ts = TSMuxing(name='ts_muxing_' + stream_identifier, segment_length=SEGMENT_LENGTH, segment_naming='seg_%number%.ts', streams=[video_muxing_stream], outputs=[video_muxing_ts_output]) video_muxing_ts = bitmovin.encodings.Muxing.TS.create( object_=video_muxing_ts, encoding_id=encoding.id).resource fmp4_representation = FMP4Representation(FMP4RepresentationType.TEMPLATE, encoding_id=encoding.id, muxing_id=video_muxing_fmp4.id, segment_path=dash_output_path) fmp4_representation = bitmovin.manifests.DASH.add_fmp4_representation( object_=fmp4_representation, manifest_id=dash_manifest.id, period_id=period.id, adaptationset_id=adaptation_set.id).resource variant_stream = VariantStream(audio=audio_group_id, uri='video_' + stream_identifier + '.m3u8', segment_path=hls_output_path, encoding_id=encoding.id, stream_id=video_stream.id, muxing_id=video_muxing_ts.id, closed_captions='NONE') variant_stream = bitmovin.manifests.HLS.VariantStream.create( object_=variant_stream, manifest_id=hls_manifest.id)
def main(): bitmovin = Bitmovin(api_key=API_KEY) s3_input = S3Input(access_key=S3_INPUT_ACCESSKEY, secret_key=S3_INPUT_SECRETKEY, bucket_name=S3_INPUT_BUCKETNAME, name='Sample S3 Output') s3_input = bitmovin.inputs.S3.create(s3_input).resource s3_output = S3Output(access_key=S3_OUTPUT_ACCESSKEY, secret_key=S3_OUTPUT_SECRETKEY, bucket_name=S3_OUTPUT_BUCKETNAME, name='Sample S3 Output') s3_output = bitmovin.outputs.S3.create(s3_output).resource encoding = Encoding(name='hls fairplay example encoding - {}'.format(date_component)) encoding = bitmovin.encodings.Encoding.create(encoding).resource video_codec_configuration_480p = H264CodecConfiguration(name='example_video_codec_configuration_480p', bitrate=1200000, rate=None, height=480, profile=H264Profile.HIGH) video_codec_configuration_480p = bitmovin.codecConfigurations.H264.create(video_codec_configuration_480p).resource video_codec_configuration_360p = H264CodecConfiguration(name='example_video_codec_configuration_360p', bitrate=800000, rate=None, height=360, profile=H264Profile.HIGH) video_codec_configuration_360p = bitmovin.codecConfigurations.H264.create(video_codec_configuration_360p).resource video_codec_configuration_240p = H264CodecConfiguration(name='example_video_codec_configuration_240p', bitrate=400000, rate=None, height=240, profile=H264Profile.HIGH) video_codec_configuration_240p = bitmovin.codecConfigurations.H264.create(video_codec_configuration_240p).resource audio_codec_configuration_stereo = AACCodecConfiguration(name='example_audio_codec_configuration_stereo', bitrate=128000, rate=48000) audio_codec_configuration_stereo = bitmovin.codecConfigurations.AAC.create( audio_codec_configuration_stereo).resource video_input_stream = StreamInput(input_id=s3_input.id, input_path=S3_INPUT_PATH, selection_mode=SelectionMode.AUTO) audio_input_stream_en_stereo = StreamInput(input_id=s3_input.id, input_path=S3_INPUT_PATH, selection_mode=SelectionMode.AUTO) video_stream_480p = Stream(codec_configuration_id=video_codec_configuration_480p.id, input_streams=[video_input_stream], name='Sample Stream 480p') video_stream_480p = bitmovin.encodings.Stream.create(object_=video_stream_480p, encoding_id=encoding.id).resource video_stream_360p = Stream(codec_configuration_id=video_codec_configuration_360p.id, input_streams=[video_input_stream], name='Sample Stream 360p') video_stream_360p = bitmovin.encodings.Stream.create(object_=video_stream_360p, encoding_id=encoding.id).resource video_stream_240p = Stream(codec_configuration_id=video_codec_configuration_240p.id, input_streams=[video_input_stream], name='Sample Stream 240p') video_stream_240p = bitmovin.encodings.Stream.create(object_=video_stream_240p, encoding_id=encoding.id).resource audio_stream_en_stereo = Stream(codec_configuration_id=audio_codec_configuration_stereo.id, input_streams=[audio_input_stream_en_stereo], name='Sample Audio Stream EN Stereo') audio_stream_en_stereo = bitmovin.encodings.Stream.create(object_=audio_stream_en_stereo, encoding_id=encoding.id).resource acl_entry = ACLEntry(permission=ACLPermission.PUBLIC_READ) video_muxing_stream_480p = MuxingStream(video_stream_480p.id) video_muxing_stream_360p = MuxingStream(video_stream_360p.id) video_muxing_stream_240p = MuxingStream(video_stream_240p.id) audio_muxing_stream_en_stereo = MuxingStream(audio_stream_en_stereo.id) video_muxing_480p_output = EncodingOutput(output_id=s3_output.id, output_path=OUTPUT_BASE_PATH + 'video/hls/480p', acl=[acl_entry]) video_muxing_480p = TSMuxing(segment_length=4, segment_naming='seg_%number%.ts', streams=[video_muxing_stream_480p], name='Sample Muxing 480p') video_muxing_480p = bitmovin.encodings.Muxing.TS.create(object_=video_muxing_480p, encoding_id=encoding.id).resource fair_play_480p = FairPlayDRM(key=FAIRPLAY_KEY, iv=FAIRPLAY_IV, uri=FAIRPLAY_URI, outputs=[video_muxing_480p_output], name='FairPlay 480p') fair_play_480p = bitmovin.encodings.Muxing.TS.DRM.FairPlay.create(object_=fair_play_480p, encoding_id=encoding.id, muxing_id=video_muxing_480p.id).resource video_muxing_360p_output = EncodingOutput(output_id=s3_output.id, output_path=OUTPUT_BASE_PATH + 'video/hls/360p', acl=[acl_entry]) video_muxing_360p = TSMuxing(segment_length=4, segment_naming='seg_%number%.ts', streams=[video_muxing_stream_360p], name='Sample Muxing 360p') video_muxing_360p = bitmovin.encodings.Muxing.TS.create(object_=video_muxing_360p, encoding_id=encoding.id).resource fair_play_360p = FairPlayDRM(key=FAIRPLAY_KEY, iv=FAIRPLAY_IV, uri=FAIRPLAY_URI, outputs=[video_muxing_360p_output], name='FairPlay 360p') fair_play_360p = bitmovin.encodings.Muxing.TS.DRM.FairPlay.create(object_=fair_play_360p, encoding_id=encoding.id, muxing_id=video_muxing_360p.id).resource video_muxing_240p_output = EncodingOutput(output_id=s3_output.id, output_path=OUTPUT_BASE_PATH + 'video/hls/240p', acl=[acl_entry]) video_muxing_240p = TSMuxing(segment_length=4, segment_naming='seg_%number%.ts', streams=[video_muxing_stream_240p], name='Sample Muxing 240p') video_muxing_240p = bitmovin.encodings.Muxing.TS.create(object_=video_muxing_240p, encoding_id=encoding.id).resource fair_play_240p = FairPlayDRM(key=FAIRPLAY_KEY, iv=FAIRPLAY_IV, uri=FAIRPLAY_URI, outputs=[video_muxing_240p_output], name='FairPlay 240p') fair_play_240p = bitmovin.encodings.Muxing.TS.DRM.FairPlay.create(object_=fair_play_240p, encoding_id=encoding.id, muxing_id=video_muxing_240p.id).resource audio_muxing_output_en_stereo = EncodingOutput(output_id=s3_output.id, output_path=OUTPUT_BASE_PATH + 'audio/hls/en_2_0', acl=[acl_entry]) audio_muxing_en_stereo = TSMuxing(segment_length=4, segment_naming='seg_%number%.ts', streams=[audio_muxing_stream_en_stereo], name='Sample Audio Muxing EN Stereo') audio_muxing_en_stereo = bitmovin.encodings.Muxing.TS.create(object_=audio_muxing_en_stereo, encoding_id=encoding.id).resource fair_play_audio = FairPlayDRM(key=FAIRPLAY_KEY, iv=FAIRPLAY_IV, uri=FAIRPLAY_URI, outputs=[audio_muxing_output_en_stereo], name='FairPlay Audio') fair_play_audio = bitmovin.encodings.Muxing.TS.DRM.FairPlay.create(object_=fair_play_audio, encoding_id=encoding.id, muxing_id=audio_muxing_en_stereo.id).resource bitmovin.encodings.Encoding.start(encoding_id=encoding.id) try: bitmovin.encodings.Encoding.wait_until_finished(encoding_id=encoding.id) except BitmovinError as bitmovin_error: print("Exception occurred while waiting for encoding to finish: {}".format(bitmovin_error)) # Manifest ## manifest_output = EncodingOutput(output_id=s3_output.id, output_path=OUTPUT_BASE_PATH, acl=[acl_entry]) hls_manifest = HlsManifest(manifest_name='example_manifest_hls.m3u8', outputs=[manifest_output], name='Sample HLS FairPlay Manifest') hls_manifest = bitmovin.manifests.HLS.create(hls_manifest).resource audio_media = AudioMedia(name='Sample Audio Media', group_id='audio_group', segment_path=audio_muxing_output_en_stereo.outputPath, encoding_id=encoding.id, stream_id=audio_stream_en_stereo.id, muxing_id=audio_muxing_en_stereo.id, drm_id=fair_play_audio.id, language='en', uri='audiomedia.m3u8') audio_media = bitmovin.manifests.HLS.AudioMedia.create(manifest_id=hls_manifest.id, object_=audio_media).resource variant_stream_480p = VariantStream(audio=audio_media.groupId, closed_captions='NONE', segment_path=video_muxing_480p_output.outputPath, uri='video_480p.m3u8', encoding_id=encoding.id, stream_id=video_stream_480p.id, muxing_id=video_muxing_480p.id, drm_id=fair_play_480p.id) bitmovin.manifests.HLS.VariantStream.create(manifest_id=hls_manifest.id, object_=variant_stream_480p) variant_stream_360p = VariantStream(audio=audio_media.groupId, closed_captions='NONE', segment_path=video_muxing_360p_output.outputPath, uri='video_360p.m3u8', encoding_id=encoding.id, stream_id=video_stream_360p.id, muxing_id=video_muxing_360p.id, drm_id=fair_play_360p.id) bitmovin.manifests.HLS.VariantStream.create(manifest_id=hls_manifest.id, object_=variant_stream_360p) variant_stream_240p = VariantStream(audio=audio_media.groupId, closed_captions='NONE', segment_path=video_muxing_240p_output.outputPath, uri='video_240p.m3u8', encoding_id=encoding.id, stream_id=video_stream_240p.id, muxing_id=video_muxing_240p.id, drm_id=fair_play_240p.id) bitmovin.manifests.HLS.VariantStream.create(manifest_id=hls_manifest.id, object_=variant_stream_240p) bitmovin.manifests.HLS.start(manifest_id=hls_manifest.id) try: bitmovin.manifests.HLS.wait_until_finished(manifest_id=hls_manifest.id) except BitmovinError as bitmovin_error: print("Exception occurred while waiting for HLS manifest creation to finish: {}".format(bitmovin_error))
def main(): bitmovin = Bitmovin(api_key=API_KEY) sftp_input = SFTPInput(host=SFTP_INPUT_HOST, username=SFTP_INPUT_USER, password=SFTP_INPUT_PASSWORD, name='multiple_audio_dash_mpd SFTP input') sftp_input = bitmovin.inputs.SFTP.create(sftp_input).resource s3_output = S3Output(access_key=S3_OUTPUT_ACCESSKEY, secret_key=S3_OUTPUT_SECRETKEY, bucket_name=S3_OUTPUT_BUCKETNAME, name='Sample S3 Output') s3_output = bitmovin.outputs.S3.create(s3_output).resource encoding = Encoding(name='example encoding', cloud_region=CloudRegion.GOOGLE_EUROPE_WEST_1) encoding = bitmovin.encodings.Encoding.create(encoding).resource video_codec_configuration_1080p = H264CodecConfiguration( name='example_video_codec_configuration_1080p', bitrate=4800000, rate=25.0, width=1920, height=1080, profile=H264Profile.HIGH) video_codec_configuration_1080p = bitmovin.codecConfigurations.H264.create( video_codec_configuration_1080p).resource video_codec_configuration_720p = H264CodecConfiguration( name='example_video_codec_configuration_720p', bitrate=2400000, rate=25.0, width=1280, height=720, profile=H264Profile.HIGH) video_codec_configuration_720p = bitmovin.codecConfigurations.H264.create( video_codec_configuration_720p).resource video_codec_configuration_480p = H264CodecConfiguration( name='example_video_codec_configuration_480p', bitrate=1200000, rate=25.0, width=854, height=480, profile=H264Profile.HIGH) video_codec_configuration_480p = bitmovin.codecConfigurations.H264.create( video_codec_configuration_480p).resource video_codec_configuration_360p = H264CodecConfiguration( name='example_video_codec_configuration_360p', bitrate=800000, rate=25.0, width=640, height=360, profile=H264Profile.HIGH) video_codec_configuration_360p = bitmovin.codecConfigurations.H264.create( video_codec_configuration_360p).resource video_codec_configuration_240p = H264CodecConfiguration( name='example_video_codec_configuration_240p', bitrate=400000, rate=25.0, width=426, height=240, profile=H264Profile.HIGH) video_codec_configuration_240p = bitmovin.codecConfigurations.H264.create( video_codec_configuration_240p).resource audio_codec_configuration_stereo = AACCodecConfiguration( name='example_audio_codec_configuration_stereo', bitrate=128000, rate=48000) audio_codec_configuration_stereo = bitmovin.codecConfigurations.AAC.create( audio_codec_configuration_stereo).resource audio_codec_configuration_5_1 = AACCodecConfiguration( name='example_audio_codec_configuration_5_1', bitrate=384000, rate=48000) audio_codec_configuration_5_1 = bitmovin.codecConfigurations.AAC.create( audio_codec_configuration_5_1).resource video_input_stream = StreamInput( input_id=sftp_input.id, input_path=SFTP_INPUT_PATH, selection_mode=SelectionMode.POSITION_ABSOLUTE, position=0) audio_input_stream_cz_stereo = StreamInput( input_id=sftp_input.id, input_path=SFTP_INPUT_PATH, selection_mode=SelectionMode.POSITION_ABSOLUTE, position=1) audio_input_stream_en_stereo = StreamInput( input_id=sftp_input.id, input_path=SFTP_INPUT_PATH, selection_mode=SelectionMode.POSITION_ABSOLUTE, position=2) audio_input_stream_cz_5_1 = StreamInput( input_id=sftp_input.id, input_path=SFTP_INPUT_PATH, selection_mode=SelectionMode.POSITION_ABSOLUTE, position=3) audio_input_stream_en_5_1 = StreamInput( input_id=sftp_input.id, input_path=SFTP_INPUT_PATH, selection_mode=SelectionMode.POSITION_ABSOLUTE, position=4) video_stream_1080p = Stream( codec_configuration_id=video_codec_configuration_1080p.id, input_streams=[video_input_stream], name='Sample Stream 1080p') video_stream_1080p = bitmovin.encodings.Stream.create( object_=video_stream_1080p, encoding_id=encoding.id).resource video_stream_720p = Stream( codec_configuration_id=video_codec_configuration_720p.id, input_streams=[video_input_stream], name='Sample Stream 720p') video_stream_720p = bitmovin.encodings.Stream.create( object_=video_stream_720p, encoding_id=encoding.id).resource video_stream_480p = Stream( codec_configuration_id=video_codec_configuration_480p.id, input_streams=[video_input_stream], name='Sample Stream 480p') video_stream_480p = bitmovin.encodings.Stream.create( object_=video_stream_480p, encoding_id=encoding.id).resource video_stream_360p = Stream( codec_configuration_id=video_codec_configuration_360p.id, input_streams=[video_input_stream], name='Sample Stream 360p') video_stream_360p = bitmovin.encodings.Stream.create( object_=video_stream_360p, encoding_id=encoding.id).resource video_stream_240p = Stream( codec_configuration_id=video_codec_configuration_240p.id, input_streams=[video_input_stream], name='Sample Stream 240p') video_stream_240p = bitmovin.encodings.Stream.create( object_=video_stream_240p, encoding_id=encoding.id).resource audio_stream_cz_stereo = Stream( codec_configuration_id=audio_codec_configuration_stereo.id, input_streams=[audio_input_stream_cz_stereo], name='Sample Audio Stream CZ Stereo') audio_stream_cz_stereo = bitmovin.encodings.Stream.create( object_=audio_stream_cz_stereo, encoding_id=encoding.id).resource audio_stream_en_stereo = Stream( codec_configuration_id=audio_codec_configuration_stereo.id, input_streams=[audio_input_stream_en_stereo], name='Sample Audio Stream EN Stereo') audio_stream_en_stereo = bitmovin.encodings.Stream.create( object_=audio_stream_en_stereo, encoding_id=encoding.id).resource audio_stream_cz_5_1 = Stream( codec_configuration_id=audio_codec_configuration_5_1.id, input_streams=[audio_input_stream_cz_5_1], name='Sample Audio Stream CZ 5.1') audio_stream_cz_5_1 = bitmovin.encodings.Stream.create( object_=audio_stream_cz_5_1, encoding_id=encoding.id).resource audio_stream_en_5_1 = Stream( codec_configuration_id=audio_codec_configuration_5_1.id, input_streams=[audio_input_stream_en_5_1], name='Sample Audio Stream EN 5.1') audio_stream_en_5_1 = bitmovin.encodings.Stream.create( object_=audio_stream_en_5_1, encoding_id=encoding.id).resource acl_entry = ACLEntry(permission=ACLPermission.PUBLIC_READ) video_muxing_stream_1080p = MuxingStream(video_stream_1080p.id) video_muxing_stream_720p = MuxingStream(video_stream_720p.id) video_muxing_stream_480p = MuxingStream(video_stream_480p.id) video_muxing_stream_360p = MuxingStream(video_stream_360p.id) video_muxing_stream_240p = MuxingStream(video_stream_240p.id) audio_muxing_stream_cz_stereo = MuxingStream(audio_stream_cz_stereo.id) audio_muxing_stream_en_stereo = MuxingStream(audio_stream_en_stereo.id) audio_muxing_stream_cz_5_1 = MuxingStream(audio_stream_cz_5_1.id) audio_muxing_stream_en_5_1 = MuxingStream(audio_stream_en_5_1.id) video_muxing_1080p_output = EncodingOutput(output_id=s3_output.id, output_path=OUTPUT_BASE_PATH + 'video/1080p/', acl=[acl_entry]) video_muxing_1080p = FMP4Muxing(segment_length=4, segment_naming='seg_%number%.m4s', init_segment_name='init.mp4', streams=[video_muxing_stream_1080p], outputs=[video_muxing_1080p_output], name='Sample Muxing 1080p') video_muxing_1080p = bitmovin.encodings.Muxing.FMP4.create( object_=video_muxing_1080p, encoding_id=encoding.id).resource video_muxing_720p_output = EncodingOutput(output_id=s3_output.id, output_path=OUTPUT_BASE_PATH + 'video/720p/', acl=[acl_entry]) video_muxing_720p = FMP4Muxing(segment_length=4, segment_naming='seg_%number%.m4s', init_segment_name='init.mp4', streams=[video_muxing_stream_720p], outputs=[video_muxing_720p_output], name='Sample Muxing 720p') video_muxing_720p = bitmovin.encodings.Muxing.FMP4.create( object_=video_muxing_720p, encoding_id=encoding.id).resource video_muxing_480p_output = EncodingOutput(output_id=s3_output.id, output_path=OUTPUT_BASE_PATH + 'video/480p/', acl=[acl_entry]) video_muxing_480p = FMP4Muxing(segment_length=4, segment_naming='seg_%number%.m4s', init_segment_name='init.mp4', streams=[video_muxing_stream_480p], outputs=[video_muxing_480p_output], name='Sample Muxing 480p') video_muxing_480p = bitmovin.encodings.Muxing.FMP4.create( object_=video_muxing_480p, encoding_id=encoding.id).resource video_muxing_360p_output = EncodingOutput(output_id=s3_output.id, output_path=OUTPUT_BASE_PATH + 'video/360p/', acl=[acl_entry]) video_muxing_360p = FMP4Muxing(segment_length=4, segment_naming='seg_%number%.m4s', init_segment_name='init.mp4', streams=[video_muxing_stream_360p], outputs=[video_muxing_360p_output], name='Sample Muxing 360p') video_muxing_360p = bitmovin.encodings.Muxing.FMP4.create( object_=video_muxing_360p, encoding_id=encoding.id).resource video_muxing_240p_output = EncodingOutput(output_id=s3_output.id, output_path=OUTPUT_BASE_PATH + 'video/240p/', acl=[acl_entry]) video_muxing_240p = FMP4Muxing(segment_length=4, segment_naming='seg_%number%.m4s', init_segment_name='init.mp4', streams=[video_muxing_stream_240p], outputs=[video_muxing_240p_output], name='Sample Muxing 240p') video_muxing_240p = bitmovin.encodings.Muxing.FMP4.create( object_=video_muxing_240p, encoding_id=encoding.id).resource audio_muxing_output_en_stereo = EncodingOutput( output_id=s3_output.id, output_path=OUTPUT_BASE_PATH + 'audio/en_2_0/', acl=[acl_entry]) audio_muxing_en_stereo = FMP4Muxing( segment_length=4, segment_naming='seg_%number%.m4s', init_segment_name='init.mp4', streams=[audio_muxing_stream_en_stereo], outputs=[audio_muxing_output_en_stereo], name='Sample Audio Muxing EN Stereo') audio_muxing_en_stereo = bitmovin.encodings.Muxing.FMP4.create( object_=audio_muxing_en_stereo, encoding_id=encoding.id).resource audio_muxing_output_cz_stereo = EncodingOutput( output_id=s3_output.id, output_path=OUTPUT_BASE_PATH + 'audio/cz_2_0/', acl=[acl_entry]) audio_muxing_cz_stereo = FMP4Muxing( segment_length=4, segment_naming='seg_%number%.m4s', init_segment_name='init.mp4', streams=[audio_muxing_stream_cz_stereo], outputs=[audio_muxing_output_cz_stereo], name='Sample Audio Muxing CZ Stereo') audio_muxing_cz_stereo = bitmovin.encodings.Muxing.FMP4.create( object_=audio_muxing_cz_stereo, encoding_id=encoding.id).resource audio_muxing_output_en_5_1 = EncodingOutput(output_id=s3_output.id, output_path=OUTPUT_BASE_PATH + 'audio/en_5_1/', acl=[acl_entry]) audio_muxing_en_5_1 = FMP4Muxing(segment_length=4, segment_naming='seg_%number%.m4s', init_segment_name='init.mp4', streams=[audio_muxing_stream_en_5_1], outputs=[audio_muxing_output_en_5_1], name='Sample Audio Muxing EN 5.1') audio_muxing_en_5_1 = bitmovin.encodings.Muxing.FMP4.create( object_=audio_muxing_en_5_1, encoding_id=encoding.id).resource audio_muxing_output_cz_5_1 = EncodingOutput(output_id=s3_output.id, output_path=OUTPUT_BASE_PATH + 'audio/cz_5_1/', acl=[acl_entry]) audio_muxing_cz_5_1 = FMP4Muxing(segment_length=4, segment_naming='seg_%number%.m4s', init_segment_name='init.mp4', streams=[audio_muxing_stream_cz_5_1], outputs=[audio_muxing_output_cz_5_1], name='Sample Audio Muxing CZ 5.1') audio_muxing_cz_5_1 = bitmovin.encodings.Muxing.FMP4.create( object_=audio_muxing_cz_5_1, encoding_id=encoding.id).resource bitmovin.encodings.Encoding.start(encoding_id=encoding.id) try: bitmovin.encodings.Encoding.wait_until_finished( encoding_id=encoding.id) except BitmovinError as bitmovin_error: print("Exception occurred while waiting for encoding to finish: {}". format(bitmovin_error)) #################################################################################################################### manifest_output = EncodingOutput(output_id=s3_output.id, output_path=OUTPUT_BASE_PATH, acl=[acl_entry]) dash_manifest = DashManifest(manifest_name='example_manifest_dash.mpd', outputs=[manifest_output], name='Sample DASH Manifest') dash_manifest = bitmovin.manifests.DASH.create(dash_manifest).resource period = Period() period = bitmovin.manifests.DASH.add_period( object_=period, manifest_id=dash_manifest.id).resource video_adaptation_set = VideoAdaptationSet() video_adaptation_set = bitmovin.manifests.DASH.add_video_adaptation_set( object_=video_adaptation_set, manifest_id=dash_manifest.id, period_id=period.id).resource fmp4_representation_1080p = FMP4Representation( FMP4RepresentationType.TEMPLATE, encoding_id=encoding.id, muxing_id=video_muxing_1080p.id, segment_path='video/1080p/') fmp4_representation_1080p = bitmovin.manifests.DASH.add_fmp4_representation( object_=fmp4_representation_1080p, manifest_id=dash_manifest.id, period_id=period.id, adaptationset_id=video_adaptation_set.id).resource fmp4_representation_720p = FMP4Representation( FMP4RepresentationType.TEMPLATE, encoding_id=encoding.id, muxing_id=video_muxing_720p.id, segment_path='video/720p/') fmp4_representation_720p = bitmovin.manifests.DASH.add_fmp4_representation( object_=fmp4_representation_720p, manifest_id=dash_manifest.id, period_id=period.id, adaptationset_id=video_adaptation_set.id).resource fmp4_representation_480p = FMP4Representation( FMP4RepresentationType.TEMPLATE, encoding_id=encoding.id, muxing_id=video_muxing_480p.id, segment_path='video/480p/') fmp4_representation_480p = bitmovin.manifests.DASH.add_fmp4_representation( object_=fmp4_representation_480p, manifest_id=dash_manifest.id, period_id=period.id, adaptationset_id=video_adaptation_set.id).resource fmp4_representation_360p = FMP4Representation( FMP4RepresentationType.TEMPLATE, encoding_id=encoding.id, muxing_id=video_muxing_360p.id, segment_path='video/360p/') fmp4_representation_360p = bitmovin.manifests.DASH.add_fmp4_representation( object_=fmp4_representation_360p, manifest_id=dash_manifest.id, period_id=period.id, adaptationset_id=video_adaptation_set.id).resource fmp4_representation_240p = FMP4Representation( FMP4RepresentationType.TEMPLATE, encoding_id=encoding.id, muxing_id=video_muxing_240p.id, segment_path='video/240p/') fmp4_representation_240p = bitmovin.manifests.DASH.add_fmp4_representation( object_=fmp4_representation_240p, manifest_id=dash_manifest.id, period_id=period.id, adaptationset_id=video_adaptation_set.id).resource audio_adaptation_set_cz_2_0 = AudioAdaptationSet(lang='CZ 2.0') audio_adaptation_set_cz_2_0 = bitmovin.manifests.DASH.add_audio_adaptation_set( object_=audio_adaptation_set_cz_2_0, manifest_id=dash_manifest.id, period_id=period.id).resource fmp4_representation_audio_cz_2_0 = FMP4Representation( FMP4RepresentationType.TEMPLATE, encoding_id=encoding.id, muxing_id=audio_muxing_cz_stereo.id, segment_path='audio/cz_2_0/') fmp4_representation_audio_cz_2_0 = bitmovin.manifests.DASH.add_fmp4_representation( object_=fmp4_representation_audio_cz_2_0, manifest_id=dash_manifest.id, period_id=period.id, adaptationset_id=audio_adaptation_set_cz_2_0.id).resource audio_adaptation_set_en_2_0 = AudioAdaptationSet(lang='EN 2.0') audio_adaptation_set_en_2_0 = bitmovin.manifests.DASH.add_audio_adaptation_set( object_=audio_adaptation_set_en_2_0, manifest_id=dash_manifest.id, period_id=period.id).resource fmp4_representation_audio_en_2_0 = FMP4Representation( FMP4RepresentationType.TEMPLATE, encoding_id=encoding.id, muxing_id=audio_muxing_en_stereo.id, segment_path='audio/en_2_0/') fmp4_representation_audio_en_2_0 = bitmovin.manifests.DASH.add_fmp4_representation( object_=fmp4_representation_audio_en_2_0, manifest_id=dash_manifest.id, period_id=period.id, adaptationset_id=audio_adaptation_set_en_2_0.id).resource audio_adaptation_set_cz_5_1 = AudioAdaptationSet(lang='CZ 5.1') audio_adaptation_set_cz_5_1 = bitmovin.manifests.DASH.add_audio_adaptation_set( object_=audio_adaptation_set_cz_5_1, manifest_id=dash_manifest.id, period_id=period.id).resource fmp4_representation_audio_cz_5_1 = FMP4Representation( FMP4RepresentationType.TEMPLATE, encoding_id=encoding.id, muxing_id=audio_muxing_cz_5_1.id, segment_path='audio/cz_5_1/') fmp4_representation_audio_cz_5_1 = bitmovin.manifests.DASH.add_fmp4_representation( object_=fmp4_representation_audio_cz_5_1, manifest_id=dash_manifest.id, period_id=period.id, adaptationset_id=audio_adaptation_set_cz_5_1.id).resource audio_adaptation_set_en_5_1 = AudioAdaptationSet(lang='EN 5.1') audio_adaptation_set_en_5_1 = bitmovin.manifests.DASH.add_audio_adaptation_set( object_=audio_adaptation_set_en_5_1, manifest_id=dash_manifest.id, period_id=period.id).resource fmp4_representation_audio_en_5_1 = FMP4Representation( FMP4RepresentationType.TEMPLATE, encoding_id=encoding.id, muxing_id=audio_muxing_en_5_1.id, segment_path='audio/en_5_1/') fmp4_representation_audio_en_5_1 = bitmovin.manifests.DASH.add_fmp4_representation( object_=fmp4_representation_audio_en_5_1, manifest_id=dash_manifest.id, period_id=period.id, adaptationset_id=audio_adaptation_set_en_5_1.id).resource bitmovin.manifests.DASH.start(manifest_id=dash_manifest.id) try: bitmovin.manifests.DASH.wait_until_finished( manifest_id=dash_manifest.id) except BitmovinError as bitmovin_error: print( "Exception occurred while waiting for manifest creation to finish: {}" .format(bitmovin_error))
def main(): bitmovin = Bitmovin(api_key=API_KEY, tenant_org_id=ORG_ID) # Create an HTTP Input s3_input = S3Input(access_key=S3_INPUT_ACCESSKEY, secret_key=S3_INPUT_SECRETKEY, bucket_name=S3_INPUT_BUCKETNAME) s3_input = bitmovin.inputs.S3.create(s3_input).resource # Create an S3 Output. This will be used as target bucket for the muxings, sprites and manifests s3_output = S3Output(access_key=S3_OUTPUT_ACCESSKEY, secret_key=S3_OUTPUT_SECRETKEY, bucket_name=S3_OUTPUT_BUCKETNAME, name='S3 Output') s3_output = bitmovin.outputs.S3.create(s3_output).resource acl_entry = ACLEntry(permission=ACLPermission.PRIVATE) # Create an Encoding. This is the base entity used to configure the encoding. encoding = Encoding(name='Python sample for Broadcast TS encoding', cloud_region=CloudRegion.AUTO) encoding = bitmovin.encodings.Encoding.create(encoding).resource # Create an H264 configuration for HD video hd_video_config = H264CodecConfiguration( name='HD_video_config', width=1920, height=1080, bitrate=6_000_000, bufsize=7_000_000, max_bitrate=7_000_000, profile=H264Profile.HIGH, cabac=True, bframes=3, b_adapt=BAdapt.FULL, sub_me=H264SubMe.RD_REF_IP, motion_estimation_method=H264MotionEstimationMethod.UMH, qp_max=51, qp_min=1, ref_frames=2, level=H264Level.L4_1, min_gop=1, max_gop=25, open_gop=True, interlaceMode=H264InterlaceMode.TOP_FIELD_FIRST, slices=1, rc_lookahead=60, partitions=[ H264Partition.I4X4, H264Partition.I8X8, H264Partition.P8X8, H264Partition.B8X8 ], rate=25.0, b_pyramid=H264BPyramid.NONE, nal_hrd=H264NalHrd.VBR, trellis=H264Trellis.ENABLED_ALL, sample_aspect_ratio_numerator=1, sample_aspect_ratio_denominator=1, color_config=ColorConfig(input_color_range=InputColorRange.MPEG, color_space=ColorSpace.BT709, color_primaries=ColorPrimaries.BT709, color_transfer=ColorTransfer.BT709, color_range=ColorRange.MPEG, chroma_location=ChromaLocation.LEFT)) hd_video_config = bitmovin.codecConfigurations.H264.create( hd_video_config).resource # Create an MP2 configuration for audio audio_codec_configuration = MP2CodecConfiguration( name='MP2 Codec Configuration', bitrate=192_000, rate=48_000, channel_layout=MP2ChannelLayout.CL_STEREO) audio_codec_configuration = bitmovin.codecConfigurations.MP2.create( audio_codec_configuration).resource # Define input streams for audio and video video_input_stream = StreamInput( input_id=s3_input.id, input_path=S3_INPUT_PATH, selection_mode=SelectionMode.VIDEO_RELATIVE, position=0) audio_input_stream_1 = StreamInput( input_id=s3_input.id, input_path=S3_INPUT_PATH, selection_mode=SelectionMode.AUDIO_RELATIVE, position=0) # Create output stream configuration video_stream = Stream(codec_configuration_id=hd_video_config.id, input_streams=[video_input_stream], name='Video Stream') video_stream = bitmovin.encodings.Stream.create( object_=video_stream, encoding_id=encoding.id).resource audio_stream = Stream(codec_configuration_id=audio_codec_configuration.id, input_streams=[audio_input_stream_1], name='Audio Stream') audio_stream = bitmovin.encodings.Stream.create( object_=audio_stream, encoding_id=encoding.id).resource # Create broadcast TS muxing video_muxing_stream_broadcast_ts = MuxingStream(video_stream.id) audio_muxing_stream_broadcast_ts = MuxingStream(audio_stream.id) broadcast_ts_muxing_output = EncodingOutput(output_id=s3_output.id, output_path=OUTPUT_BASE_PATH, acl=[acl_entry]) broadcast_ts_transport_configuration = BroadcastTsTransportConfiguration( muxrate=8_000_000, stop_on_error=False, pat_repetition_rate_per_sec=8.0, pmt_repetition_rate_per_sec=8.0, prevent_empty_adaptation_fields_in_video=True) broadcast_ts_program_configuration = BroadcastTsProgramConfiguration( program_number=10, pid_for_pmt=101, insert_program_clock_ref_on_pes=True) broadcast_ts_video_stream_configuration = BroadcastTsVideoStreamConfiguration( stream_id=video_stream.id, max_decode_delay=90_000, packet_identifier=481, start_with_discontinuity_indicator=True, align_pes=True, set_rai_on_au=SetRaiOnAu.ALL_PES_PACKETS, insert_access_unit_delimiter_in_avc=True, ) broadcast_ts_audio_stream_configuration = BroadcastTsAudioStreamConfiguration( stream_id=audio_stream.id, packet_identifier=2005, start_with_discontinuity_indicator=True, align_pes=True, language='eng') broadcast_ts_muxing_configuration = BroadcastTsMuxingConfiguration( transport=broadcast_ts_transport_configuration, program=broadcast_ts_program_configuration, video_streams=[broadcast_ts_video_stream_configuration], audio_streams=[broadcast_ts_audio_stream_configuration]) broadcast_ts_muxing = BroadcastTsMuxing( filename=OUTPUT_FILE_NAME, segment_length=30, streams=[ video_muxing_stream_broadcast_ts, audio_muxing_stream_broadcast_ts ], outputs=[broadcast_ts_muxing_output], name='Broadcast TS Muxing', configuration=broadcast_ts_muxing_configuration) bitmovin.encodings.Muxing.BroadcastTS.create(object_=broadcast_ts_muxing, encoding_id=encoding.id) # Start the encoding start_encoding_request = StartEncodingRequest( encoding_mode=EncodingMode.STANDARD, trimming=StartEncodingTrimming(start_pic_timing='', end_pic_timing='')) bitmovin.encodings.Encoding.start( encoding_id=encoding.id, start_encoding_request=start_encoding_request) try: bitmovin.encodings.Encoding.wait_until_finished( encoding_id=encoding.id) except BitmovinError as bitmovin_error: print("Exception occurred while waiting for encoding to finish: {}". format(bitmovin_error)) print('OUTPUT FILE: https://{}.s3.amazonaws.com/{}{}'.format( S3_OUTPUT_BUCKETNAME, OUTPUT_BASE_PATH, OUTPUT_FILE_NAME))
def main(): bitmovin = Bitmovin(api_key=API_KEY) # Create an HTTPs input. This resource is then used as base URL for the input file. https_input = HTTPSInput(name='HTTPS input', host=HTTPS_INPUT_HOST) https_input = bitmovin.inputs.HTTPS.create(https_input).resource # Create an S3 Output. This will be used as target bucket for the muxings, sprites and manifests s3_output = S3Output(access_key=S3_OUTPUT_ACCESSKEY, secret_key=S3_OUTPUT_SECRETKEY, bucket_name=S3_OUTPUT_BUCKETNAME, name='S3 Output') s3_output = bitmovin.outputs.S3.create(s3_output).resource # Create an Encoding. This will run in AWS_EU_WEST_1. This is the base entity used to configure the encoding. encoding = Encoding(name='HEVC Encoding with Python', cloud_region=CloudRegion.GOOGLE_EUROPE_WEST_1) encoding = bitmovin.encodings.Encoding.create(encoding).resource encoding_configs = [] # Iterate over all encoding profiles and create the H265 configuration with the defined height and bitrate. # If you want to extend the config you have to set the values here as well. for encoding_profile in hevc_encoding_profiles: encoding_config = dict(profile=encoding_profile) codec = H265CodecConfiguration( name='H265 Codec {}p {}k Configuration'.format( encoding_profile.get('height'), encoding_profile.get('bitrate')), bitrate=encoding_profile.get('bitrate') * 1000, height=encoding_profile.get('height'), rate=encoding_profile.get('fps'), profile=encoding_profile.get('profile')) encoding_config['codec'] = bitmovin.codecConfigurations.H265.create( codec).resource encoding_configs.append(encoding_config) # Also the AAC configuration has to be created, which will be later on used to create the streams. audio_codec_configuration = AACCodecConfiguration( name='AAC Codec Configuration', bitrate=128000, rate=48000) audio_codec_configuration = bitmovin.codecConfigurations.AAC.create( audio_codec_configuration).resource video_input_stream = StreamInput(input_id=https_input.id, input_path=HTTPS_INPUT_PATH, selection_mode=SelectionMode.AUTO) audio_input_stream = StreamInput(input_id=https_input.id, input_path=HTTPS_INPUT_PATH, selection_mode=SelectionMode.AUTO) # With the configurations and the input file streams are now created and muxed later on. for encoding_config in encoding_configs: encoding_profile = encoding_config.get('profile') video_stream = Stream( codec_configuration_id=encoding_config.get('codec').id, input_streams=[video_input_stream], name='Stream {}p_{}k'.format(encoding_profile.get('height'), encoding_profile.get('bitrate'))) encoding_config['stream'] = bitmovin.encodings.Stream.create( object_=video_stream, encoding_id=encoding.id).resource audio_stream = Stream(codec_configuration_id=audio_codec_configuration.id, input_streams=[audio_input_stream], name='Audio Stream') audio_stream = bitmovin.encodings.Stream.create( object_=audio_stream, encoding_id=encoding.id).resource acl_entry = ACLEntry(permission=ACLPermission.PUBLIC_READ) # Create FMP4 muxings which are later used for the DASH manifest. The current settings will set a segment length # of 4 seconds. for encoding_config in encoding_configs: encoding_profile = encoding_config.get('profile') video_muxing_stream = MuxingStream(encoding_config.get('stream').id) video_muxing_output = EncodingOutput( output_id=s3_output.id, output_path=OUTPUT_BASE_PATH + 'video/{}p_{}k/'.format(encoding_profile.get('height'), encoding_profile.get('bitrate')), acl=[acl_entry]) video_muxing = FMP4Muxing(segment_length=4, segment_naming='seg_%number%.m4s', init_segment_name='init.mp4', streams=[video_muxing_stream], outputs=[video_muxing_output], name='FMP4 Muxing {}p_{}k'.format( encoding_profile.get('height'), encoding_profile.get('bitrate'))) encoding_config['fmp4_muxing'] = bitmovin.encodings.Muxing.FMP4.create( object_=video_muxing, encoding_id=encoding.id).resource audio_muxing_stream = MuxingStream(audio_stream.id) audio_muxing_output = EncodingOutput(output_id=s3_output.id, output_path=OUTPUT_BASE_PATH + 'audio/', acl=[acl_entry]) audio_fmp4_muxing = FMP4Muxing(segment_length=4, segment_naming='seg_%number%.m4s', init_segment_name='init.mp4', streams=[audio_muxing_stream], outputs=[audio_muxing_output], name='Audio FMP4 Muxing') audio_fmp4_muxing = bitmovin.encodings.Muxing.FMP4.create( object_=audio_fmp4_muxing, encoding_id=encoding.id).resource bitmovin.encodings.Encoding.start(encoding_id=encoding.id) try: bitmovin.encodings.Encoding.wait_until_finished( encoding_id=encoding.id, check_interval=5) except BitmovinError as bitmovin_error: print('Exception occurred while waiting for encoding to finish: {}'. format(bitmovin_error)) # Specify the output for manifest which will be in the OUTPUT_BASE_PATH. manifest_output = EncodingOutput(output_id=s3_output.id, output_path=OUTPUT_BASE_PATH, acl=[acl_entry]) # Create a DASH manifest and add one period with an adapation set for audio and video dash_manifest = DashManifest(manifest_name='stream.mpd', outputs=[manifest_output], name='DASH Manifest') dash_manifest = bitmovin.manifests.DASH.create(dash_manifest).resource period = Period() period = bitmovin.manifests.DASH.add_period( object_=period, manifest_id=dash_manifest.id).resource video_adaptation_set = VideoAdaptationSet() video_adaptation_set = bitmovin.manifests.DASH.add_video_adaptation_set( object_=video_adaptation_set, manifest_id=dash_manifest.id, period_id=period.id).resource audio_adaptation_set = AudioAdaptationSet(lang='en') audio_adaptation_set = bitmovin.manifests.DASH.add_audio_adaptation_set( object_=audio_adaptation_set, manifest_id=dash_manifest.id, period_id=period.id).resource # Add all representation to the video adaption set for encoding_config in encoding_configs: encoding_profile = encoding_config.get('profile') muxing = encoding_config.get('fmp4_muxing') fmp4_representation_1080p = FMP4Representation( FMP4RepresentationType.TEMPLATE, encoding_id=encoding.id, muxing_id=muxing.id, segment_path='video/{}p_{}k/'.format( encoding_profile.get('height'), encoding_profile.get('bitrate'))) encoding_config[ 'dash'] = bitmovin.manifests.DASH.add_fmp4_representation( object_=fmp4_representation_1080p, manifest_id=dash_manifest.id, period_id=period.id, adaptationset_id=video_adaptation_set.id).resource fmp4_representation_audio = FMP4Representation( FMP4RepresentationType.TEMPLATE, encoding_id=encoding.id, muxing_id=audio_fmp4_muxing.id, segment_path='audio/') bitmovin.manifests.DASH.add_fmp4_representation( object_=fmp4_representation_audio, manifest_id=dash_manifest.id, period_id=period.id, adaptationset_id=audio_adaptation_set.id) bitmovin.manifests.DASH.start(manifest_id=dash_manifest.id) # Create a HLS manifest and add one period with an adapation set for audio and video hls_manifest = HlsManifest(manifest_name='stream.m3u8', outputs=[manifest_output], name='HLS Manifest') hls_manifest = bitmovin.manifests.HLS.create(hls_manifest).resource audio_media = AudioMedia(name='HLS Audio Media', group_id='audio', segment_path='audio/', encoding_id=encoding.id, stream_id=audio_stream.id, muxing_id=audio_fmp4_muxing.id, language='en', uri='audio.m3u8') bitmovin.manifests.HLS.AudioMedia.create(manifest_id=hls_manifest.id, object_=audio_media) # Add all representation to the video adaption set for encoding_config in encoding_configs: encoding_profile = encoding_config.get('profile') stream = encoding_config.get('stream') muxing = encoding_config.get('fmp4_muxing') variant_stream = VariantStream(audio='audio', closed_captions='NONE', segment_path='video/{}p_{}k/'.format( encoding_profile.get('height'), encoding_profile.get('bitrate')), uri='video_{}p_{}k.m3u8'.format( encoding_profile.get('height'), encoding_profile.get('bitrate')), encoding_id=encoding.id, stream_id=stream.id, muxing_id=muxing.id) bitmovin.manifests.HLS.VariantStream.create( manifest_id=hls_manifest.id, object_=variant_stream) bitmovin.manifests.HLS.start(manifest_id=hls_manifest.id) try: bitmovin.manifests.DASH.wait_until_finished( manifest_id=dash_manifest.id, check_interval=1) except BitmovinError as bitmovin_error: print( 'Exception occurred while waiting for manifest creation to finish: {}' .format(bitmovin_error)) try: bitmovin.manifests.HLS.wait_until_finished(manifest_id=hls_manifest.id, check_interval=1) except BitmovinError as bitmovin_error: print( 'Exception occurred while waiting for manifest creation to finish: {}' .format(bitmovin_error))
def main(): bitmovin = Bitmovin(api_key=API_KEY) https_input = HTTPSInput(name='create_simple_encoding_vp9 HTTPS input', host=HTTPS_INPUT_HOST) https_input = bitmovin.inputs.HTTPS.create(https_input).resource s3_output = S3Output(access_key=S3_OUTPUT_ACCESSKEY, secret_key=S3_OUTPUT_SECRETKEY, bucket_name=S3_OUTPUT_BUCKETNAME, cloud_region=AWSCloudRegion.US_EAST_1, name='Sample S3 Output') s3_output = bitmovin.outputs.S3.create(s3_output).resource encoding = Encoding(name='example VP9 encoding', cloud_region=CloudRegion.AWS_US_EAST_1) encoding = bitmovin.encodings.Encoding.create(encoding).resource video_codec_configuration_1080p = VP9CodecConfiguration( name='example_video_codec_configuration_1080p', bitrate=3600000, rate=25.0, width=1920, height=1080) video_codec_configuration_1080p = bitmovin.codecConfigurations.VP9.create( video_codec_configuration_1080p).resource video_codec_configuration_720p = VP9CodecConfiguration( name='example_video_codec_configuration_720p', bitrate=1800000, rate=25.0, width=1280, height=720) video_codec_configuration_720p = bitmovin.codecConfigurations.VP9.create( video_codec_configuration_720p).resource audio_codec_configuration = AACCodecConfiguration( name='example_audio_codec_configuration_english', bitrate=128000, rate=48000) audio_codec_configuration = bitmovin.codecConfigurations.AAC.create( audio_codec_configuration).resource video_input_stream = StreamInput(input_id=https_input.id, input_path=HTTPS_INPUT_PATH, selection_mode=SelectionMode.AUTO) audio_input_stream = StreamInput(input_id=https_input.id, input_path=HTTPS_INPUT_PATH, selection_mode=SelectionMode.AUTO) video_stream_1080p = Stream( codec_configuration_id=video_codec_configuration_1080p.id, input_streams=[video_input_stream], name='Sample Stream 1080p') video_stream_1080p = bitmovin.encodings.Stream.create( object_=video_stream_1080p, encoding_id=encoding.id).resource video_stream_720p = Stream( codec_configuration_id=video_codec_configuration_720p.id, input_streams=[video_input_stream], name='Sample Stream 720p') video_stream_720p = bitmovin.encodings.Stream.create( object_=video_stream_720p, encoding_id=encoding.id).resource audio_stream = Stream(codec_configuration_id=audio_codec_configuration.id, input_streams=[audio_input_stream], name='Sample Stream AUDIO') audio_stream = bitmovin.encodings.Stream.create( object_=audio_stream, encoding_id=encoding.id).resource acl_entry = ACLEntry(permission=ACLPermission.PUBLIC_READ) video_muxing_stream_1080p = MuxingStream(video_stream_1080p.id) video_muxing_stream_720p = MuxingStream(video_stream_720p.id) audio_muxing_stream = MuxingStream(audio_stream.id) video_muxing_1080p_output = EncodingOutput(output_id=s3_output.id, output_path=OUTPUT_BASE_PATH + 'video/1080p/', acl=[acl_entry]) video_muxing_1080p = WebMMuxing(segment_length=4, segment_naming='seg_%number%.chk', init_segment_name='init.hdr', streams=[video_muxing_stream_1080p], outputs=[video_muxing_1080p_output], name='Sample Muxing 1080p') video_muxing_1080p = bitmovin.encodings.Muxing.WebM.create( object_=video_muxing_1080p, encoding_id=encoding.id).resource video_muxing_720p_output = EncodingOutput(output_id=s3_output.id, output_path=OUTPUT_BASE_PATH + 'video/720p/', acl=[acl_entry]) video_muxing_720p = WebMMuxing(segment_length=4, segment_naming='seg_%number%.chk', init_segment_name='init.hdr', streams=[video_muxing_stream_720p], outputs=[video_muxing_720p_output], name='Sample Muxing 720p') video_muxing_720p = bitmovin.encodings.Muxing.WebM.create( object_=video_muxing_720p, encoding_id=encoding.id).resource audio_muxing_output = EncodingOutput(output_id=s3_output.id, output_path=OUTPUT_BASE_PATH + 'audio/', acl=[acl_entry]) audio_muxing = FMP4Muxing(segment_length=4, segment_naming='seg_%number%.m4s', init_segment_name='init.mp4', streams=[audio_muxing_stream], outputs=[audio_muxing_output], name='Sample Muxing AUDIO') audio_muxing = bitmovin.encodings.Muxing.FMP4.create( object_=audio_muxing, encoding_id=encoding.id).resource bitmovin.encodings.Encoding.start(encoding_id=encoding.id) try: bitmovin.encodings.Encoding.wait_until_finished( encoding_id=encoding.id) except BitmovinError as bitmovin_error: print("Exception occurred while waiting for encoding to finish: {}". format(bitmovin_error)) manifest_output = EncodingOutput(output_id=s3_output.id, output_path=OUTPUT_BASE_PATH, acl=[acl_entry]) dash_manifest = DashManifest(manifest_name='example_manifest_vp9.mpd', outputs=[manifest_output], name='Sample DASH Manifest') dash_manifest = bitmovin.manifests.DASH.create(dash_manifest).resource period = Period() period = bitmovin.manifests.DASH.add_period( object_=period, manifest_id=dash_manifest.id).resource video_adaptation_set = VideoAdaptationSet() video_adaptation_set = bitmovin.manifests.DASH.add_video_adaptation_set( object_=video_adaptation_set, manifest_id=dash_manifest.id, period_id=period.id).resource audio_adaptation_set = AudioAdaptationSet(lang='en') audio_adaptation_set = bitmovin.manifests.DASH.add_audio_adaptation_set( object_=audio_adaptation_set, manifest_id=dash_manifest.id, period_id=period.id).resource webm_representation_1080p = WebMRepresentation( type=WebMRepresentationType.TEMPLATE, encoding_id=encoding.id, muxing_id=video_muxing_1080p.id, segment_path='video/1080p/') webm_representation_1080p = bitmovin.manifests.DASH.add_webm_representation( object_=webm_representation_1080p, manifest_id=dash_manifest.id, period_id=period.id, adaptationset_id=video_adaptation_set.id).resource webm_representation_720p = WebMRepresentation( type=WebMRepresentationType.TEMPLATE, encoding_id=encoding.id, muxing_id=video_muxing_720p.id, segment_path='video/720p/') webm_representation_720p = bitmovin.manifests.DASH.add_webm_representation( object_=webm_representation_720p, manifest_id=dash_manifest.id, period_id=period.id, adaptationset_id=video_adaptation_set.id).resource fmp4_representation_audio = FMP4Representation( type=FMP4RepresentationType.TEMPLATE, encoding_id=encoding.id, muxing_id=audio_muxing.id, segment_path='audio/') fmp4_representation_audio = bitmovin.manifests.DASH.add_fmp4_representation( object_=fmp4_representation_audio, manifest_id=dash_manifest.id, period_id=period.id, adaptationset_id=audio_adaptation_set.id).resource bitmovin.manifests.DASH.start(manifest_id=dash_manifest.id) try: bitmovin.manifests.DASH.wait_until_finished( manifest_id=dash_manifest.id) except BitmovinError as bitmovin_error: print( "Exception occurred while waiting for manifest creation to finish: {}" .format(bitmovin_error))
def createAACRendition(encoding, dash_manifest, period, adaptation_set, hls_manifest, audio_group_id, audio_input_stream, output, output_path, bitrate, rate): dash_output_path = output_path + '/dash' hls_output_path = output_path + '/hls' stream_identifier = str(bitrate) codec_configuration = AACCodecConfiguration(name='aac_config_' + str(bitrate), bitrate=bitrate, rate=rate) codec_configuration = bitmovin.codecConfigurations.AAC.create( codec_configuration).resource audio_stream = Stream( name='stream_' + stream_identifier, codec_configuration_id=codec_configuration.id, input_streams=[audio_input_stream], ) audio_stream = bitmovin.encodings.Stream.create( object_=audio_stream, encoding_id=encoding.id).resource audio_muxing_stream = MuxingStream(audio_stream.id) acl_entry = ACLEntry(permission=ACLPermission.PUBLIC_READ) audio_muxing_fmp4_output = EncodingOutput(output_id=output.id, output_path=OUTPUT_BASE_PATH + dash_output_path, acl=[acl_entry]) audio_muxing_fmp4 = FMP4Muxing(name='fmp4_muxing_' + stream_identifier, segment_length=SEGMENT_LENGTH, segment_naming='seg_%number%.m4s', init_segment_name='init.mp4', streams=[audio_muxing_stream], outputs=[audio_muxing_fmp4_output]) audio_muxing_fmp4 = bitmovin.encodings.Muxing.FMP4.create( object_=audio_muxing_fmp4, encoding_id=encoding.id).resource audio_muxing_ts_output = EncodingOutput(output_id=output.id, output_path=OUTPUT_BASE_PATH + hls_output_path, acl=[acl_entry]) audio_muxing_ts = TSMuxing( name='ts_muxing_' + stream_identifier, segment_length=SEGMENT_LENGTH, segment_naming='seg_%number%.ts', streams=[audio_muxing_stream], outputs=[audio_muxing_ts_output], ) audio_muxing_ts = bitmovin.encodings.Muxing.TS.create( object_=audio_muxing_ts, encoding_id=encoding.id).resource fmp4_representation = FMP4Representation(FMP4RepresentationType.TEMPLATE, encoding_id=encoding.id, muxing_id=audio_muxing_fmp4.id, segment_path=dash_output_path) fmp4_representation = bitmovin.manifests.DASH.add_fmp4_representation( object_=fmp4_representation, manifest_id=dash_manifest.id, period_id=period.id, adaptationset_id=adaptation_set.id).resource audio_media = AudioMedia(name='Sample Audio Media', group_id=audio_group_id, segment_path=hls_output_path, encoding_id=encoding.id, stream_id=audio_stream.id, muxing_id=audio_muxing_ts.id, autoselect=False, language='en', uri='audio_' + stream_identifier + '.m3u8') audio_media = bitmovin.manifests.HLS.AudioMedia.create( object_=audio_media, manifest_id=hls_manifest.id).resource
def main(): bitmovin = Bitmovin(api_key=API_KEY) resource_response = bitmovin.inputs.RTMP.list() if not resource_response or \ not resource_response.resource or \ not isinstance(resource_response.resource, list) or \ len(resource_response.resource) < 1: print('Could not find any RTMP inputs. Please contact support.') sys.exit(3) rtmp_input_id = resource_response.resource[0].id print("Found RTMP input with ID '{}'".format(rtmp_input_id)) rtmp_input = bitmovin.inputs.RTMP.retrieve(id_=rtmp_input_id).resource s3_output = S3Output(access_key=S3_OUTPUT_ACCESS_KEY, secret_key=S3_OUTPUT_SECRET_KEY, bucket_name=S3_OUTPUT_BUCKET_NAME, name='Sample S3 Output') s3_output = bitmovin.outputs.S3.create(s3_output).resource encoding = Encoding(name='example python live stream encoding', encoder_version=ENCODER_VERSION, cloud_region=CloudRegion.GOOGLE_EUROPE_WEST_1) encoding = bitmovin.encodings.Encoding.create(encoding).resource video_codec_configuration_1080p = H264CodecConfiguration( name='example_video_codec_configuration_1080p', bitrate=4800000, rate=25.0, width=1920, height=1080, profile=H264Profile.HIGH) video_codec_configuration_1080p = bitmovin.codecConfigurations.H264.create( video_codec_configuration_1080p).resource video_codec_configuration_720p = H264CodecConfiguration( name='example_video_codec_configuration_720p', bitrate=2400000, rate=25.0, width=1280, height=720, profile=H264Profile.HIGH) video_codec_configuration_720p = bitmovin.codecConfigurations.H264.create( video_codec_configuration_720p).resource video_codec_configuration_360p = H264CodecConfiguration( name='example_video_codec_configuration_720p', bitrate=800000, rate=25.0, width=640, height=360, profile=H264Profile.HIGH) video_codec_configuration_360p = bitmovin.codecConfigurations.H264.create( video_codec_configuration_360p).resource audio_codec_configuration = AACCodecConfiguration( name='example_audio_codec_configuration_english', bitrate=128000, rate=48000) audio_codec_configuration = bitmovin.codecConfigurations.AAC.create( audio_codec_configuration).resource video_input_stream = StreamInput(input_id=rtmp_input.id, input_path='live', position=0, selection_mode=SelectionMode.AUTO) audio_input_stream = StreamInput(input_id=rtmp_input.id, input_path='live', position=1, selection_mode=SelectionMode.AUTO) video_stream_1080p = Stream( codec_configuration_id=video_codec_configuration_1080p.id, input_streams=[video_input_stream], name='Sample Stream 1080p') video_stream_1080p = bitmovin.encodings.Stream.create( object_=video_stream_1080p, encoding_id=encoding.id).resource video_stream_720p = Stream( codec_configuration_id=video_codec_configuration_720p.id, input_streams=[video_input_stream], name='Sample Stream 720p') video_stream_720p = bitmovin.encodings.Stream.create( object_=video_stream_720p, encoding_id=encoding.id).resource video_stream_360p = Stream( codec_configuration_id=video_codec_configuration_360p.id, input_streams=[video_input_stream], name='Sample Stream 360p') video_stream_360p = bitmovin.encodings.Stream.create( object_=video_stream_360p, encoding_id=encoding.id).resource audio_stream = Stream(codec_configuration_id=audio_codec_configuration.id, input_streams=[audio_input_stream], name='Sample Stream AUDIO') audio_stream = bitmovin.encodings.Stream.create( object_=audio_stream, encoding_id=encoding.id).resource video_muxing_stream_1080p = MuxingStream(video_stream_1080p.id) video_muxing_stream_720p = MuxingStream(video_stream_720p.id) video_muxing_stream_360p = MuxingStream(video_stream_360p.id) audio_muxing_stream = MuxingStream(audio_stream.id) acl_entry = ACLEntry(permission=ACLPermission.PUBLIC_READ) video_muxing_1080p_output = EncodingOutput(output_id=s3_output.id, output_path=OUTPUT_BASE_PATH + 'video/1080p', acl=[acl_entry]) video_muxing_1080p = FMP4Muxing(segment_length=4, segment_naming='seg_%number%.m4s', init_segment_name='init.mp4', streams=[video_muxing_stream_1080p], outputs=[video_muxing_1080p_output], name='Sample Muxing 1080p') video_muxing_1080p = bitmovin.encodings.Muxing.FMP4.create( object_=video_muxing_1080p, encoding_id=encoding.id).resource video_muxing_720p_output = EncodingOutput(output_id=s3_output.id, output_path=OUTPUT_BASE_PATH + 'video/720p', acl=[acl_entry]) video_muxing_720p = FMP4Muxing(segment_length=4, segment_naming='seg_%number%.m4s', init_segment_name='init.mp4', streams=[video_muxing_stream_720p], outputs=[video_muxing_720p_output], name='Sample Muxing 720p') video_muxing_720p = bitmovin.encodings.Muxing.FMP4.create( object_=video_muxing_720p, encoding_id=encoding.id).resource video_muxing_360p_output = EncodingOutput(output_id=s3_output.id, output_path=OUTPUT_BASE_PATH + 'video/360p', acl=[acl_entry]) video_muxing_360p = FMP4Muxing(segment_length=4, segment_naming='seg_%number%.m4s', init_segment_name='init.mp4', streams=[video_muxing_stream_360p], outputs=[video_muxing_360p_output], name='Sample Muxing 360p') video_muxing_360p = bitmovin.encodings.Muxing.FMP4.create( object_=video_muxing_360p, encoding_id=encoding.id).resource audio_muxing_output = EncodingOutput(output_id=s3_output.id, output_path=OUTPUT_BASE_PATH + 'audio/128k', acl=[acl_entry]) audio_muxing = FMP4Muxing(segment_length=4, segment_naming='seg_%number%.m4s', init_segment_name='init.mp4', streams=[audio_muxing_stream], outputs=[audio_muxing_output], name='Sample Muxing AUDIO') audio_muxing = bitmovin.encodings.Muxing.FMP4.create( object_=audio_muxing, encoding_id=encoding.id).resource live_stream_configuration = LiveStreamConfiguration(stream_key=STREAM_KEY) resource_response = bitmovin.encodings.Encoding.start_live( encoding_id=encoding.id, live_stream_configuration=live_stream_configuration) bitmovin.encodings.Encoding.wait_until_running( encoding_id=resource_response.resource.id) live_details = None retry = 0 while retry < LIVE_STREAM_INFORMATION_FETCH_MAX_RETRIES: try: live_details = bitmovin.encodings.Encoding.retrieve_live( encoding_id=resource_response.resource.id) break except BitmovinApiError as bitmovin_api_error: if bitmovin_api_error.response.data.code != ERROR_CODE_LIVE_STREAM_NOT_READY: sys.exit(2) print( "Live stream is not ready yet. Retrying to fetch live stream information in {} seconds..." .format(LIVE_STREAM_INFORMATION_FETCH_RETRY_INTERVAL)) retry += 1 time.sleep(LIVE_STREAM_INFORMATION_FETCH_RETRY_INTERVAL) if live_details is not None: print_live_stream_details(encoding_id=encoding.id, live_stream_details=live_details.resource) else: print("Unable to fetch live stream details!") sys.exit(1)
def main(): bitmovin = Bitmovin(api_key=API_KEY) https_input = HTTPSInput(name='create_simple_encoding HTTPS input', host=HTTPS_INPUT_HOST) https_input = bitmovin.inputs.HTTPS.create(https_input).resource s3_output = S3Output(access_key=S3_OUTPUT_ACCESSKEY, secret_key=S3_OUTPUT_SECRETKEY, bucket_name=S3_OUTPUT_BUCKETNAME, name='Sample S3 Output') s3_output = bitmovin.outputs.S3.create(s3_output).resource encoding = Encoding(name='example encoding', cloud_region=CloudRegion.GOOGLE_EUROPE_WEST_1) encoding = bitmovin.encodings.Encoding.create(encoding).resource video_codec_configuration_1080p = H264CodecConfiguration( name='example_video_codec_configuration_1080p', bitrate=4800000, rate=25.0, width=1920, height=1080, profile=H264Profile.HIGH) video_codec_configuration_1080p = bitmovin.codecConfigurations.H264.create( video_codec_configuration_1080p).resource video_codec_configuration_720p = H264CodecConfiguration( name='example_video_codec_configuration_720p', bitrate=2400000, rate=25.0, width=1280, height=720, profile=H264Profile.HIGH) video_codec_configuration_720p = bitmovin.codecConfigurations.H264.create( video_codec_configuration_720p).resource audio_codec_configuration = AACCodecConfiguration( name='example_audio_codec_configuration_english', bitrate=128000, rate=48000) audio_codec_configuration = bitmovin.codecConfigurations.AAC.create( audio_codec_configuration).resource video_input_stream = StreamInput(input_id=https_input.id, input_path=HTTPS_INPUT_PATH, selection_mode=SelectionMode.AUTO) audio_input_stream = StreamInput(input_id=https_input.id, input_path=HTTPS_INPUT_PATH, selection_mode=SelectionMode.AUTO) video_stream_1080p = Stream( codec_configuration_id=video_codec_configuration_1080p.id, input_streams=[video_input_stream], name='Sample Stream 1080p') video_stream_1080p = bitmovin.encodings.Stream.create( object_=video_stream_1080p, encoding_id=encoding.id).resource video_stream_720p = Stream( codec_configuration_id=video_codec_configuration_720p.id, input_streams=[video_input_stream], name='Sample Stream 720p') video_stream_720p = bitmovin.encodings.Stream.create( object_=video_stream_720p, encoding_id=encoding.id).resource audio_stream = Stream(codec_configuration_id=audio_codec_configuration.id, input_streams=[audio_input_stream], name='Sample Stream AUDIO') audio_stream = bitmovin.encodings.Stream.create( object_=audio_stream, encoding_id=encoding.id).resource audio_mix_filter = AudioMixFilter( name="Audio Mix Channel", channel_layout=AudioMixFilterChannelLayout.CL_STEREO) audio_mix_channel_1 = AudioMixChannel( channel_number=0, source_channels=[ AudioMixSourceChannel( channel_number=0, channel_type=AudioMixFilterChannelType.CHANNEL_NUMBER) ]) audio_mix_channel_2 = AudioMixChannel( channel_number=1, source_channels=[ AudioMixSourceChannel( channel_number=1, channel_type=AudioMixFilterChannelType.CHANNEL_NUMBER) ]) audio_mix_filter.audio_mix_channels = [ audio_mix_channel_1, audio_mix_channel_2 ] audio_mix_filter = bitmovin.filters.AudioMix.create( object_=audio_mix_filter).resource stream_filter = [StreamFilter(id=audio_mix_filter.id, position=0)] bitmovin.encodings.Stream.Filter.create(encoding_id=encoding.id, stream_id=audio_stream.id, stream_filter=stream_filter) acl_entry = ACLEntry(permission=ACLPermission.PUBLIC_READ) video_muxing_stream_1080p = MuxingStream(video_stream_1080p.id) video_muxing_stream_720p = MuxingStream(video_stream_720p.id) audio_muxing_stream = MuxingStream(audio_stream.id) video_muxing_1080p_output = EncodingOutput(output_id=s3_output.id, output_path=OUTPUT_BASE_PATH + 'video/1080p/', acl=[acl_entry]) video_muxing_1080p = FMP4Muxing(segment_length=4, segment_naming='seg_%number%.m4s', init_segment_name='init.mp4', streams=[video_muxing_stream_1080p], outputs=[video_muxing_1080p_output], name='Sample Muxing 1080p') video_muxing_1080p = bitmovin.encodings.Muxing.FMP4.create( object_=video_muxing_1080p, encoding_id=encoding.id).resource video_muxing_720p_output = EncodingOutput(output_id=s3_output.id, output_path=OUTPUT_BASE_PATH + 'video/720p/', acl=[acl_entry]) video_muxing_720p = FMP4Muxing(segment_length=4, segment_naming='seg_%number%.m4s', init_segment_name='init.mp4', streams=[video_muxing_stream_720p], outputs=[video_muxing_720p_output], name='Sample Muxing 720p') video_muxing_720p = bitmovin.encodings.Muxing.FMP4.create( object_=video_muxing_720p, encoding_id=encoding.id).resource audio_muxing_output = EncodingOutput(output_id=s3_output.id, output_path=OUTPUT_BASE_PATH + 'audio/', acl=[acl_entry]) audio_muxing = FMP4Muxing(segment_length=4, segment_naming='seg_%number%.m4s', init_segment_name='init.mp4', streams=[audio_muxing_stream], outputs=[audio_muxing_output], name='Sample Muxing AUDIO') audio_muxing = bitmovin.encodings.Muxing.FMP4.create( object_=audio_muxing, encoding_id=encoding.id).resource bitmovin.encodings.Encoding.start(encoding_id=encoding.id) try: bitmovin.encodings.Encoding.wait_until_finished( encoding_id=encoding.id) except BitmovinError as bitmovin_error: print("Exception occurred while waiting for encoding to finish: {}". format(bitmovin_error)) manifest_output = EncodingOutput(output_id=s3_output.id, output_path=OUTPUT_BASE_PATH, acl=[acl_entry]) dash_manifest = DashManifest( manifest_name='example_manifest_sintel_dash.mpd', outputs=[manifest_output], name='Sample DASH Manifest') dash_manifest = bitmovin.manifests.DASH.create(dash_manifest).resource period = Period() period = bitmovin.manifests.DASH.add_period( object_=period, manifest_id=dash_manifest.id).resource video_adaptation_set = VideoAdaptationSet() video_adaptation_set = bitmovin.manifests.DASH.add_video_adaptation_set( object_=video_adaptation_set, manifest_id=dash_manifest.id, period_id=period.id).resource audio_adaptation_set = AudioAdaptationSet(lang='en') audio_adaptation_set = bitmovin.manifests.DASH.add_audio_adaptation_set( object_=audio_adaptation_set, manifest_id=dash_manifest.id, period_id=period.id).resource fmp4_representation_1080p = FMP4Representation( FMP4RepresentationType.TEMPLATE, encoding_id=encoding.id, muxing_id=video_muxing_1080p.id, segment_path='video/1080p/') fmp4_representation_1080p = bitmovin.manifests.DASH.add_fmp4_representation( object_=fmp4_representation_1080p, manifest_id=dash_manifest.id, period_id=period.id, adaptationset_id=video_adaptation_set.id).resource fmp4_representation_720p = FMP4Representation( FMP4RepresentationType.TEMPLATE, encoding_id=encoding.id, muxing_id=video_muxing_720p.id, segment_path='video/720p/') fmp4_representation_720p = bitmovin.manifests.DASH.add_fmp4_representation( object_=fmp4_representation_720p, manifest_id=dash_manifest.id, period_id=period.id, adaptationset_id=video_adaptation_set.id).resource fmp4_representation_audio = FMP4Representation( FMP4RepresentationType.TEMPLATE, encoding_id=encoding.id, muxing_id=audio_muxing.id, segment_path='audio/') fmp4_representation_audio = bitmovin.manifests.DASH.add_fmp4_representation( object_=fmp4_representation_audio, manifest_id=dash_manifest.id, period_id=period.id, adaptationset_id=audio_adaptation_set.id).resource bitmovin.manifests.DASH.start(manifest_id=dash_manifest.id) try: bitmovin.manifests.DASH.wait_until_finished( manifest_id=dash_manifest.id) except BitmovinError as bitmovin_error: print( "Exception occurred while waiting for manifest creation to finish: {}" .format(bitmovin_error))
def main(): bitmovin = Bitmovin(api_key=API_KEY) bumper_https_input = HTTPSInput(name='create_simple_encoding HTTPS input', host=BUMPER_HTTPS_INPUT_HOST) bumper_https_input = bitmovin.inputs.HTTPS.create( bumper_https_input).resource main_https_input = HTTPSInput(name='create_simple_encoding HTTPS input', host=MAIN_HTTPS_INPUT_HOST) main_https_input = bitmovin.inputs.HTTPS.create(main_https_input).resource s3_output = S3Output(access_key=S3_OUTPUT_ACCESSKEY, secret_key=S3_OUTPUT_SECRETKEY, bucket_name=S3_OUTPUT_BUCKETNAME, name='Sample S3 Output') s3_output = bitmovin.outputs.S3.create(s3_output).resource encoding = Encoding(name='example encoding', cloud_region=CloudRegion.GOOGLE_EUROPE_WEST_1, encoder_version='2.7.0') encoding = bitmovin.encodings.Encoding.create(encoding).resource video_codec_configuration_1080p = H264CodecConfiguration( name='example_video_codec_configuration_1080p', bitrate=4800000, rate=25.0, width=1920, height=1080, profile=H264Profile.HIGH) video_codec_configuration_1080p = bitmovin.codecConfigurations.H264.create( video_codec_configuration_1080p).resource video_codec_configuration_720p = H264CodecConfiguration( name='example_video_codec_configuration_720p', bitrate=2400000, rate=25.0, width=1280, height=720, profile=H264Profile.HIGH) video_codec_configuration_720p = bitmovin.codecConfigurations.H264.create( video_codec_configuration_720p).resource audio_codec_configuration = AACCodecConfiguration( name='example_audio_codec_configuration_english', bitrate=128000, rate=48000) audio_codec_configuration = bitmovin.codecConfigurations.AAC.create( audio_codec_configuration).resource bumper_ingest_input_stream = IngestInputStream( input_id=bumper_https_input.id, input_path=BUMPER_HTTPS_INPUT_PATH, selection_mode=SelectionMode.AUTO, position=0) bumper_ingest_input_stream = bitmovin.encodings.IngestInputStream.create( encoding_id=encoding.id, object_=bumper_ingest_input_stream).resource bumper_time_based_trimming_input_stream = TimeBasedTrimmingInputStream( input_stream_id=bumper_ingest_input_stream.id, offset=BUMPER_OFFSET, duration=BUMPER_DURATION) bumper_time_based_trimming_input_stream = bitmovin.encodings.TimeBasedTrimmingInputStream.create( encoding_id=encoding.id, object_=bumper_time_based_trimming_input_stream).resource main_ingest_input_stream = IngestInputStream( input_id=main_https_input.id, input_path=MAIN_HTTPS_INPUT_PATH, selection_mode=SelectionMode.AUTO, position=0) main_ingest_input_stream = bitmovin.encodings.IngestInputStream.create( encoding_id=encoding.id, object_=main_ingest_input_stream).resource main_time_based_trimming_input_stream = TimeBasedTrimmingInputStream( input_stream_id=main_ingest_input_stream.id, offset=MAIN_OFFSET, duration=BUMPER_DURATION) main_time_based_trimming_input_stream = bitmovin.encodings.TimeBasedTrimmingInputStream.create( encoding_id=encoding.id, object_=main_time_based_trimming_input_stream).resource bumper_concatenation_input_stream_config = ConcatenationInputStreamConfiguration( input_stream_id=bumper_time_based_trimming_input_stream.id, is_main=False, position=0) main_concatenation_input_stream_config = ConcatenationInputStreamConfiguration( input_stream_id=main_time_based_trimming_input_stream.id, is_main=True, position=0) concatenation_input_stream = ConcatenationInputStream(concatenation=[ bumper_concatenation_input_stream_config, main_concatenation_input_stream_config ]) concatenation_input_stream = bitmovin.encodings.ConcatenationInputStream.create( encoding_id=encoding.id, object_=concatenation_input_stream).resource input_stream = StreamInput(input_stream_id=concatenation_input_stream.id) video_stream_1080p = Stream( codec_configuration_id=video_codec_configuration_1080p.id, input_streams=[input_stream], name='Sample Stream 1080p') video_stream_1080p = bitmovin.encodings.Stream.create( object_=video_stream_1080p, encoding_id=encoding.id).resource video_stream_720p = Stream( codec_configuration_id=video_codec_configuration_720p.id, input_streams=[input_stream], name='Sample Stream 720p') video_stream_720p = bitmovin.encodings.Stream.create( object_=video_stream_720p, encoding_id=encoding.id).resource audio_stream = Stream(codec_configuration_id=audio_codec_configuration.id, input_streams=[input_stream], name='Sample Stream AUDIO') audio_stream = bitmovin.encodings.Stream.create( object_=audio_stream, encoding_id=encoding.id).resource acl_entry = ACLEntry(permission=ACLPermission.PUBLIC_READ) video_muxing_stream_1080p = MuxingStream(video_stream_1080p.id) video_muxing_stream_720p = MuxingStream(video_stream_720p.id) audio_muxing_stream = MuxingStream(audio_stream.id) video_muxing_1080p_output = EncodingOutput(output_id=s3_output.id, output_path=OUTPUT_BASE_PATH + 'video/1080p/', acl=[acl_entry]) video_muxing_1080p = FMP4Muxing(segment_length=4, segment_naming='seg_%number%.m4s', init_segment_name='init.mp4', streams=[video_muxing_stream_1080p], outputs=[video_muxing_1080p_output], name='Sample Muxing 1080p') video_muxing_1080p = bitmovin.encodings.Muxing.FMP4.create( object_=video_muxing_1080p, encoding_id=encoding.id).resource video_muxing_720p_output = EncodingOutput(output_id=s3_output.id, output_path=OUTPUT_BASE_PATH + 'video/720p/', acl=[acl_entry]) video_muxing_720p = FMP4Muxing(segment_length=4, segment_naming='seg_%number%.m4s', init_segment_name='init.mp4', streams=[video_muxing_stream_720p], outputs=[video_muxing_720p_output], name='Sample Muxing 720p') video_muxing_720p = bitmovin.encodings.Muxing.FMP4.create( object_=video_muxing_720p, encoding_id=encoding.id).resource audio_muxing_output = EncodingOutput(output_id=s3_output.id, output_path=OUTPUT_BASE_PATH + 'audio/', acl=[acl_entry]) audio_muxing = FMP4Muxing(segment_length=4, segment_naming='seg_%number%.m4s', init_segment_name='init.mp4', streams=[audio_muxing_stream], outputs=[audio_muxing_output], name='Sample Muxing AUDIO') audio_muxing = bitmovin.encodings.Muxing.FMP4.create( object_=audio_muxing, encoding_id=encoding.id).resource bitmovin.encodings.Encoding.start(encoding_id=encoding.id) try: bitmovin.encodings.Encoding.wait_until_finished( encoding_id=encoding.id) except BitmovinError as bitmovin_error: print("Exception occurred while waiting for encoding to finish: {}". format(bitmovin_error)) manifest_output = EncodingOutput(output_id=s3_output.id, output_path=OUTPUT_BASE_PATH, acl=[acl_entry]) dash_manifest = DashManifest( manifest_name='example_manifest_sintel_dash.mpd', outputs=[manifest_output], name='Sample DASH Manifest') dash_manifest = bitmovin.manifests.DASH.create(dash_manifest).resource period = Period() period = bitmovin.manifests.DASH.add_period( object_=period, manifest_id=dash_manifest.id).resource video_adaptation_set = VideoAdaptationSet() video_adaptation_set = bitmovin.manifests.DASH.add_video_adaptation_set( object_=video_adaptation_set, manifest_id=dash_manifest.id, period_id=period.id).resource audio_adaptation_set = AudioAdaptationSet(lang='en') audio_adaptation_set = bitmovin.manifests.DASH.add_audio_adaptation_set( object_=audio_adaptation_set, manifest_id=dash_manifest.id, period_id=period.id).resource fmp4_representation_1080p = FMP4Representation( FMP4RepresentationType.TEMPLATE, encoding_id=encoding.id, muxing_id=video_muxing_1080p.id, segment_path='video/1080p/') fmp4_representation_1080p = bitmovin.manifests.DASH.add_fmp4_representation( object_=fmp4_representation_1080p, manifest_id=dash_manifest.id, period_id=period.id, adaptationset_id=video_adaptation_set.id).resource fmp4_representation_720p = FMP4Representation( FMP4RepresentationType.TEMPLATE, encoding_id=encoding.id, muxing_id=video_muxing_720p.id, segment_path='video/720p/') fmp4_representation_720p = bitmovin.manifests.DASH.add_fmp4_representation( object_=fmp4_representation_720p, manifest_id=dash_manifest.id, period_id=period.id, adaptationset_id=video_adaptation_set.id).resource fmp4_representation_audio = FMP4Representation( FMP4RepresentationType.TEMPLATE, encoding_id=encoding.id, muxing_id=audio_muxing.id, segment_path='audio/') fmp4_representation_audio = bitmovin.manifests.DASH.add_fmp4_representation( object_=fmp4_representation_audio, manifest_id=dash_manifest.id, period_id=period.id, adaptationset_id=audio_adaptation_set.id).resource bitmovin.manifests.DASH.start(manifest_id=dash_manifest.id) try: bitmovin.manifests.DASH.wait_until_finished( manifest_id=dash_manifest.id) except BitmovinError as bitmovin_error: print( "Exception occurred while waiting for manifest creation to finish: {}" .format(bitmovin_error))
def main(): bitmovin = Bitmovin(api_key=API_KEY) # Create an S3 input. This resource is then used as base bucket for the input file. s3_input = S3Input(access_key=S3_INPUT_ACCESSKEY, secret_key=S3_INPUT_SECRETKEY, bucket_name=S3_INPUT_BUCKETNAME, name='S3 Input') s3_input = bitmovin.inputs.S3.create(s3_input).resource # Create an S3 Output. This will be used as target bucket for the muxings, sprites and manifests s3_output = S3Output(access_key=S3_OUTPUT_ACCESSKEY, secret_key=S3_OUTPUT_SECRETKEY, bucket_name=S3_OUTPUT_BUCKETNAME, name='S3 Output') s3_output = bitmovin.outputs.S3.create(s3_output).resource video_input_stream = StreamInput(input_id=s3_input.id, input_path=S3_INPUT_PATH, selection_mode=SelectionMode.AUTO) audio_input_stream = StreamInput(input_id=s3_input.id, input_path=S3_INPUT_PATH, selection_mode=SelectionMode.AUTO) acl_entry = ACLEntry(permission=ACLPermission.PUBLIC_READ) encoding_analysis = Encoding(name='Per title encoding analysis', cloud_region=CloudRegion.AWS_EU_WEST_1) encoding_analysis = bitmovin.encodings.Encoding.create( encoding_analysis).resource # Do analysis encoding to get the complexity factor encoding_analysis = bitmovin.encodings.Encoding.create( encoding_analysis).resource encoding_analysis_config = H264CodecConfiguration( name='H264 Per Title Analysis Configuration', bitrate=None, crf=23.0, height=360, rate=None, profile=H264Profile.MAIN) encoding_analysis_config = bitmovin.codecConfigurations.H264.create( encoding_analysis_config).resource encoding_analysis_stream = Stream( codec_configuration_id=encoding_analysis_config.id, input_streams=[video_input_stream], name='Per Title Analysis Stream') encoding_analysis_stream = bitmovin.encodings.Stream.create( object_=encoding_analysis_stream, encoding_id=encoding_analysis.id).resource encoding_analysis_output = EncodingOutput(output_id=s3_output.id, output_path=OUTPUT_BASE_PATH + 'video/quality_analysis/', acl=[acl_entry]) encoding_analysis_muxing_stream = MuxingStream(encoding_analysis_stream.id) encoding_analysis_muxing = FMP4Muxing( segment_length=4, segment_naming='seg_%number%.m4s', init_segment_name='init.mp4', streams=[encoding_analysis_muxing_stream], outputs=[encoding_analysis_output], name='Per Title Analysis Muxing') encoding_analysis_muxing = bitmovin.encodings.Muxing.FMP4.create( object_=encoding_analysis_muxing, encoding_id=encoding_analysis.id).resource bitmovin.encodings.Encoding.start(encoding_id=encoding_analysis.id) try: bitmovin.encodings.Encoding.wait_until_finished( encoding_id=encoding_analysis.id, check_interval=5) except BitmovinError as bitmovin_error: print('Exception occurred while waiting for encoding to finish: {}'. format(bitmovin_error)) exit(-1) encoding_analysis_muxing = bitmovin.encodings.Muxing.FMP4.retrieve( encoding_id=encoding_analysis.id, muxing_id=encoding_analysis_muxing.id).resource # Calculate and saturate the complexity factor complexity_factor = encoding_analysis_muxing.avgBitrate / MEDIAN_BITRATE if complexity_factor > MAX_COMPLEXITY_FACTOR: complexity_factor = MAX_COMPLEXITY_FACTOR elif complexity_factor < MIN_COMPLEXITY_FACTOR: complexity_factor = MIN_COMPLEXITY_FACTOR print('Got complexity factor of: {:0.2f}'.format(complexity_factor)) print('Updating encoding profile from:') pprint(encoding_profiles) print('To') # Multiply every bitrate with the complexity factor for profile in encoding_profiles: profile['bitrate'] = int(profile['bitrate'] * complexity_factor) pprint(encoding_profiles) # Create an Encoding. This will run in AWS_AP_SOUTHEAST_1. This is the base entity used to configure the encoding. encoding = Encoding(name='Per title encoding', cloud_region=CloudRegion.AWS_EU_WEST_1) encoding = bitmovin.encodings.Encoding.create(encoding).resource encoding_configs = [] # Iterate over all encoding profiles and create the H264 configuration with the defined height and bitrate. for encoding_profile in encoding_profiles: encoding_config = dict(profile=encoding_profile) codec = H264CodecConfiguration( name='H264 Codec {}p {}k Configuration'.format( encoding_profile.get('height'), encoding_profile.get('bitrate')), bitrate=encoding_profile.get('bitrate') * 1000, height=encoding_profile.get('height'), rate=encoding_profile.get('fps'), profile=H264Profile.HIGH) encoding_config['codec'] = bitmovin.codecConfigurations.H264.create( codec).resource encoding_configs.append(encoding_config) # Also the AAC configuration has to be created, which will be later on used to create the streams. audio_codec_configuration = AACCodecConfiguration( name='AAC Codec Configuration', bitrate=128000, rate=48000) audio_codec_configuration = bitmovin.codecConfigurations.AAC.create( audio_codec_configuration).resource # With the configurations and the input file streams are now created and muxed later on. for encoding_config in encoding_configs: encoding_profile = encoding_config.get('profile') video_stream = Stream( codec_configuration_id=encoding_config.get('codec').id, input_streams=[video_input_stream], name='Stream {}p_{}k'.format(encoding_profile.get('height'), encoding_profile.get('bitrate'))) encoding_config['stream'] = bitmovin.encodings.Stream.create( object_=video_stream, encoding_id=encoding.id).resource audio_stream = Stream(codec_configuration_id=audio_codec_configuration.id, input_streams=[audio_input_stream], name='Audio Stream') audio_stream = bitmovin.encodings.Stream.create( object_=audio_stream, encoding_id=encoding.id).resource # Create FMP4 muxings which are later used for the DASH manifest. The current settings will set a segment length # of 4 seconds. for encoding_config in encoding_configs: encoding_profile = encoding_config.get('profile') video_muxing_stream = MuxingStream(encoding_config.get('stream').id) video_muxing_output = EncodingOutput( output_id=s3_output.id, output_path=OUTPUT_BASE_PATH + 'video/dash/{}p_{}k/'.format(encoding_profile.get('height'), encoding_profile.get('bitrate')), acl=[acl_entry]) video_muxing = FMP4Muxing(segment_length=4, segment_naming='seg_%number%.m4s', init_segment_name='init.mp4', streams=[video_muxing_stream], outputs=[video_muxing_output], name='FMP4 Muxing {}p_{}k'.format( encoding_profile.get('height'), encoding_profile.get('bitrate'))) encoding_config['fmp4_muxing'] = bitmovin.encodings.Muxing.FMP4.create( object_=video_muxing, encoding_id=encoding.id).resource audio_muxing_stream = MuxingStream(audio_stream.id) audio_muxing_output = EncodingOutput(output_id=s3_output.id, output_path=OUTPUT_BASE_PATH + 'audio_dash/', acl=[acl_entry]) audio_fmp4_muxing = FMP4Muxing(segment_length=4, segment_naming='seg_%number%.m4s', init_segment_name='init.mp4', streams=[audio_muxing_stream], outputs=[audio_muxing_output], name='Audio FMP4 Muxing') audio_fmp4_muxing = bitmovin.encodings.Muxing.FMP4.create( object_=audio_fmp4_muxing, encoding_id=encoding.id).resource # Create TS muxings which are later used for the DASH manifest. The current settings will set a segment length # of 4 seconds. for encoding_config in encoding_configs: encoding_profile = encoding_config.get('profile') video_muxing_stream = MuxingStream(encoding_config.get('stream').id) video_muxing_output = EncodingOutput( output_id=s3_output.id, output_path=OUTPUT_BASE_PATH + 'video/hls/{}p_{}k/'.format(encoding_profile.get('height'), encoding_profile.get('bitrate')), acl=[acl_entry]) video_muxing = TSMuxing(segment_length=4, segment_naming='seg_%number%.ts', streams=[video_muxing_stream], outputs=[video_muxing_output], name='TS Muxing {}p_{}k'.format( encoding_profile.get('height'), encoding_profile.get('bitrate'))) encoding_config['ts_muxing'] = bitmovin.encodings.Muxing.TS.create( object_=video_muxing, encoding_id=encoding.id).resource audio_muxing_stream = MuxingStream(audio_stream.id) audio_muxing_output = EncodingOutput(output_id=s3_output.id, output_path=OUTPUT_BASE_PATH + 'audio_hls/', acl=[acl_entry]) audio_ts_muxing = TSMuxing(segment_length=4, segment_naming='seg_%number%.ts', streams=[audio_muxing_stream], outputs=[audio_muxing_output], name='Audio TS Muxing') audio_ts_muxing = bitmovin.encodings.Muxing.TS.create( object_=audio_ts_muxing, encoding_id=encoding.id).resource bitmovin.encodings.Encoding.start(encoding_id=encoding.id) try: bitmovin.encodings.Encoding.wait_until_finished( encoding_id=encoding.id, check_interval=5) except BitmovinError as bitmovin_error: print('Exception occurred while waiting for encoding to finish: {}'. format(bitmovin_error)) exit(-1) # Specify the output for manifest which will be in the OUTPUT_BASE_PATH. manifest_output = EncodingOutput(output_id=s3_output.id, output_path=OUTPUT_BASE_PATH, acl=[acl_entry]) # Create a DASH manifest and add one period with an adapation set for audio and video dash_manifest = DashManifest(manifest_name='stream.mpd', outputs=[manifest_output], name='DASH Manifest') dash_manifest = bitmovin.manifests.DASH.create(dash_manifest).resource period = Period() period = bitmovin.manifests.DASH.add_period( object_=period, manifest_id=dash_manifest.id).resource video_adaptation_set = VideoAdaptationSet() video_adaptation_set = bitmovin.manifests.DASH.add_video_adaptation_set( object_=video_adaptation_set, manifest_id=dash_manifest.id, period_id=period.id).resource audio_adaptation_set = AudioAdaptationSet(lang='en') audio_adaptation_set = bitmovin.manifests.DASH.add_audio_adaptation_set( object_=audio_adaptation_set, manifest_id=dash_manifest.id, period_id=period.id).resource # Add all representation to the video adaption set for encoding_config in encoding_configs: encoding_profile = encoding_config.get('profile') muxing = encoding_config.get('fmp4_muxing') fmp4_representation_1080p = FMP4Representation( FMP4RepresentationType.TEMPLATE, encoding_id=encoding.id, muxing_id=muxing.id, segment_path='video/dash/{}p_{}k/'.format( encoding_profile.get('height'), encoding_profile.get('bitrate'))) encoding_config[ 'dash'] = bitmovin.manifests.DASH.add_fmp4_representation( object_=fmp4_representation_1080p, manifest_id=dash_manifest.id, period_id=period.id, adaptationset_id=video_adaptation_set.id).resource fmp4_representation_audio = FMP4Representation( FMP4RepresentationType.TEMPLATE, encoding_id=encoding.id, muxing_id=audio_fmp4_muxing.id, segment_path='audio_dash/') bitmovin.manifests.DASH.add_fmp4_representation( object_=fmp4_representation_audio, manifest_id=dash_manifest.id, period_id=period.id, adaptationset_id=audio_adaptation_set.id) bitmovin.manifests.DASH.start(manifest_id=dash_manifest.id) # Create a HLS manifest and add one period with an adapation set for audio and video hls_manifest = HlsManifest(manifest_name='stream.m3u8', outputs=[manifest_output], name='HLS Manifest') hls_manifest = bitmovin.manifests.HLS.create(hls_manifest).resource audio_media = AudioMedia(name='HLS Audio Media', group_id='audio', segment_path='audio_hls/', encoding_id=encoding.id, stream_id=audio_stream.id, muxing_id=audio_ts_muxing.id, language='en', uri='audio.m3u8') audio_media = bitmovin.manifests.HLS.AudioMedia.create( manifest_id=hls_manifest.id, object_=audio_media).resource # Add all representation to the video adaption set for encoding_config in encoding_configs: encoding_profile = encoding_config.get('profile') stream = encoding_config.get('stream') muxing = encoding_config.get('ts_muxing') variant_stream = VariantStream( audio='audio', closed_captions='NONE', segment_path='video/hls/{}p_{}k/'.format( encoding_profile.get('height'), encoding_profile.get('bitrate')), uri='video_{}p_{}k.m3u8'.format(encoding_profile.get('height'), encoding_profile.get('bitrate')), encoding_id=encoding.id, stream_id=stream.id, muxing_id=muxing.id) variant_stream = bitmovin.manifests.HLS.VariantStream.create( manifest_id=hls_manifest.id, object_=variant_stream).resource bitmovin.manifests.HLS.start(manifest_id=hls_manifest.id) try: bitmovin.manifests.DASH.wait_until_finished( manifest_id=dash_manifest.id, check_interval=1) except BitmovinError as bitmovin_error: print( 'Exception occurred while waiting for manifest creation to finish: {}' .format(bitmovin_error)) exit(-1) try: bitmovin.manifests.HLS.wait_until_finished(manifest_id=hls_manifest.id, check_interval=1) except BitmovinError as bitmovin_error: print( 'Exception occurred while waiting for manifest creation to finish: {}' .format(bitmovin_error)) exit(-1)