简单的工作代码:
m_TakeVideoIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
if (m_TakeVideoIntent.resolveActivity(MainActivity.this.getPackageManager()) != null) {
startActivityForResult(m_TakeVideoIntent, REQUEST_VIDEO_CAPTURE);
}
// and when done:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK) {
if (requestCode == REQUEST_VIDEO_CAPTURE) {
// code
} else {
// other code
}
}
}
问题:
我如何知道onActivityResult(..)使用了什么相机,正面还是背面?
OR
如何强制新的Intent(MediaStore.ACTION_VIDEO_CAPTURE)使用前置或后置摄像头?
(这是因为使用前置摄像头时 - 结果视频会颠倒过来。)
答案 0 :(得分:2)
这有点长,但有关于视频以错误方向播放时实际出错的有用信息。喝上一杯好酒,然后阅读...
如何强制新的Intent(MediaStore.ACTION_VIDEO_CAPTURE)使用前置或后置摄像头?
如其他地方所述,有一种(不可靠)方法要求相机或视频活动在前置摄像头或后置摄像头模式下打开。
除了这种方法的不可靠性之外,没有什么可以阻止用户在相机打开后切换前/后模式,因此它不会是解决倒置视频播放问题的好方法。 / p>
我如何知道onActivityResult(..)使用了什么相机,正面还是背面?
我无从知晓。但...
潜在的问题是,对于某些媒体播放器,Android设备捕获的视频可能会以错误的方向播放。这是因为,根据MediaRecorder文档,设置方向提示
...在视频录制过程中不会触发源视频帧旋转,而是在输出视频中添加包含旋转角度的合成矩阵...
不幸的是:
有些视频播放器可能会在播放过程中选择忽略视频中的构图矩阵。
虽然有些媒体播放器忽略了方向提示,但您自己的代码可以读取它。
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK && requestCode == REQUEST_VIDEO_CAPTURE) {
Uri vid = data.getData();
Log.i("xcode", "Video captured: " + data.getData());
MediaMetadataRetriever mmr = new MediaMetadataRetriever();
mmr.setDataSource(this, vid);
String foo = mmr
.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION);
Log.i("xcode", "Video captured: " + data.getData() + " rotation: "
+ foo);
}
}
(请注意,为了从返回的视频中读取元数据,您需要按照Camera docs的建议,在请求时提供MediaStore.EXTRA_OUTPUT
字段。)
当我运行此代码时,我得到以下结果:
当旋转为270时,看起来这些视频捕捉对于某些玩家来说可能会有问题,所以那些是您应该选择通过后期处理来修复的视频。
答案 1 :(得分:1)
请参阅https://stackoverflow.com/a/11159760/192373 - 它使用未记录的额外来控制将打开哪个摄像头。
请注意,意图可能由不同的应用程序提供,具体取决于设备,ROM以及最终用户选择安装和激活的第三方应用程序。
对于图像捕捉,您有机会随后发现相机信息,但视频无法发现。