MediaStore.ACTION_VIDEO_CAPTURE
意图来捕获视频,并稍后使用VideoView
播放。我想知道捕获的视频方向。
我不想使用意图调用时的方向,因为用户可能在按下快门按钮之前旋转设备。我也不想实现自己的自定义视频捕获。
视频的方向是否存储在保存的文件中和/或在意图结果中返回?
MediaStore.ACTION_VIDEO_CAPTURE
意图来捕获视频,并稍后使用VideoView
播放。我想知道捕获的视频方向。
我不想使用意图调用时的方向,因为用户可能在按下快门按钮之前旋转设备。我也不想实现自己的自定义视频捕获。
视频的方向是否存储在保存的文件中和/或在意图结果中返回?
视频的方向信息是否存储在保存的文件中或者通过意图返回结果中?
AOSP的VideoCamera
activity会将相机设备的旋转值传递给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
正在播放横向视频,而当前布局是纵向方向,则视频将被“letterboxed”,并仍以纵向方向播放,使得视频的“上”正确指向屏幕上方,而无需旋转屏幕。 - Jeff Axelrod和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 Level 17 及以上版本中可用。 - Stefan Anca