Android,哪个相机与 MediaStore.ACTION_VIDEO_CAPTURE 一起使用? (正面或背面)

Posted

技术标签:

【中文标题】Android,哪个相机与 MediaStore.ACTION_VIDEO_CAPTURE 一起使用? (正面或背面)【英文标题】:Android, Which Camera Was Used With MediaStore.ACTION_VIDEO_CAPTURE ? (Front or Back) 【发布时间】:2014-12-06 23:17:27 【问题描述】:

简单的工作代码:

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(..) 中知道使用了哪个摄像头,正面还是背面?

如何强制新 Intent(MediaStore.ACTION_VIDEO_CAPTURE) 使用前置或后置摄像头?

(这是因为使用前置摄像头时 - 结果视频播放颠倒。)

【问题讨论】:

【参考方案1】:

这有点长,但提供了有用的信息,说明当视频以错误的方向播放时实际出了什么问题。喝上一杯,继续阅读……

原始问题

如何强制新 Intent(MediaStore.ACTION_VIDEO_CAPTURE) 使用前置或后置摄像头?

如其他地方所述,有一种(不可靠的)方法可以要求摄像头或视频活动在前置摄像头或后置摄像头模式下打开。

这种方法除了不可靠之外,并没有什么会阻止用户在相机打开后切换前/后模式,所以它永远不是解决视频倒放问题的好方法。

我如何在 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);
    

(请注意,为了从返回的视频中读取元数据,您需要在请求时提供MediaStore.EXTRA_OUTPUT 字段,正如Camera docs 所建议的那样。)

当我运行这段代码时,我得到以下结果:

后置摄像头,人像,旋转 == 90 前置摄像头,人像,旋转 == 270 后置摄像头,横向,旋转 == 180 前置摄像头,横向,旋转 == 180

当旋转为 270 时,这些视频捕获对于某些玩家来说可能会出现问题,因此您应该选择这些视频以通过后期处理进行修复。

【讨论】:

感谢 x-code,此代码似乎可以工作,我希望它在使用已经准备好的(现有)视频(而不是通过运行时视频捕获活动)时也能工作。 这不适用于现有视频,它总是返回“0”。有什么方法可以知道现有视频的旋转? 这个现有的视频来自哪里?它是什么格式的?播放方向是否错误? 我测试的视频来自智能手机附带的默认相机捕捉“应用程序”。它从我的应用程序中捕捉的方式相同,但在没有应用程序的情况下启动它。所以我认为这是相同的格式。是的,方向错误,使用前置摄像头,视频播放是倒置的,但与通过我的应用程序捕获的视频不同,您发布的代码返回“0”而不是“270”,就像通过应用程序启动 Intent 时一样. 顺便说一句,我不知道为什么这两种情况会有所不同。【参考方案2】:

参见https://***.com/a/11159760/192373 - 它使用未记录的extra 来控制将打开哪个相机。

请注意,根据最终用户选择安装和激活的设备、ROM 和第三方应用程序,不同的应用程序可能会提供 Intent。

对于图像捕获,您有机会在事后发现相机信息,但对于视频则不是。

【讨论】:

谢谢亚历克斯,但我以前见过这个,它在 Galaxy S5 上不起作用,这就是我提出这个新问题的原因:)

以上是关于Android,哪个相机与 MediaStore.ACTION_VIDEO_CAPTURE 一起使用? (正面或背面)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 上使用 MediaStore 将数据从相机保存到磁盘?

Android MediaStore:Images.Media.insertImage 与 ContentResolver.insert

android studio怎么调用相机

Android Camera 调用系统相机应用

如何使用意图设置相机分辨率?

Android 使用系统相机拍照和读取相册照片