Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/197.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android上的死锁';在视频录制过程中使用PreviewCallback时s MediaRecorder_Android_Multithreading_Camera_Mediarecorder - Fatal编程技术网

Android上的死锁';在视频录制过程中使用PreviewCallback时s MediaRecorder

Android上的死锁';在视频录制过程中使用PreviewCallback时s MediaRecorder,android,multithreading,camera,mediarecorder,Android,Multithreading,Camera,Mediarecorder,在一些问题之后,我终于使用MediaRecorder在我的应用程序中实现了视频录制 我现在想做的是在录制过程中处理尽可能多的预览帧。也就是说,我想抓取一个预览帧,处理它,并在处理这个帧时忽略任何预览帧。一旦完成处理,我想继续下一个 为此,我尝试了两种不同的方法: 通过Camera.addCallbackBuffer()添加两个缓冲区,并让一个线程处理其中一个缓冲区,而PreviewCallback会在收到帧时立即重新添加当前“未使用”的缓冲区 使用setOneShotPreviewCallbac

在一些问题之后,我终于使用MediaRecorder在我的应用程序中实现了视频录制

我现在想做的是在录制过程中处理尽可能多的预览帧。也就是说,我想抓取一个预览帧,处理它,并在处理这个帧时忽略任何预览帧。一旦完成处理,我想继续下一个

为此,我尝试了两种不同的方法:

  • 通过Camera.addCallbackBuffer()添加两个缓冲区,并让一个线程处理其中一个缓冲区,而PreviewCallback会在收到帧时立即重新添加当前“未使用”的缓冲区

  • 使用setOneShotPreviewCallback(),在回调方法中处理帧,然后再次使用setOneShotPreviewCallback()

  • 一帧的处理大约需要500毫秒

    使用这两种方法,我会遇到两个问题:

  • 预览帧速率(在TextureView上)降低了很多
  • 主要问题:在大多数情况下,我会在录制期间或录制结束时遇到某种死锁
  • 我就是这么做的(使用setOneShotPreviewCallback()方法):

    后来,我从另一个线程停止录制:

    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);