Android上的死锁';在视频录制过程中使用PreviewCallback时s MediaRecorder
在一些问题之后,我终于使用MediaRecorder在我的应用程序中实现了视频录制 我现在想做的是在录制过程中处理尽可能多的预览帧。也就是说,我想抓取一个预览帧,处理它,并在处理这个帧时忽略任何预览帧。一旦完成处理,我想继续下一个 为此,我尝试了两种不同的方法:Android上的死锁';在视频录制过程中使用PreviewCallback时s MediaRecorder,android,multithreading,camera,mediarecorder,Android,Multithreading,Camera,Mediarecorder,在一些问题之后,我终于使用MediaRecorder在我的应用程序中实现了视频录制 我现在想做的是在录制过程中处理尽可能多的预览帧。也就是说,我想抓取一个预览帧,处理它,并在处理这个帧时忽略任何预览帧。一旦完成处理,我想继续下一个 为此,我尝试了两种不同的方法: 通过Camera.addCallbackBuffer()添加两个缓冲区,并让一个线程处理其中一个缓冲区,而PreviewCallback会在收到帧时立即重新添加当前“未使用”的缓冲区 使用setOneShotPreviewCallbac
mr.stop();
cam.setPreviewCallback(null);
...
回调方法就是这样做的:
(do something with the data buffer)
cam.setOneShotPreviewCallback(this);
在大多数情况下,我的代码都会被卡住
mr.stop();
但有时也在
cam.setOneShotPreviewCallback(this);
在回调函数内部
非常感谢您的建议 处理一个帧需要足够长的时间来证明a)在AsyncTask中运行它,b)将预览帧复制到另一个字节[]
setOneShotPreviewCallback()似乎是一个不错的选择,但是将像素复制到预先分配的数组中,并尽快从onPreviewFrame()返回 谢谢你的回答!我试过了。在onPreviewFrame方法中复制缓冲区并启动处理复制数据的新线程。还是一样的行为。啊,好吧!我想我已经摆脱了“僵局”的问题。我现在正在从UI线程调用stop()先生,看起来这不会再锁定了。但有一件事仍然是个问题:帧率下降。我可以在预览显示和生成的视频中看到它(甚至更糟!)。为什么会这样?我的测试设备(SGSII)是否需要做太多的工作?我在线程中调用PreviewCallback的唯一一件事就是复制缓冲区并启动工作线程。。如果不启动工作线程(没有图像处理),是否也会看到同样的减速?如果我不进行任何处理,则不会减速。所以我想我必须在录制过程中保持低CPU负载。谢谢你,亚历克斯!是的,我现在正在UI线程中调用这个方法。现在一切似乎都很好。稳定:——)
cam.setOneShotPreviewCallback(this);