我正在使用MediaStore.ACTION_VIDEO_CAPTURE
意图捕获视频,然后使用VideoView
. 我想知道拍摄的视频的方向。
我不想在调用意图时使用方向,因为用户可能会在按下快门按钮之前旋转设备。我也不想实现我自己的自定义视频捕获。
视频的方向是否存储在保存的文件中和/或在意图结果中返回?
我正在使用MediaStore.ACTION_VIDEO_CAPTURE
意图捕获视频,然后使用VideoView
. 我想知道拍摄的视频的方向。
我不想在调用意图时使用方向,因为用户可能会在按下快门按钮之前旋转设备。我也不想实现我自己的自定义视频捕获。
视频的方向是否存储在保存的文件中和/或在意图结果中返回?
视频的方向是否存储在保存的文件中和/或在意图结果中返回?
AOSPVideoCamera
活动确实将相机设备的旋转值提供给该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
)并检查返回位图的分辨率。
类似于 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 或以上。
您可以使用 MediaMetadataRetriever 获取视频的宽度和高度,并在加载之前确定方向。