大佬教程收集整理的这篇文章主要介绍了android – 开始视频录制时屏幕闪烁并调整大小,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
此外,只要调用recorder.start(),我的相机预览显示就会调整大小.我不明白为什么会这样.它使预览失真(一切看起来都是压扁和更宽).
我的问题:如何在开始视频录制时阻止闪烁/暂停?如何防止recorder.start()调整预览显示的大小?
每当启用“视频模式”时,立即调用initRecording().一旦用户按下按钮,就会调用startRecording().最后,再次按下该按钮时,将调用stopRecording().不太重要的是,当切换回“图片模式”时,会调用destroyRecorder().
@Override public void onResume() { super.onResume(); Camera camera = null; try { camera = Camera.open(); } catch (Exception E) { // Camera isn't available Toast.makeText( getActivity(),"Camera is not available at this time.",Toast.LENGTH_SHORT ).show(); getActivity().finish(); return; } if ( Build.VERSION.SDK_INT >= Build.VERSION_CODEs.GINGERBREAD ) { setCameraDisplayOrientation( camera ); } else { camera.setDisplayOrientation( 90 ); } setCamera( camera ); setCameraZoomDisplay( camera ); if ( getSurfaceHolder() != null ) { startPreview(); if ( getMode() == MODE_VIDEO ) { initRecording(); } } } private void setCameraDisplayOrientation( Camera camera ) { CameraInfo info = new CameraInfo(); Camera.getCameraInfo( 0,info ); int rotation = getActivity().getWindowManager().getDefaultDisplay().getRotation(); int degrees = 0; switch (rotation) { case Surface.ROTATION_0: degrees = 0; break; case Surface.ROTATION_90: degrees = 90; break; case Surface.ROTATION_180: degrees = 180; break; case Surface.ROTATION_270: degrees = 270; break; } int result = ( info.orientation - degrees + 360 ) % 360; camera.setDisplayOrientation( result ); } private void initRecording() { MediaRecorder recorder = new MediaRecorder(); setRecorder( recorder ); Camera camera = getCamera(); camera.unlock(); recorder.setCamera( camera ); recorder.setAudiosource( MediaRecorder.Audiosource.MIC ); recorder.setVideosource( MediaRecorder.Videosource.CAMERa ); CamcorderProfile cp = CamcorderProfile.get( CamcorderProfile.QUALITY_HIGH ); recorder.setProfile( cp ); String extension; switch (cp.fileFormat) { case MediaRecorder.outputFormat.MPEG_4: extension = "mp4"; break; case MediaRecorder.outputFormat.THREE_GPP: extension = "3gp"; break; default: extension = "tmp"; } setVideoMimeType( MimeTypeMap.getSingleton().getMimeTypeFromExtension( extension ) ); File toFile = new File( getActivity().getCacheDir(),"tempvideo.tmp" ); if ( toFile.exists() ) { toFile.delete(); } setTempFile( toFile ); recorder.setOutputFile( toFile.getPath() ); recorder.setPreviewDisplay( getSurfaceHolder().getSurface() ); try { recorder.prepare(); setRecorderInitialized( true ); } catch (IllegalStateException E) { e.printStackTrace(); } catch (IOException E) { e.printStackTrace(); } } private Boolean startRecording() { try { getRecorder().start(); setRecording( true ); ImageView actionImageView = getActionImageView(); actionImageView.setImageresource( R.drawable.record_red ); } catch (Exception E) { getCamera().lock(); } return true; } private void stopRecording() { MediaRecorder recorder = getRecorder(); if ( recorder != null && isRecording() ) { recorder.stop(); setRecording( false ); setRecorderInitialized( false ); try { insertVideo(); } catch (IOException E) { e.printStackTrace(); } initRecording(); ImageView actionImageView = getActionImageView(); actionImageView.setImageresource( R.drawable.record_green ); } } private void destroyRecorder() { MediaRecorder recorder = getRecorder(); recorder.release(); setRecorder( null ); getCamera().lock(); }
Camera.Parameters类是保持流畅视频录制体验的关键.拥有Camera对象后,可以使用Camera.getParameters()获取当前参数来修改它们.然后可以使用Camera.setParameters(Camera.Parameters)来触发已经进行的任何更改.
为防止视频大小调整,我们需要确保参数的预览大小与要录制的视频分辨率一致.要获得支持的视频/预览大小列表,我们可以在当前的Parameters对象上使用Camera.Parameters.getSupportedPreviewSizes(),它将返回Camera.Size对象的列表.这些对象中的每一个都具有width和height属性,可通过Camera.Size.width和Camera.Size.height直接访问(无getter方法). getSupportedPreviewSizes()方法是guaranteed to return at least one result,,似乎结果从最高分辨率到最低分配.
(对于API级别> 11,还有一个getSupportedVideoSizes()方法,但看起来这只是设备的某些视频大小与预览大小不同,否则返回null.我没有成功方法,所以我现在坚持使用PreviewSizes,因为它保证返回适合视频和预览的大小,但是要注意向前发展.)
一旦我们拥有与我们想要的视频分辨率相对应的Camera.Size,我们就可以使用Camera.Parameters.setPreviewSize(width,height)设置该大小.另外,为了帮助消除闪烁,我使用了Camera.Parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTinUOUS_VIDEO).执行这些步骤后,使用Camera.setParameters()通知Camera您的更改.在获取相机后,我已成功设置这些参数,因为在用户与此活动交互时设置参数会导致一些延迟.如果你使用相同的视频和图片捕获活动,你也可以在这里设置图片参数,Camera对象将使用适当的参数为每种模式处理.
几乎完成了!现在预览已经完成,剩下的就是确保MediaRecorder使用与预览相同的分辨率.准备媒体记录器时,在@L_444_0@mediaRecorder.setProfile()(或设置编码器,API级别< 8)和MediaRecorder.setOutputFile()之间,使用相同的方法@L_444_0@mediaRecorder.setVideoSize(width,height)值作为预览.现在,使用MediaRecorder.start()从预览到记录的转换应该是无缝的,因为它们都使用相同的分辨率. 这里有一些快速的代码片段,因此您可以看到所有内容: 获取和设置参数:
Camera.Parameters params = camera.getParameters(); params.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTinUOUS_VIDEO); //myVideoSize is an instance of Camera.Size List<Camera.Size> previewSizes = params.getSupportedPreviewSizes(); myVideoSize = previewSizes.get(0); params.setPreviewSize(myVideoSize.width,myVideoSize.height); camera.setParameters(params);
然后在媒体记录器上设置大小:
//After setTing the profile.... mediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH)); //Use myVideoSize from above mediaRecorder.setVideoSize(myVideoSize.width,myVideoSize.height); //Before setTing the output file mediaRecorder.setOutputFile(myFilE);
以上是大佬教程为你收集整理的android – 开始视频录制时屏幕闪烁并调整大小全部内容,希望文章能够帮你解决android – 开始视频录制时屏幕闪烁并调整大小所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。