Ejemplo n.º 1
0
        private void SetupReaderAndWriter()
        {
            AVAsset localAsset     = _asset;
            NSUrl   localOutputURL = _outputURL;
            NSError error          = null;

            // Create asset reader and asset writer
            _assetReader = new AVAssetReader(localAsset, out error);
            if (_assetReader == null)
            {
                throw new NSErrorException(error);
            }

            _assetWriter = new AVAssetWriter(localOutputURL, AVFileType.QuickTimeMovie, out error);
            if (_assetWriter == null)
            {
                throw new NSErrorException(error);
            }

            // Create asset reader outputs and asset writer inputs for the first audio track and first video track of the asset
            // Grab first audio track and first video track, if the asset has them
            AVAssetTrack audioTrack = localAsset.TracksWithMediaType(AVMediaType.Audio).FirstOrDefault();
            AVAssetTrack videoTrack = localAsset.TracksWithMediaType(AVMediaType.Video).FirstOrDefault();

            SetupAssetReaderWriterForAudio(audioTrack);
            SetupAssetReaserWriterForVideo(videoTrack);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Starts the recording.
        /// </summary>
        public void StartRecording()
        {
            //Console.WriteLine ("Start Recording");
            movieWritingQueue.DispatchAsync(() =>
            {
                if (recordingWillBeStarted || IsRecording)
                {
                    return;
                }

                recordingWillBeStarted = true;

                // recordingDidStart is called from captureOutput.DidOutputSampleBuffer.FromeConnection one the asset writere is setup
                if (RecordingWillStart != null)
                {
                    RecordingWillStart();
                }

                // Remove the file if one with the same name already exists
                RemoveFile(movieURL);

                // Create an asset writer
                NSError error;
                assetWriter = new AVAssetWriter(movieURL, AVFileType.QuickTimeMovie, out error);
                if (error != null)
                {
                    ShowError(error);
                }
            });
        }
Ejemplo n.º 3
0
        void SetupReaderAndWriter()
        {
            NSError error = null;

            // Create asset reader and asset writer
            assetReader = AVAssetReader.FromAsset(asset, out error);
            if (assetReader == null)
            {
                throw new NSErrorException(error);
            }

            assetWriter = AVAssetWriter.FromUrl(outputURL, AVFileType.QuickTimeMovie, out error);
            if (assetWriter == null)
            {
                throw new NSErrorException(error);
            }

            // Create asset reader outputs and asset writer inputs for the first audio track and first video track of the asset
            // Grab first audio track and first video track, if the asset has them
            AVAssetTrack audioTrack = asset.TracksWithMediaType(AVMediaType.Audio).FirstOrDefault();
            AVAssetTrack videoTrack = asset.TracksWithMediaType(AVMediaType.Video).FirstOrDefault();

            SetupAssetReaderWriterForAudio(audioTrack);
            SetupAssetReaserWriterForVideo(videoTrack);
        }
        public void StopRecording()
        {
            movieWritingQueue.DispatchAsync(() =>
            {
                if (recordingWillBeStopped || !IsRecording)
                {
                    return;
                }

                recordingWillBeStopped = true;

                // recordingDidStop is called from saveMovieToCameraRoll
                RecordingWillStop?.Invoke();

                if (assetWriter.FinishWriting())
                {
                    if (assetWriterAudioIn != null)
                    {
                        assetWriterAudioIn.Dispose();
                        assetWriterAudioIn = null;
                    }

                    if (assetWriterVideoIn != null)
                    {
                        assetWriterVideoIn.Dispose();
                        assetWriterVideoIn = null;
                    }

                    lock (inUse)
                    {
                        assetWriter.Dispose();
                        assetWriter = null;

                        // Clear the 'Inuse' list when we're creating a new Recording session.
                        inUse.Clear();
                    }

                    readyToRecordVideo = false;
                    readyToRecordAudio = false;

                    SaveMovieToCameraRoll();
                }
                else
                {
                    ShowError(assetWriter.Error);
                }
            });
        }
Ejemplo n.º 5
0
        void ReadingAndWritingDidFinish(bool success, NSError error)
        {
            if (!success)
            {
                assetReader.CancelReading();
                assetWriter.CancelWriting();
            }

            // Tear down
            assetReader.Dispose();
            assetReader = null;

            assetWriter.Dispose();
            assetWriter = null;

            audioSampleBufferChannel = null;
            videoSampleBufferChannel = null;
            cancellationTokenSrc     = null;

            completionProc(error);
        }
		public void StopRecording ()
		{
			movieWritingQueue.DispatchAsync (() =>
			{
				if (recordingWillBeStopped || !IsRecording)
					return;
				
				recordingWillBeStopped = true;
				
				// recordingDidStop is called from saveMovieToCameraRoll
				if (RecordingWillStop != null)
					RecordingWillStop ();
				
				if (assetWriter.FinishWriting ()){
					if (assetWriterAudioIn != null)
						assetWriterAudioIn.Dispose ();
					if (assetWriterVideoIn != null)
						assetWriterVideoIn.Dispose ();
					
					lock(inuse){
						assetWriter.Dispose ();
						assetWriter = null;
					
						// Clear the 'Inuse' list when we're creating a new Recording session.
						inuse.Clear();
					}
					
					readyToRecordVideo = false;
					readyToRecordAudio = false;
					
					SaveMovieToCameraRoll ();
				} else 
					ShowError (assetWriter.Error);	
			});           
		}
		/// <summary>
		/// Starts the recording.
		/// </summary>
		public void StartRecording ()
		{
			//Console.WriteLine ("Start Recording");
			movieWritingQueue.DispatchAsync (() =>
			{
				if (recordingWillBeStarted || IsRecording)
					return;
				
				recordingWillBeStarted = true;
				
				// recordingDidStart is called from captureOutput.DidOutputSampleBuffer.FromeConnection one the asset writere is setup
				if (RecordingWillStart != null)
					RecordingWillStart ();
				
				// Remove the file if one with the same name already exists
				RemoveFile (movieURL);
				
				// Create an asset writer
				NSError error;
				assetWriter = new AVAssetWriter (movieURL, AVFileType.QuickTimeMovie, out error);
				if (error != null)
					ShowError (error);
			});
		}
Ejemplo n.º 8
0
        protected AVAssetWriter MaybeInitializeAssetWriter()
        {
            var filePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "Temporary.mov");
            if (File.Exists(filePath))
            {
                File.Delete(filePath);
            }
            videoUrl = NSUrl.FromFilename(filePath);

            NSError error;
            var writer = new AVAssetWriter(videoUrl, AVFileType.QuickTimeMovie, out error);
            if (error != null)
            {
                Failure.Alert(error.LocalizedDescription);
                return null;
            }
            return writer;
        }
