【问题标题】:How can I ensure correct playback orientation of recorded video?如何确保录制视频的播放方向正确?
【发布时间】:2012-09-09 14:48:39
【问题描述】:

我正在使用MediaStore.ACTION_VIDEO_CAPTURE 意图捕获视频,然后使用VideoView 播放它。我想知道拍摄的视频的方向。

我不想在调用意图时使用方向,因为用户可能会在按下快门按钮之前旋转设备。我也不想实现我自己的自定义视频捕获。

视频的方向是否存储在保存的文件中和/或在意图结果中返回?

【问题讨论】:

  • 您不能比较视频的高度和宽度并自己决定方向吗?我认为大多数相机只记录一个方向(风景)。
  • 相机怎么可能阻止用户旋转设备?我希望至少捕获意图会记下哪个方向是向上的,并将其存储在视频文件的元数据中。纵向视频肯定有很多用例(前置手机摄像头就是一个很好的例子)。

标签: android video orientation video-capture android-video-player


【解决方案1】:

视频的方向是否存储在保存的文件中和/或在意图结果中返回?

AOSP VideoCamera 活动确实将相机设备的旋转值提供给 MediaRecorder.setOrientationHint() 方法。以下是与此相关的VideoCamera.initializeRecorder()代码中的代码摘录:

    // See android.hardware.Camera.Parameters.setRotation for
    // documentation.
    // Note that mOrientation here is the device orientation, which is 
    // the opposite of what getWindowManager().getDefaultDisplay().getRotation() 
    // would return, which is the orientation the graphics need to rotate 
    // in order to render correctly.
    int rotation = 0;
    if (mOrientation != OrientationEventListener.ORIENTATION_UNKNOWN) {
        CameraInfo info = CameraHolder.instance().getCameraInfo()[mCameraId];
        if (info.facing == CameraInfo.CAMERA_FACING_FRONT) {
            rotation = (info.orientation - mOrientation + 360) % 360;
        } else {  // back-facing camera
            rotation = (info.orientation + mOrientation) % 360;
        }
    }
    mMediaRecorder.setOrientationHint(rotation);

这是setOrientationHint() 的文档,解释了信息的存储:

设置输出视频播放的方向提示。这种方法 应该在 prepare() 之前调用。此方法不会触发 视频录制过程中要旋转的源视频帧,但要添加一个 包含输出视频中旋转角度的合成矩阵 如果输出格式是 OutputFormat.THREE_GPP 或 OutputFormat.MPEG_4 以便视频播放器可以选择正确的播放方向。 请注意,某些视频播放器可能会选择忽略合成 播放期间视频中的矩阵。

由于您使用框架的VideoView 小部件播放视频,它应该已经正确处理了合成矩阵中的信息,您只需要比较视频的宽度和高度来决定是否设置横向或纵向播放活动。一种简单的方法是调用ThumbnailUtils.createVideoThumbnail()(内部使用MediaMetaDataRetriever)并检查返回位图的分辨率。

【讨论】:

  • 我很惊讶VideoView 不会默认按照当前布局的方向播放视频。即,如果VideoView 正在播放横向视频,而当前布局为纵向,则视频将被“信箱”并仍以纵向播放,这样视频“向上”正确指向上方而不旋转屏幕。
  • 我正在使用相同的方法,但是如何获取 mOrientation 值,因为我正在获取相同的 info.oreintation 值。仅供参考,我正在横向固定方向捕获视频
【解决方案2】:

类似于 al.在他的回答中建议,我使用MediaMetadataRetriever,但使用METADATA_KEY_VIDEO_ROTATION 键:

MediaMetadataRetriever mediaMetadataRetriever = new MediaMetadataRetriever();
mediaMetadataRetriever.setDataSource( absoluteVideoFilePath );
String orientation = mediaMetadataRetriever.extractMetadata(
         MediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION );

我检查了使用前置摄像头的所有 4 个不同方向捕获的视频,元数据总是不同的。 注意:METADATA_KEY_VIDEO_ROTATION 需要 API Level 17 或以上。

【讨论】:

  • 是的,你必须小心这个,因为 METADATA_KEY_VIDEO_ROTATION 密钥从 API 级别 17 起才可用。
【解决方案3】:

您可以使用 MediaMetadataRetriever 获取视频的宽度和高度,并在加载之前确定方向。

【讨论】:

  • 您是否有证据表明这些在使用不同方向录制时会被交换?
  • 不,我没有证据。我可以告诉你,即使在 android 框架(例如导航栏)中,屏幕宽度也会与高度进行比较以获得方向。你有什么理由不能自己测试吗?应该比较快。
  • 是的,没有其他答案,我会检查一下。我确实发现 ffmpeg 可以检查方向标志——尽管如果它有效的话,这肯定是一个比你的答案更重的答案。
  • 对于现在阅读本文的任何人,宽度和高度都不会交换。它似乎总是一个横向视频。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-18
  • 2014-02-19
  • 1970-01-01
  • 2014-04-27
相关资源
最近更新 更多