我正在使用MediaStore.ACTION_VIDEO_CAPTURE
意图捕捉视频,然后使用VideoView
播放。我想知道所拍摄视频的方向。
我不想在意图通话时使用方向,因为用户可能会在按下快门按钮之前旋转设备。我也不想实现自己的自定义视频捕获。
视频的方向是存储在保存的文件中还是/或在意图结果中返回?
答案 0 :(得分:13)
视频的方向是存储在保存的文件中还是/或在意图结果中返回?
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
)并检查返回位图的分辨率。
答案 1 :(得分:4)
类似于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等级17或以上。
答案 2 :(得分:0)
您可以使用MediaMetadataRetriever获取视频的宽度和高度,并在加载前确定方向。