/** * Returns a description of the stream using SDP. It can then be included in an SDP file. */ public System.String getSessionDescription() { lock (this) { if (mConfig == null) { throw new IllegalStateException("You need to call configure() first !"); } return("m=video " + getDestinationPorts()[0].ToString() + " RTP/AVP 96\r\n" + "a=rtpmap:96 H264/90000\r\n" + "a=fmtp:96 packetization-mode=1;profile-level-id=" + mConfig.getProfileLevel() + ";sprop-parameter-sets=" + mConfig.getB64SPS() + "," + mConfig.getB64PPS() + ";\r\n"); } }
// 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); }