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