Advertisement
Guest User

Untitled

a guest
Jul 28th, 2017
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.71 KB | None | 0 0
  1. import java.io.File;
  2. import java.io.IOException;
  3. import java.lang.reflect.InvocationTargetException;
  4. import java.lang.reflect.Method;
  5.  
  6. import android.app.Activity;
  7. import android.hardware.Camera;
  8. import android.media.MediaRecorder;
  9. import android.os.Bundle;
  10. import android.os.Environment;
  11. import android.util.Log;
  12. import android.view.Menu;
  13. import android.view.MenuItem;
  14. import android.view.Surface;
  15. import android.view.SurfaceHolder;
  16. import android.view.SurfaceView;
  17. import android.view.Window;
  18.  
  19. /**
  20. * @author SANA HASSAN
  21. */
  22. public class CameraSurfaceView extends Activity {
  23.  
  24. private Preview mPreview;
  25. private MediaRecorder mrec = new MediaRecorder();
  26. private int cameraId = 0;
  27. private Camera mCamera;
  28.  
  29.  
  30. @Override
  31. protected void onCreate(Bundle savedInstanceState) {
  32. super.onCreate(savedInstanceState);
  33.  
  34. requestWindowFeature(Window.FEATURE_NO_TITLE);
  35.  
  36. mPreview = new Preview(this);
  37. setContentView(mPreview);
  38. }
  39.  
  40. @Override
  41. public boolean onCreateOptionsMenu(Menu menu) {
  42. menu.add(0, 0, 0, "Start");
  43. menu.add(0, 1, 0, "Stop");
  44. return super.onCreateOptionsMenu(menu);
  45. }
  46.  
  47. @Override
  48. public boolean onOptionsItemSelected(MenuItem item) {
  49. switch (item.getItemId()) {
  50. case 0:
  51. try {
  52. startRecording();
  53. }
  54. catch (Exception e) {
  55. e.printStackTrace();
  56. mrec.release();
  57. }
  58. break;
  59.  
  60. case 1:
  61. mrec.stop();
  62. mrec.release();
  63. mrec = null;
  64. break;
  65.  
  66. default:
  67. break;
  68. }
  69. return super.onOptionsItemSelected(item);
  70. }
  71.  
  72. protected void startRecording() throws IOException {
  73.  
  74. mrec = new MediaRecorder();
  75. mrec.setCamera(mCamera);
  76. mCamera.unlock();
  77. File directory = new File(Environment.getExternalStorageDirectory()+"/NICUVideos");
  78. directory.mkdirs();
  79. mrec.setAudioSource( MediaRecorder.AudioSource.MIC);
  80. mrec.setVideoSource(MediaRecorder.VideoSource.CAMERA);
  81. mrec.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
  82. mrec.setOutputFile(Environment.getExternalStorageDirectory()+"/NICUVideos/"+System.currentTimeMillis()+".mp4");
  83. mrec.setPreviewDisplay(mPreview.getHolder().getSurface());
  84. mrec.setVideoSize(640, 480);
  85.  
  86. Method[] methods = mrec.getClass().getMethods();
  87. for (Method method: methods){
  88. try{
  89. if(method.getName().equals("setAudioEncodingBitRate")){
  90. method.invoke(mrec, 12200);
  91. }
  92. else if(method.getName().equals("setVideoEncodingBitRate")){
  93. method.invoke(mrec, 800000);
  94. }
  95. else if(method.getName().equals("setAudioSamplingRate")){
  96. method.invoke(mrec, 8000);
  97. }
  98. else if(method.getName().equals("setVideoFrameRate")){
  99. method.invoke(mrec, 20);
  100. }
  101. }
  102. catch (IllegalArgumentException e) {
  103. e.printStackTrace();
  104. }
  105. catch (IllegalAccessException e) {
  106. e.printStackTrace();
  107. }
  108. catch (InvocationTargetException e) {
  109. e.printStackTrace();
  110. }
  111. }
  112. mrec.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
  113. mrec.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
  114. mrec.setMaxDuration(60000); // 60 seconds
  115. mrec.setMaxFileSize(10000000); // Approximately 10 megabytes
  116. mrec.prepare();
  117. mrec.start();
  118. }
  119.  
  120. protected void stopRecording() {
  121. mrec.stop();
  122. mrec.release();
  123. mCamera.release();
  124. }
  125.  
  126. class Preview extends SurfaceView implements SurfaceHolder.Callback {
  127. SurfaceHolder mHolder;
  128. Activity activity;
  129.  
  130. Preview(Activity activity) {
  131. super(activity);
  132. mHolder = getHolder();
  133. mHolder.addCallback(this);
  134. mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
  135. }
  136.  
  137. public void surfaceCreated(SurfaceHolder holder) {
  138.  
  139. Camera.CameraInfo info=new Camera.CameraInfo();
  140. for (int i=0; i < Camera.getNumberOfCameras(); i++) {
  141. Camera.getCameraInfo(i, info);
  142. if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
  143. mCamera=Camera.open(i);
  144. cameraId = i;
  145. }
  146. }
  147.  
  148. try {
  149. mCamera.setPreviewDisplay(holder);
  150. } catch (IOException exception) {
  151. mCamera.release();
  152. mCamera = null;
  153. }
  154. }
  155.  
  156. public void surfaceDestroyed(SurfaceHolder holder) {
  157. mCamera.stopPreview();
  158. mCamera.release();
  159. mCamera = null;
  160. }
  161.  
  162. public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
  163. setCameraDisplayOrientation(mCamera);
  164. mCamera.startPreview();
  165. }
  166.  
  167. public void setCameraDisplayOrientation(Camera camera) {
  168. Camera.CameraInfo info = new Camera.CameraInfo();
  169. Camera.getCameraInfo(cameraId, info);
  170.  
  171. int rotation = CameraSurfaceView.this.getWindowManager().getDefaultDisplay().getRotation();
  172. int degrees = 0;
  173. switch (rotation) {
  174. case Surface.ROTATION_0: degrees = 0; break;
  175. case Surface.ROTATION_90: degrees = 90; break;
  176. case Surface.ROTATION_180: degrees = 180; break;
  177. case Surface.ROTATION_270: degrees = 270; break;
  178. }
  179.  
  180. int result;
  181. if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
  182. result = (info.orientation + degrees) % 360;
  183. result = (360 - result) % 360; // compensate the mirror
  184. } else { // back-facing
  185. result = (info.orientation - degrees + 360) % 360;
  186. }
  187. Log.d(Vars.TAG, "Result = "+result);
  188. camera.setDisplayOrientation(result);
  189. }
  190. }
  191.  
  192. }
  193.  
  194. setOrientationHint(degrees);
  195.  
  196. 0 for landscape
  197. 90 for portrait
  198. 180 & 270 don't work very well and give weird results.
  199.  
  200. /**
  201. *
  202. * @param mMediaRecorder
  203. * @return
  204. */
  205. public static MediaRecorder rotateBackVideo(MediaRecorder mMediaRecorder) {
  206. /**
  207. * Define Orientation of video in here,
  208. * if in portrait mode, use value = 90,
  209. * if in landscape mode, use value = 0
  210. */
  211. switch (CustomCamera.current_orientation) {
  212. case 0:
  213. mMediaRecorder.setOrientationHint(90);
  214. break;
  215. case 90:
  216. mMediaRecorder.setOrientationHint(180);
  217. break;
  218. case 180:
  219. mMediaRecorder.setOrientationHint(270);
  220. break;
  221. case 270:
  222. mMediaRecorder.setOrientationHint(0);
  223. break;
  224. }
  225.  
  226. return mMediaRecorder;
  227. }
  228.  
  229. // Step 5: Set the preview output
  230. /**
  231. * Define Orientation of image in here,
  232. * if in portrait mode, use value = 90,
  233. * if in landscape mode, use value = 0
  234. */
  235. CustomCamera.mMediaRecorder = Utils.rotateBackVideo(CustomCamera.mMediaRecorder);
  236. CustomCamera.mMediaRecorder.setPreviewDisplay(mCameraPreview.getHolder().getSurface());
  237.  
  238. Display display = ((WindowManager)getContext().getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
  239. parameters.setPreviewSize(height, width);
  240. if(display.getRotation() == Surface.ROTATION_0)
  241. {
  242.  
  243. mCamera.setDisplayOrientation(90);
  244. mMediaRecorder.setOrientationHint(270);
  245. }
  246.  
  247. if(display.getRotation() == Surface.ROTATION_90)
  248. {
  249. mMediaRecorder.setOrientationHint(180);
  250. }
  251.  
  252. if(display.getRotation() == Surface.ROTATION_180)
  253. {
  254. mMediaRecorder.setOrientationHint(270);
  255. }
  256.  
  257. if(display.getRotation() == Surface.ROTATION_270)
  258. {
  259. mCamera.setDisplayOrientation(180);
  260. mMediaRecorder.setOrientationHint(0);
  261. }
  262.  
  263. private OrientationEventListener orientationEventListener;
  264.  
  265. @Override
  266. public void onCreate(Bundle savedInstanceState) {
  267. super.onCreate(savedInstanceState);
  268. //...
  269. orientationEventListener = new OrientationEventListener(this) {
  270. @Override
  271. public void onOrientationChanged(int orientation) {
  272. if (orientation == ORIENTATION_UNKNOWN) return;
  273.  
  274. flashButton.setRotation(-(orientation));
  275. cameraButton.setRotation(-(orientation));
  276.  
  277. if (camera != null) {
  278. Parameters parameters = camera.getParameters();
  279. CameraInfo info = new CameraInfo();
  280. Camera.getCameraInfo(selectedCamera, info);
  281. orientation = (orientation + 45) / 90 * 90;
  282. int rotation = 0;
  283. if (info.facing == CameraInfo.CAMERA_FACING_FRONT) {
  284. rotation = (info.orientation - orientation + 360) % 360;
  285. } else { // back-facing camera
  286. rotation = (info.orientation + orientation) % 360;
  287. }
  288. parameters.setRotation(rotation);
  289. if (!isRecording) {
  290. mediaRecorder.setOrientationHint(rotation);
  291. }
  292.  
  293. camera.setParameters(parameters);
  294. }
  295. }
  296. };
  297. }
  298.  
  299.  
  300. @Override
  301. protected void onResume() {
  302. super.onResume();
  303. //...
  304. orientationEventListener.enable();
  305. }
  306.  
  307. @Override
  308. protected void onPause() {
  309. super.onPause();
  310. orientationEventListener.disable();
  311. //...
  312. }
  313.  
  314. <activity android:name=".activities.CameraActivity"
  315. android:screenOrientation="portrait">
  316.  
  317. public static int getVideoOrientationAngle(Activity activity, int cameraId) { //The param cameraId is the number of the camera.
  318. int angle;
  319. Display display = activity.getWindowManager().getDefaultDisplay();
  320. int degrees = display.getRotation();
  321. android.hardware.Camera.CameraInfo info =
  322. new android.hardware.Camera.CameraInfo();
  323. android.hardware.Camera.getCameraInfo(cameraId, info);
  324. switch (degrees) {
  325. case Surface.ROTATION_0:
  326. angle = 90;
  327. break;
  328. case Surface.ROTATION_90:
  329. angle = 0;
  330. break;
  331. case Surface.ROTATION_180:
  332. angle = 270;
  333. break;
  334. case Surface.ROTATION_270:
  335. angle = 180;
  336. break;
  337. default:
  338. angle = 90;
  339. break;
  340. }
  341. if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT)
  342. angle = (angle + 180) % 360;
  343.  
  344. return angle;
  345. }
  346.  
  347. public static int setCameraDisplayOrientation(Activity activity,
  348. int cameraId, android.hardware.Camera camera) {
  349. android.hardware.Camera.CameraInfo info =
  350. new android.hardware.Camera.CameraInfo();
  351. android.hardware.Camera.getCameraInfo(cameraId, info);
  352. int rotation = activity.getWindowManager().getDefaultDisplay()
  353. .getRotation();
  354. int degrees = 0;
  355. switch (rotation) {
  356. case Surface.ROTATION_0:
  357. degrees = 0;
  358. break;
  359. case Surface.ROTATION_90:
  360. degrees = 90;
  361. break;
  362. case Surface.ROTATION_180:
  363. degrees = 180;
  364. break;
  365. case Surface.ROTATION_270:
  366. degrees = 270;
  367. break;
  368. }
  369.  
  370. int result;
  371. if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
  372. result = (info.orientation + degrees) % 360;
  373. result = (360 - result) % 360; // compensate the mirror
  374. } else { // back-facing
  375. result = (info.orientation - degrees + 360) % 360;
  376. }
  377. camera.setDisplayOrientation(result);
  378. return result;
  379. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement