• 录像视频被拉伸


    1.预览照片被拉伸

    通常,拍照预览页面的照片拉伸主要与下面两个因素有关  
                1.     Surfaceview的大小
               2.  Camera中的Preview的大小
    如果surfaceview尺寸比例跟预览尺寸比例相同,那便不会产生变形,

    那么问题就来了,怎么样才能够达到适配多台手机,界面不产生拉伸变形,而且程序又不崩溃?

    思路如下:
    1.     先将获取手机支持预览的尺寸列表通过方法parmeters.getSupportedPreviewSizes()来得到返回类型为List<Size>的值,
    2.     先进行屏幕方向的一个判断,因为预览列表里面的尺寸都是w>h(即横屏),如果屏幕是竖屏则需要先将宽高进行调换,这样方便接下来的比较。
    3.     先用for循环将预览尺寸列表每个元素宽高与surfaceview的宽高进行比较,如果存在宽高尺寸都与surfaceview宽高尺寸相同的size则将该宽高设置为预览尺寸。4.     如果步骤2找不到相同尺寸就得进行该步骤,将尺寸列表的宽高比例和surfaceview的比例作比较,找到一个相同或相近的。(一般来说,只要surfaceview的尺寸和屏幕尺寸相同,就可以找到相同的比例)然后将该尺寸的size设置为预览尺寸。

    1. /** 
    2. * 通过对比得到与宽高比最接近的尺寸(如果有相同尺寸,优先选择) 
    3. * @param surfaceWidth 
    4. * 需要被进行对比的原宽,surface view的宽度 
    5. * @param surfaceHeight 
    6. * 需要被进行对比的原高 surface view的高度 
    7. * @param preSizeList 得到的支持预览尺寸的list,parmeters.getSupportedPreviewSizes() 
    8. * 需要对比的预览尺寸列表 
    9. * @return 得到与原宽高比例最接近的尺寸 
    10. */  
    1. protected Camera.Size getCloselyPreSize(int surfaceWidth, int surfaceHeight,  
    2.   
    3. List<Size> preSizeList) {  
    4. int ReqTmpWidth;  
    5. int ReqTmpHeight;  
    6. // 当屏幕为垂直的时候需要把宽高值进行调换,保证宽大于高  
    7. if (mIsPortrait) {  
    8. ReqTmpWidth = surfaceHeight;  
    9. ReqTmpHeight = surfaceWidth;  
    10. else {  
    11. ReqTmpWidth = surfaceWidth;  
    12. ReqTmpHeight = surfaceHeight;  
    13. }  
    14. //先查找preview中是否存在与surfaceview相同宽高的尺寸  
    15. for(Camera.Size size : preSizeList){  
    16. if((size.width == ReqTmpWidth) && (size.height == ReqTmpHeight)){  
    17. return size;  
    18. }  
    19. }  
    20. // 得到与传入的宽高比最接近的size  
    21. float reqRatio = ((float) ReqTmpWidth) / ReqTmpHeight;  
    22. float curRatio, deltaRatio;  
    23. float deltaRatioMin = Float.MAX_VALUE;  
    24. Camera.Size retSize = null;  
    25. for (Camera.Size size : preSizeList) {  
    26. curRatio = ((float) size.width) / size.height;  
    27. deltaRatio = Math.abs(reqRatio - curRatio);  
    28. if (deltaRatio < deltaRatioMin) {  
    29. deltaRatioMin = deltaRatio;  
    30. retSize = size;  
    31. }  
    32. }  
    33. return retSize;  
    34. }  
      /**
         * 初始化SurfaceView宽高比
    * mWidth 视频录制宽度 mHeight 视频录制高度 ,让SurfaceView的宽高比跟录制视频的宽高比一直,防止视频被拉伸
    */ private void initSurfaceView() { final int w = DeviceUtils.getDisplayWidth(); int width = w; int height = (int) (w * ((mWidth*1.0f)/mHeight)); // LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) mSurfaceView .getLayoutParams(); lp.width = width; lp.height = height; mSurfaceView.setLayoutParams(lp); }

    2.MediaRecorder录制视频太短崩的问题

    只解决了部分手机,有些手机还是不行

    1.Activity实现implements   Android.media.MediaRecorder.OnErrorListener这个接口

    2.开始录制视频时

    1. if (mMediaRecorder == null) {  
    2.                    mMediaRecorder = new MediaRecorder();  
    3.                    mMediaRecorder.setOnErrorListener(this);  
    4.                } else {  
    5.                    mMediaRecorder.reset();  
    6.                }  
    3.停止视频时 
    1. mMediaRecorder.setOnErrorListener(null);  
    2.               mMediaRecorder.setPreviewDisplay(null);  
    3.                 mMediaRecorder.stop();  
    在CODE上查看代码片派生到我的代码片
    1. public void onError(MediaRecorder mr, int what, int extra) {  
    2. // TODO Auto-generated method stub  
    3. try {  
    4.             if (mr != null)  
    5.                 mr.reset();  
    6.         } catch  (Exception e) {  
    7.         }  
    8. }  
     
  • 相关阅读:
    Windows Server 2008上安装 Windows SharePoint Services 3.0
    自定义Unity 容器的扩展 Unity Application Block Event Broker
    .NET Migration工具
    ASP.NET 应用程序的扩展策略[MSDN 杂志]
    命令行解析的规则以及Command Line Parser Library
    Visual Studio 2008 SP1和.NET FX 3.5 SP1发布了
    Entity Framework samples For RTM
    PowerShell的开源实现
    Enterprise Library 4.0缓存应用程序块
    Microsoft SQL Server Community & Samples
  • 原文地址:https://www.cnblogs.com/ldq2016/p/6290931.html
Copyright © 2020-2023  润新知