android - 纵向模式下的 MediaRecorder 视频捕获

标签 android video orientation mediarecorder

我正在尝试制作自定义视频应用。我仅使用 list 2.2 (API 8) 中的设置。

一切顺利,但我不明白为什么纵向模式视频与横向视频没有区别。

为了检测设备方向改变,我在 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,其中相机设置为适当的 DisplayRotation。

问题是稍后如何确定视频是以横向模式还是纵向模式拍摄的。正如我所获得的,所有视频都是横向拍摄的。它不依赖于仅影响预览过程的 setDisplayOrientation。

同时探索这个问题我注意到,如果使用标准相机应用程序,它会将特殊标签写入视频文件(在 MediaInfo 中看到):Rotation : 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 - 纵向模式下的 MediaRecorder 视频捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11993129/

相关文章:

android - 显示警告对话框但不可见

android - Android 7.1.1 及更高版本中的方向问题

ios - 在 IOS 5 上将应用程序限制为特定方向

android - android中的返回键

android - 无法解析方法 setSupportActionBar(androidx.appcompat.widget.Toolbar)

java - 从数据库获取数据时ArrayIndexOutOfBounds异常问题

c++ - FFMPEG API Mp4 H264 编码/复用 - 未指定的像素格式

c# - 同时解码和显示多个 H264 视频的最快方法 C#

javascript - 如何在 HTML5 播放器中停止下载视频

ios - 如何以编程方式检查方向是否在 iOS 上被锁定 - Swift