如何在 `MediaStore.ACTION_VIDEO_CAPTURE` 中将编解码器设置为 H.264? ( Android )

How to set codec to H.264 in `MediaStore.ACTION_VIDEO_CAPTURE` ? ( Android )

我想录制视频并发送到服务器。必须是H.264mp4,所以服务器不用转换,可以在网页上显示。

这是我目前创建 Intent 的方式:

Intent takeVideoIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
if (takeVideoIntent.resolveActivity(getPackageManager()) != null) {
    startActivityForResult(takeVideoIntent, REQUEST_VIDEO_CAPTURE);
}

有效,但我不知道如何将编解码器设置为 H.264,或者如何检测默认编解码器。我能够找到 的解决方案,但我想避免使用它,因为这对我的需求来说太复杂了,而且我不想为此构建一个录像机 gui。 MediaStore.ACTION_VIDEO_CAPTURE 将是完美的,因为用户可以 record/replay 视频,取消或重试录制,而无需从我的站点进行任何额外编程(和可能的错误),我只是在 onActivityResult.

不幸的是,似乎没有办法指定要使用的编解码器。从https://developer.android.com/reference/android/provider/MediaStore#ACTION_VIDEO_CAPTURE中可以看出,支持的EXTRAs与输出Uri、持续时间和大小限制以及简单的质量值(0低质量,1高质量)有关。

这是故意的;发送 Intent 将导致启动一个未知的(在编译时)应用程序,它可能支持也可能不支持所需的所有功能。另外,由于涉及到外部应用程序,因此需要建立的参数值范围越少,实现起来就越容易。

正如您已经意识到的那样,在 Android 中通常可以通过两种方式执行操作:一种是“简单”的,在这种情况下要求默认相机应用程序制作视频,通常是通过 Intent ,以及一个“强大”的,通常是通过 API,在本例中是 MediaRecorder API.

只怕简单的方法不能成功,就得走困难的路;通常可以在网上轻松找到一些样板代码。

尽管如此,对于您的具体情况,我会让外部应用程序完成捕获视频文件的繁重工作,然后检查 H.264 是否是已使用的编解码器(很可能是, 恕我直言)。如果没有,您可以解决这个问题:根据您的用例,询问用户(如果 he/she 足够了解)尝试更改录制应用程序中的设置,或者您可以通过以下方式在您的应用程序中实现某种形式的视频转码third-party 个图书馆。

如果您的用例非常具体以至于您总是知道将使用哪个相机应用程序(即您是设备的制造商,或者您的用例只允许一种特定型号和自定义 android硬件版本),并且您碰巧知道您的相机应用程序确实支持通过一些自定义 EXTRA 值指定视频编解码器,您也可以尝试将其传递到 Intent 数据中。 las,恐怕这不适用于通用智能手机目标(即您不知道会处理您的意图的相机应用程序)。