protected override void OnCreate(Bundle savedInstanceState) { context = this; base.OnCreate(savedInstanceState); Xamarin.Essentials.Platform.Init(this, savedInstanceState); SetContentView(Resource.Layout.activity_main); var toolbar = FindViewById<Toolbar>(Resource.Id.toolbar); SetSupportActionBar(toolbar); var processButton = FindViewById<Button>(Resource.Id.processButton); processButton.Click += ProcessButton_Click; _playerView = FindViewById<PlayerView>(Resource.Id.playerView); _sourceMedia = new SourceMedia(); _targetMedia = new TargetMedia(); _transformationState = new TransformationState(); _trimConfig = new TrimConfig(); _mediaTransformer = new MediaTransformer(this); var builder = new SimpleExoPlayer.Builder(this); _player = builder.Build(); _player.PlayWhenReady = true; _playerView.Player = _player; }
public void TranscodeAudio(SourceMedia sourceMedia, TargetMedia targetMedia, TrimConfig trimConfig, TransformationState transformationState) { if (targetMedia.targetFile.Exists()) { targetMedia.targetFile.Delete(); } transformationState.requestId = UUID.RandomUUID().ToString(); /* MediaTransformationListener transformationListener = new MediaTransformationListener(context, transformationState.requestId, transformationState, targetMedia); */ MediaRange mediaRange = trimConfig.enabled ? new MediaRange( TimeUnit.Milliseconds.ToMicros((long)(trimConfig.range[0] * 1000)), TimeUnit.Milliseconds.ToMicros((long)(trimConfig.range[1] * 1000))) : new MediaRange(0, long.MaxValue); try { var targetMimeType = targetMedia.writeToWav ? "audio/raw" : "audio/mp4a-latm"; IMediaTarget mediaTarget; if (targetMedia.writeToWav) { mediaTarget = new WavMediaTarget(targetMedia.targetFile.Path); } else { mediaTarget = new MediaMuxerMediaTarget(targetMedia.targetFile.Path, 1, 0, (int)MuxerOutputType.Mpeg4); } var mediaSource = new MediaExtractorMediaSource(context, sourceMedia.uri, mediaRange); List<TrackTransform> trackTransforms = new List<TrackTransform>(1); foreach (TargetTrack targetTrack in targetMedia.tracks) { if (targetTrack.format is AudioTrackFormat trackFormat) { MediaFormat mediaFormat = MediaFormat.CreateAudioFormat( targetMimeType, trackFormat.samplingRate, trackFormat.channelCount); mediaFormat.SetInteger(MediaFormat.KeyBitRate, trackFormat.bitrate); mediaFormat.SetLong(MediaFormat.KeyDuration, trackFormat.duration); IEncoder encoder; if (targetMedia.writeToWav) { encoder = new PassthroughBufferEncoder(8192); } else { encoder = new MediaCodecEncoder(); } //IEncoder encoder = targetMedia.writeToWav ? new PassthroughBufferEncoder(8192) : new MediaCodecEncoder(); TrackTransform trackTransform = new TrackTransform.Builder(mediaSource, targetTrack.sourceTrackIndex, mediaTarget) .SetTargetTrack(0) .SetDecoder(new MediaCodecDecoder()) .SetEncoder(encoder) .SetRenderer(new AudioRenderer(encoder)) .SetTargetFormat(mediaFormat) .Build(); trackTransforms.Add(trackTransform); break; } } _mediaTransformer.Transform( transformationState.requestId, trackTransforms, this, MediaTransformer.GranularityDefault); } catch (System.Exception err) { System.Diagnostics.Debug.WriteLine($"Exception when trying to transcode audio: {err.Message}"); } }
void ApplyWatermark(SourceMedia sourceMedia, TargetMedia targetMedia, TrimConfig trimConfig, TransformationState transformationState) { if (targetMedia.targetFile.Exists()) { targetMedia.targetFile.Delete(); } transformationState.requestId = UUID.RandomUUID().ToString(); /* MediaTransformationListener transformationListener = new MediaTransformationListener(this, transformationState.requestId, transformationState, targetMedia); */ var resourceId = Resource.Drawable.test_image_1; var watermarkUri = new Uri.Builder() .Scheme(ContentResolver.SchemeAndroidResource) .Authority(Resources.GetResourcePackageName(resourceId)) .AppendPath(Resources.GetResourceTypeName(resourceId)) .AppendPath(Resources.GetResourceEntryName(resourceId)) .Build(); List<IGlFilter> watermarkImageFilter = null; foreach (TargetTrack targetTrack in targetMedia.tracks) { if (targetTrack is TargetVideoTrack targetVideoTrack) { targetVideoTrack.overlay = watermarkUri; watermarkImageFilter = createGlFilters( sourceMedia, (TargetVideoTrack)targetTrack, 0.2f, new PointF(0.8f, 0.8f), 0); break; } } MediaRange mediaRange = trimConfig.enabled ? new MediaRange( TimeUnit.Milliseconds.ToMicros((long)(trimConfig.range[0] * 1000)), TimeUnit.Milliseconds.ToMicros((long)(trimConfig.range[1] * 1000))) : new MediaRange(0, long.MaxValue); TransformationOptions transformationOptions = new TransformationOptions.Builder() .SetGranularity(MediaTransformer.GranularityDefault) .SetVideoFilters(watermarkImageFilter) .SetSourceMediaRange(mediaRange) .Build(); _mediaTransformer.Transform( _transformationState.requestId, _sourceMedia.uri, targetMedia.targetFile.Path, null, null, this, transformationOptions); }