我正在工作的应用程序,捕捉4K视频只有使用camera2 API -没有预览面显示,没有音频记录。
我使用LG G5运行Android7.0.0。当被查询时,该设备报告camera2 API的完全实现。本机摄像头应用程序在4K中记录得很好。媒体记录仪报告的决议证实了4K的存在:
初始化MediaRecorder的代码如下所示。我使用setProfile进行此操作,因为我无法设置配置文件而不使程序抛出异常,因为我没有设置任何音频记录设置(因为我不想或不想记录音频):
vidRecorder = new MediaRecorder();
vidRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
vidRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
vidRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
vidRecorder.setVideoFrameRate(30);
vidRecorder.setCaptureRate(30);
vidRecorder.setVideoEncodingBitRate(35000000);
vidRecorder.setVideoSize(3840, 2160);
vidRecorder.setOutputFile(videoFilename);
vidRecorder.prepare();
上面的日志中没有显示任何问题。输出格式和编码器匹配的VLC报告的4K视频文件产生的手机本机应用程序。
上面的所有操作都很好,除了产生的视频文件总是1920x1080p!我不知道为什么会发生这种事。提前感谢您的帮助。
发布于 2021-12-16 13:25:43
您必须启用OpenGL es3.0或更高版本。然后,使用自定义类(而不是使用SurfaceView或GLES10 )重写GLSurfaceView作为Camera2 API预览。
理想情况下,您可以使用GLES32,因为它支持8K。
这个Camera2Video示例使用AutoFitTextureView:
您可能希望使用GLSurfaceView:
r2.1/core/java/android/view/Surface.java
这很乏味,但并不难。您只需将GLES10或GLES20替换为GLES30或理想的GLES32。
编辑:
我认为Android会自动使用最大的OpenGL ES版本,这就是为什么MediaPlayer可以在OpenGLES 3.0上播放4K视频,但它显示了OpenGL ES 2.0的黑色图像。
如果你的相机应用程序没有捕捉到4K,试着在MediaPlayer上播放4K视频,看看会发生什么:
否则,您必须在updateTexImage API中找到来自SurfaceTexture的Camera2 ()的用法,并使用GLES30。目前还不清楚在哪里使用OpenGL ES,但它在SurfaceTexture.java中有明确的引用
Camera2 ImageCapture似乎完全绕过了Surface。虽然我可能弄错了。
至于MediaPlayer不能播放4K视频的问题,LG G5可能只支持OpenGL ES2.0。
4K需求
编辑
这个答案讨论了如何使用SurfaceView修改OpenGL。
https://stackoverflow.com/questions/48716035
复制相似问题