// Should not be called by the UI thread private MP4Config testMediaRecorderAPI() { System.String key = PREF_PREFIX + "h264-mr-" + mRequestedQuality.framerate + "," + mRequestedQuality.resX + "," + mRequestedQuality.resY; if (mSettings != null && mSettings.Contains(key)) { System.String[] s = mSettings.GetString(key, "").Split(','); return(new MP4Config(s[0], s[1], s[2])); } if (!Android.OS.Environment.ExternalStorageState.Equals(Android.OS.Environment.MediaMounted)) { throw new StorageUnavailableException("No external storage or external storage not ready !"); } System.String TESTFILE = Android.OS.Environment.ExternalStorageDirectory.ToString() + "/spydroid-test.mp4"; Log.Info(TAG, "Testing H264 support... Test file saved at: " + TESTFILE); try { File file = new File(TESTFILE); file.CreateNewFile(); } catch (IOException e) { throw new StorageUnavailableException(e.Message); } // Save flash state & set it to false so that led remains off while testing h264 bool savedFlashState = mFlashEnabled; mFlashEnabled = false; bool previewStarted = mPreviewStarted; bool cameraOpen = mCamera != null; createCamera(); // Stops the preview if needed if (mPreviewStarted) { lockCamera(); try { mCamera.stopPreview(); } catch (Exception e) {} mPreviewStarted = false; } try { Thread.Sleep(100); } catch (InterruptedException e1) { // TODO Auto-generated catch block e1.PrintStackTrace(); } unlockCamera(); try { mMediaRecorder = new MediaRecorder(); mMediaRecorder.SetCamera(mCamera); mMediaRecorder.SetVideoSource(VideoSource.Camera); mMediaRecorder.SetOutputFormat(OutputFormat.ThreeGpp); mMediaRecorder.SetVideoEncoder((VideoEncoder)mVideoEncoder); mMediaRecorder.SetPreviewDisplay(mSurfaceView.Holder.Surface); mMediaRecorder.SetVideoSize(mRequestedQuality.resX, mRequestedQuality.resY); mMediaRecorder.SetVideoFrameRate(mRequestedQuality.framerate); mMediaRecorder.SetVideoEncodingBitRate((int)(mRequestedQuality.bitrate * 0.8)); mMediaRecorder.SetOutputFile(TESTFILE); mMediaRecorder.SetMaxDuration(3000); // We wait a little and stop recording mMediaRecorder.SetOnInfoListener(this); /*mMediaRecorder.SetOnInfoListener(new MediaRecorder.IOnInfoListener() { * public void onInfo(MediaRecorder mr, int what, int extra) { * Log.d(TAG,"MediaRecorder callback called !"); * if (what==MediaRecorder.MEDIA_RECORDER_INFO_MAX_DURATION_REACHED) { * Log.d(TAG,"MediaRecorder: MAX_DURATION_REACHED"); * } else if (what==MediaRecorder.MEDIA_RECORDER_INFO_MAX_FILESIZE_REACHED) { * Log.d(TAG,"MediaRecorder: MAX_FILESIZE_REACHED"); * } else if (what==MediaRecorder.MEDIA_RECORDER_INFO_UNKNOWN) { * Log.d(TAG,"MediaRecorder: INFO_UNKNOWN"); * } else { * Log.d(TAG,"WTF ?"); * } * mLock.release(); * } * });*/ // Start recording mMediaRecorder.Prepare(); mMediaRecorder.Start(); if (mLock.TryAcquire(6, TimeUnit.Seconds)) { Log.d(TAG, "MediaRecorder callback was called :)"); Thread.Sleep(400); } else { Log.d(TAG, "MediaRecorder callback was not called after 6 seconds... :("); } } catch (IOException e) { throw new ConfNotSupportedException(e.Message); } catch (RuntimeException e) { throw new ConfNotSupportedException(e.Message); } catch (InterruptedException e) { e.PrintStackTrace(); } finally { try { mMediaRecorder.stop(); } catch (Java.Lang.Exception e) {} mMediaRecorder.Release(); mMediaRecorder = null; lockCamera(); if (!cameraOpen) { destroyCamera(); } // Restore flash state mFlashEnabled = savedFlashState; if (previewStarted) { // If the preview was started before the test, we try to restart it. try { startPreview(); } catch (Java.Lang.Exception e) {} } } // Retrieve SPS & PPS & ProfileId with MP4Config MP4Config config = new MP4Config(TESTFILE); // Delete dummy video File file = new File(TESTFILE); if (!file.Delete()) { Log.e(TAG, "Temp file could not be erased"); } Log.i(TAG, "H264 Test succeded..."); // Save test result if (mSettings != null) { ISharedPreferencesEditor editor = mSettings.Edit(); editor.PutString(key, config.getProfileLevel() + "," + config.getB64SPS() + "," + config.getB64PPS()); editor.Commit(); } return(config); }
private void initRecorder() { recorder = new MediaRecorder(); path = Android.OS.Environment.ExternalStorageDirectory.AbsolutePath + "/PincidentReport.mp4"; recorder.SetCamera(camera); string manufacturer = Build.Manufacturer; if (ActivityCompat.CheckSelfPermission(CurrentContext, Manifest.Permission.RecordAudio) != Permission.Granted) { ActivityCompat.RequestPermissions(CurrentContext, new System.String[] { Manifest.Permission.RecordAudio }, 10); } else { if (manufacturer.ToLower().Contains("samsung")) { recorder.SetAudioSource(AudioSource.VoiceCommunication); } else { recorder.SetAudioSource(AudioSource.Default); } } recorder.SetVideoSource(VideoSource.Camera); recorder.SetOutputFile(path); recorder.SetOnInfoListener(this); recorder.SetPreviewDisplay(videoView.Holder.Surface); recorder.SetOutputFormat(OutputFormat.Default); var SupportedVideoFrameRateByCamera = camera.GetParameters().SupportedPreviewFrameRates; var SmallToBigFrameRates = SupportedVideoFrameRateByCamera.Reverse(); var maxFrameRate = SmallToBigFrameRates.First().IntValue(); recorder.SetVideoFrameRate(maxFrameRate); var SupportedSizesByCamera = camera.GetParameters().SupportedVideoSizes; var SmallToBigSizesList = SupportedSizesByCamera.Reverse(); Android.Hardware.Camera.Size size = new Android.Hardware.Camera.Size(camera, 0, 0); foreach (var videoSize in SmallToBigSizesList) // The closest Height to 480 { if (videoSize.Height == 480) { size = videoSize; break; } else if (videoSize.Height > 480) { size = videoSize; break; } } if (size.Height == 0) { size = SmallToBigSizesList.ElementAt(0); } recorder.SetVideoSize(size.Width, size.Height); recorder.SetVideoEncoder(VideoEncoder.Mpeg4Sp);// MPEG_4_SP recorder.SetAudioEncoder(AudioEncoder.Aac); recorder.SetMaxDuration(15000); recorder.SetOrientationHint(90); }