Ejemplo n.º 9
0
        public bool StartRecording()
        {
            try
            {
                session = MaybeInitializeSession();
                if (session == null)
                {
                    Failure.Alert("Couldn't initialize session");
                    return false;
                }
                writer = MaybeInitializeAssetWriter();
                if (writer == null)
                {
                    Failure.Alert("Couldn't initialize writer");
                    return false;
                }
                inputWriter = MaybeInitializeInputWriter();
                if (inputWriter == null)
                {
                    Failure.Alert("Couldn't initialize input writer");
                    return false;
                }
                if (!writer.CanAddInput(inputWriter))
                {
                    Failure.Alert("Couldn't add input writer to writer");
                    return false;
                }
                writer.AddInput(inputWriter);

                session.StartRunning();
                return true;
            }
            catch (Exception x)
            {
                Failure.Alert(x.Message);
                return false;
            }
        }
        public Compression CompressVideo(NSUrl source, NSUrl destination, bool isMinBitRateEnabled = true, VideoQuality quality = VideoQuality.high, bool keepOriginalResolution = false)
        {
            var frameCount           = 0;
            var compressionOperation = new Compression();

            var videoAsset = new AVUrlAsset(source);

            try
            {
                var videoTrack = videoAsset.Tracks.First(x => x.MediaType == AVMediaType.Video);
                var bitrate    = videoTrack.EstimatedDataRate;

                // Check for a min video bitrate before compression
                if (isMinBitRateEnabled && bitrate <= MIN_BITRATE)
                {
                    var error = new Compression();
                    error.title = "The provided bitrate is smaller than what is needed for compression try to set isMinBitRateEnabled to false";
                    //TODO: ENVIAR ENVENTO DE ERRO
                    return(error);
                }

                var newBitrate = getBitrate(bitrate, quality);

                // Handle new width and height values
                var videoSize = videoTrack.NaturalSize;
                var size      = generateWidthAndHeight(videoSize.Width, videoSize.Height, keepOriginalResolution);
                var newWidth  = size.Width;
                var newHeight = size.Height;

                // Total Frames
                var durationInSeconds = videoAsset.Duration.Seconds;
                var frameRate         = videoTrack.NominalFrameRate;
                var totalFrames       = Math.Ceiling(durationInSeconds * (double)(frameRate));

                // Progress
                var totalUnits = Convert.ToInt64(totalFrames);
                //var progress = NSProgress(totalUnits);

                // Setup video writer input
                var videoWriterInput = new AVAssetWriterInput(AVMediaType.Video, getVideoWriterSettings(newBitrate, newWidth, newHeight));
                videoWriterInput.ExpectsMediaDataInRealTime = true;
                videoWriterInput.Transform = videoTrack.PreferredTransform;

                NSError nSError;

                var videoWriter = new AVAssetWriter(destination, AVFileType.QuickTimeMovie, out nSError);
                videoWriter.AddInput(videoWriterInput);

                var videoReaderSettings = new NSDictionary(
                    "PixelFormatType", new NSNumber(875704438)
                    );

                var videoReaderOutput = new AVAssetReaderTrackOutput(videoTrack, videoReaderSettings);

                AVAssetReader videoReader;
                try
                {
                    videoReader = new AVAssetReader(videoAsset, out nSError);
                    videoReader.AddOutput(videoReaderOutput);
                }
                catch
                {
                    Console.WriteLine("video reader error: (error)");
                    //TODO - Chamar eventi de erro
                }

                //TODO: Verificar como passar parametro nil
                var audioSettings = new AudioSettings()
                {
                    //EncoderBitRate = 64000,
                    //Format = AudioToolbox.AudioFormatType.,
                    NumberChannels = 1,
                    //SampleRate = 44100
                };

                var audioWriterInput = new AVAssetWriterInput(AVMediaType.Audio, audioSettings);
                audioWriterInput.ExpectsMediaDataInRealTime = false;
                videoWriter.AddInput(audioWriterInput);

                //setup audio reader
                var audioTrack        = videoAsset.Tracks.FirstOrDefault(x => x.MediaType == AVMediaType.Audio);
                var audioReaderOutput = new AVAssetReaderTrackOutput(audioTrack, audioSettings);
                var audioReader       = new AVAssetReader(videoAsset, out nSError);
                audioReader.AddOutput(audioReaderOutput);
                videoWriter.StartWriting();
            }
            catch (Exception ex)
            {
                //TODO: Incluir tratamento de erro
                return(new Compression());
            }

            return(new Compression());
        }
