android – 以纵向模式捕获MediaRecorder视频

我正在尝试制作自定义视频应用.我只使用清单2.2中的设置(API 8).

一切顺利,但我不明白为什么肖像模式视频与lanscape视频没有区别.

为了检测设备改变方向,我在surfaceChanged()中使用此代码

if (mCamera != null) {

        Camera.Parameters p = mCamera.getParameters();

        try {
            mCamera.stopPreview();
        } catch (Exception e) {
            // Todo: handle exception
        }

        int previewWidth = 0;
        int previewHeight = 0;

        if (mPreviewSize != null) {
            display display = ((WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE)).getDefaultdisplay();
            int rotation = display.getRotation();

            switch (rotation) {
            case Surface.ROTATION_0:
                previewWidth = mPreviewSize.height;
                previewHeight = mPreviewSize.width;
                mCamera.setdisplayOrientation(90);
                break;

            case Surface.ROTATION_90:
                previewWidth = mPreviewSize.width;
                previewHeight = mPreviewSize.height;
                mCamera.setdisplayOrientation(0);
                break;

            case Surface.ROTATION_180:
                previewWidth = mPreviewSize.height;
                previewHeight = mPreviewSize.width;
                mCamera.setdisplayOrientation(270);
                break;

            case Surface.ROTATION_270:
                previewWidth = mPreviewSize.width;
                previewHeight = mPreviewSize.height;
                mCamera.setdisplayOrientation(180);
                break;
            }

            p.setPreviewSize(previewWidth,previewHeight);
            mCamera.setParameters(p);
        }
    try {
        mCamera.setPreviewdisplay(mHolder);
        mCamera.startPreview();
    } catch (Exception e) {
        Log.d(TAG,"Cannot start preview.",e);
    }
}

奇迹般有效.如果我旋转设备表面更改方向,请调用surfaceChanged,其中camera设置为适当的displayRotation.

问题是如何在以后以景观模式或纵向模式捕获视频时如何确定.因为我得到的所有视频都是横向拍摄的.它不依赖于setdisplayOrientation,它只影响预览过程.

同时探索这个问题我注意到如果要使用标准相机应用程序,它会将特殊标签写入视频文件(在MediaInfo中看到):旋转:90为肖像拍摄的视频.

但是MediaRecorder类没有.

似乎这就是问题所在.有人要解决这个问题吗?

解决方法

找到了 !
实际上,你可以改变预览,你可以标记视频,但没有办法真正改变视频…(可能是速度问题或其他)
camera.setdisplayOrientation(90);

要旋转预览,那么

recorder.setorientationHint(90);

要将视频标记为旋转90°,手机会在阅读时自动旋转.

所以你要做的就是

camera = Camera.open();
        //Set preview with a 90° ortientation
        camera.setdisplayOrientation(90);
        camera.unlock();

        holder = getHolder();
        holder.addCallback(this);
        holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

        recorder = new MediaRecorder();
        recorder.setCamera(camera);
        recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
        recorder.setoutputFormat(MediaRecorder.OutputFormat.MPEG_4);
        recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
        recorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
        recorder.setoutputFile(getVideoFolder()+rnd.nextString()+".mp4");
        recorder.setPreviewdisplay(holder.getSurface());
        //Tags the video with a 90° angle in order to tell the phone how to display it
        recorder.setorientationHint(90);

        if (recorder != null) {
            try {
                recorder.prepare();
            } catch (IllegalStateException e) {
                Log.e("IllegalStateException",e.toString());
            } catch (IOException e) {
                Log.e("IOException",e.toString());
            }
        }

        recorder.start();

希望能帮助到你

相关文章

Android 通过adb shell命令查看内存,CPU,启动时间,电量等...
Monkey Android app稳定性测试工具之Monkey使用教程 by:授客...
Android 常见adb命令 by:授客 QQ:1033553122 1、 查看所有已...
这篇“android轻量级无侵入式管理数据库自动升级组件怎么实现...
今天小编给大家分享一下Android实现自定义圆形进度条的常用方...
这篇文章主要讲解了“Android如何解决字符对齐问题”,文中的...