Esempio n. 1
0
        public void BuildCompositionObjects(Boolean playBack)
        {
            if (Clips == null || Clips.Count == 0)
            {
                Composition      = null;
                VideoComposition = null;
                AudioMix         = null;
                return;
            }

            SizeF videoSize         = Clips [0].NaturalSize;
            var   composition1      = AVMutableComposition.Create();
            var   videoComposition1 = AVMutableVideoComposition.Create();
            var   audioMix          = AVMutableAudioMix.Create();

            composition1.NaturalSize = videoSize;

            BuildTransitionComposition(composition1, videoComposition1, audioMix);
            if (videoComposition1 != null)
            {
                videoComposition1.FrameDuration = new CMTime(1, 30);
                videoComposition1.RenderSize    = videoSize;
            }

            Composition      = composition1;
            VideoComposition = videoComposition1;
            AudioMix         = audioMix;
        }
        unsafe AVAudioMix CreateAudioMix()
        {
            AVMutableAudioMix audioMix = AVMutableAudioMix.Create();
            AVMutableAudioMixInputParameters audioMixInputParameters = AVMutableAudioMixInputParameters.FromTrack(audioAssetTrack);
            var callbacks = new MTAudioProcessingTapCallbacks(TapProcess)
            {
                Initialize = TapInitialization,
                Finalize   = Finalaze,
                Prepare    = TapPrepare,
                Unprepare  = Unprepare,
            };

            audioProcessingTap = new MTAudioProcessingTap(callbacks, MTAudioProcessingTapCreationFlags.PreEffects);
            audioMixInputParameters.AudioTapProcessor = audioProcessingTap;

            audioMix.InputParameters = new AVAudioMixInputParameters[] { audioMixInputParameters };

            return(audioMix);
        }
        public Task <OperationResult> AddAudioToVideoTrack(string videoFilePath, string audioFilePath, string outputFilePath,
                                                           float volume = 1, float fadeOutDuration = 0)
        {
            var tcs = new TaskCompletionSource <OperationResult>();

            var composition           = AVMutableComposition.Create();
            var videoCompositionTrack = composition.AddMutableTrack(AVMediaType.Video, 0);
            var audioCompositionTrack = composition.AddMutableTrack(AVMediaType.Audio, 0);

            var videoUrl        = NSUrl.FromFilename(videoFilePath);
            var videoAsset      = AVAsset.FromUrl(videoUrl);
            var videoAssetTrack = videoAsset.TracksWithMediaType(AVMediaType.Video).First();

            var audioUrl        = NSUrl.FromFilename(audioFilePath);
            var audioAsset      = AVAsset.FromUrl(audioUrl);
            var audioAssetTrack = audioAsset.TracksWithMediaType(AVMediaType.Audio).First();

            CGSize size = videoAssetTrack.NaturalSize;
            CMTime time = CMTime.Zero;

            var range = new CMTimeRange
            {
                Start    = CMTime.Zero,
                Duration = videoAssetTrack.TimeRange.Duration
            };

            NSError error = null;

            videoCompositionTrack.InsertTimeRange(range, videoAssetTrack, time, out error);
            if (error != null)
            {
                Console.WriteLine("Error adding video composition track: " + error.LocalizedDescription);
            }

            error = null;
            audioCompositionTrack.InsertTimeRange(range, audioAssetTrack, time, out error);
            if (error != null)
            {
                Console.WriteLine("Error adding audio composition track: " + error.LocalizedDescription);
            }


            var audioMix         = AVMutableAudioMix.Create();
            var audioInputParams = AVMutableAudioMixInputParameters.FromTrack(audioCompositionTrack);

            audioInputParams.SetVolume(volume, CMTime.Zero);

            if (fadeOutDuration > 0)
            {
                var fadeOutStartTime = CMTime.Subtract(videoAssetTrack.TimeRange.Duration, CMTime.FromSeconds(fadeOutDuration, audioAssetTrack.NaturalTimeScale));
                var fadeOutRange     = new CMTimeRange
                {
                    Start    = fadeOutStartTime,
                    Duration = CMTime.FromSeconds(fadeOutDuration, audioAssetTrack.NaturalTimeScale)
                };

                audioInputParams.SetVolumeRamp(volume, 0.0f, fadeOutRange);
            }

            audioMix.InputParameters = new[] { audioInputParams };

            var session = new AVAssetExportSession(composition, AVAssetExportSession.PresetHighestQuality);

            session.OutputUrl      = NSUrl.FromFilename(outputFilePath);
            session.OutputFileType = AVFileType.Mpeg4;
            session.AudioMix       = audioMix;

            session.ExportAsynchronously(() =>
            {
                if (session.Status == AVAssetExportSessionStatus.Failed)
                {
                    tcs.SetResult(OperationResult.AsFailure(session.Error.LocalizedDescription));
                }
                else
                {
                    tcs.SetResult(OperationResult.AsSuccess());
                }
            });

            return(tcs.Task);
        }