use of net.majorkernelpanic.streaming.mp4.MP4Config in project libstreaming by fyhertz.
the class H264Stream method testMediaRecorderAPI.
// Should not be called by the UI thread
private MP4Config testMediaRecorderAPI() throws RuntimeException, IOException {
String key = PREF_PREFIX + "h264-mr-" + mRequestedQuality.framerate + "," + mRequestedQuality.resX + "," + mRequestedQuality.resY;
if (mSettings != null && mSettings.contains(key)) {
String[] s = mSettings.getString(key, "").split(",");
return new MP4Config(s[0], s[1], s[2]);
}
if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
throw new StorageUnavailableException("No external storage or external storage not ready !");
}
final String TESTFILE = Environment.getExternalStorageDirectory().getPath() + "/spydroid-test.mp4";
Log.i(TAG, "Testing H264 support... Test file saved at: " + TESTFILE);
try {
File file = new File(TESTFILE);
file.createNewFile();
} catch (IOException e) {
throw new StorageUnavailableException(e.getMessage());
}
// Save flash state & set it to false so that led remains off while testing h264
boolean savedFlashState = mFlashEnabled;
mFlashEnabled = false;
boolean previewStarted = mPreviewStarted;
boolean 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(MediaRecorder.VideoSource.CAMERA);
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mMediaRecorder.setVideoEncoder(mVideoEncoder);
mMediaRecorder.setPreviewDisplay(mSurfaceView.getHolder().getSurface());
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(new MediaRecorder.OnInfoListener() {
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.getMessage());
} catch (RuntimeException e) {
throw new ConfNotSupportedException(e.getMessage());
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
try {
mMediaRecorder.stop();
} catch (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 (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) {
Editor editor = mSettings.edit();
editor.putString(key, config.getProfileLevel() + "," + config.getB64SPS() + "," + config.getB64PPS());
editor.commit();
}
return config;
}
use of net.majorkernelpanic.streaming.mp4.MP4Config in project libstreaming by fyhertz.
the class H264Stream method testMediaCodecAPI.
@SuppressLint("NewApi")
private MP4Config testMediaCodecAPI() throws RuntimeException, IOException {
createCamera();
updateCamera();
try {
if (mQuality.resX >= 640) {
// Using the MediaCodec API with the buffer method for high resolutions is too slow
mMode = MODE_MEDIARECORDER_API;
}
EncoderDebugger debugger = EncoderDebugger.debug(mSettings, mQuality.resX, mQuality.resY);
return new MP4Config(debugger.getB64SPS(), debugger.getB64PPS());
} catch (Exception e) {
// Fallback on the old streaming method using the MediaRecorder API
Log.e(TAG, "Resolution not supported with the MediaCodec API, we fallback on the old streamign method.");
mMode = MODE_MEDIARECORDER_API;
return testH264();
}
}
Aggregations