因此,在我的应用程序中,我能够使用GPUImage库向来自Camera的视频显示效果(如模糊滤镜,高斯).
基本上,我(库)将来自摄像机的输入,获得真实的原始字节的数据,将其转换为从YUV格式RGBA格式,然后应用上的影响到该图像和显示器Surface的GLSurfaceView使用OpenGL.最后,对于用户来说,它看起来像是应用了效果的视频.
现在我想Surface使用MediaCodec API 将视频帧记录下来.
但是这个讨论说我们无法将预定义传递Surface给MediaCodec.
我在bigflake看到了一些他正在Surface使用的样品,MediaCodec.createInputSurface()但对我来说,Surface来自于GLSurfaceView.
那么,我如何录制Surface视频的帧?
我将并行录制音频,使用FFMPEG合并该视频和音频,并作为应用效果的视频呈现给用户.
我正在尝试MediaRecorder不使用Camera实例而是使用Surface视频源进行录制(是的,这是可能的,但事实证明它并不完美)-mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
我只写什么问题:
下一个代码仅适用于某些设备,并在最近的设备重新启动后在某些设备上临时工作或根本不起作用
如果它不起作用 okMediaRecorder.stop()方法失败并出现下一个错误
E/MediaRecorder:停止失败:-1007 W/System.err:
java.lang.RuntimeException:停止失败。在
android.media.MediaRecorder.stop(本机方法)
录音机 mp4 文件太小(千字节),无法播放
测试设备:
适用于联想 P2、小米 A1
不适用于小米红米 5、索尼 Xperia、小米红米 4 Prime
您也可以阅读我的代码中的注释以更好地理解问题
new Thread(() -> {
MediaRecorder mediaRecorder = new MediaRecorder();
File file = new File(Environment.getExternalStorageDirectory()
+ File.separator + "test_media_recorder_surface_source.mp4");
if (file.exists()) {
file.delete();
}
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mediaRecorder.setOutputFile(file.getAbsolutePath());
mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
mediaRecorder.setVideoSize(1280, 720);
mediaRecorder.setCaptureRate(24);
try {
mediaRecorder.prepare();
int sleepTime = 1000 / 24;
Surface surface = mediaRecorder.getSurface();
mediaRecorder.start();
// record something (we can …Run Code Online (Sandbox Code Playgroud) android surface android-canvas mediarecorder android-mediarecorder