Ejemplo n.º 11
0
		void SetupReaderAndWriter ()
		{
			NSError error = null;

			// Create asset reader and asset writer
			assetReader = AVAssetReader.FromAsset (asset, out error);
			if (assetReader == null)
				throw new NSErrorException (error);

			assetWriter = AVAssetWriter.FromUrl (outputURL, AVFileType.QuickTimeMovie, out error);
			if (assetWriter == null)
				throw new NSErrorException (error);

			// Create asset reader outputs and asset writer inputs for the first audio track and first video track of the asset
			// Grab first audio track and first video track, if the asset has them
			AVAssetTrack audioTrack = asset.TracksWithMediaType (AVMediaType.Audio).FirstOrDefault ();
			AVAssetTrack videoTrack = asset.TracksWithMediaType (AVMediaType.Video).FirstOrDefault ();

			SetupAssetReaderWriterForAudio (audioTrack);
			SetupAssetReaserWriterForVideo (videoTrack);
		}
Ejemplo n.º 12
0
		void ReadingAndWritingDidFinish (bool success, NSError error)
		{
			if (!success) {
				assetReader.CancelReading ();
				assetWriter.CancelWriting ();
			}

			// Tear down
			assetReader.Dispose ();
			assetReader = null;

			assetWriter.Dispose ();
			assetWriter = null;

			audioSampleBufferChannel = null;
			videoSampleBufferChannel = null;
			cancellationTokenSrc = null;

			completionProc (error);
		}
Ejemplo n.º 13
0
		private void SetupReaderAndWriter()
		{
			AVAsset localAsset = _asset;
			NSUrl localOutputURL = _outputURL;
			NSError error = null;

			// Create asset reader and asset writer
			_assetReader = new AVAssetReader (localAsset, out error);
			if (_assetReader == null)
				throw new NSErrorException(error);

			_assetWriter = new AVAssetWriter (localOutputURL, AVFileType.QuickTimeMovie, out error);
			if (_assetWriter == null)
				throw new NSErrorException(error);

			// Create asset reader outputs and asset writer inputs for the first audio track and first video track of the asset
			// Grab first audio track and first video track, if the asset has them
			AVAssetTrack audioTrack = localAsset.TracksWithMediaType (AVMediaType.Audio).FirstOrDefault ();
			AVAssetTrack videoTrack = localAsset.TracksWithMediaType (AVMediaType.Video).FirstOrDefault ();

			SetupAssetReaderWriterForAudio (audioTrack);
			SetupAssetReaserWriterForVideo (videoTrack);
		}