Android应用程序在物理设备上崩溃,但在仿真器上不崩溃:“;Parcel:dup()在Parcel::read[…]中失败错误:打开的文件太多;

Android应用程序在物理设备上崩溃,但在仿真器上不崩溃:“;Parcel:dup()在Parcel::read[…]中失败错误:打开的文件太多;,android,kotlin,video-capture,Android,Kotlin,Video Capture,我正试图把一部旧手机变成网络安全摄像头,因为在所有这些骚乱期间,我所在地区的犯罪率急剧上升(我不想依靠其他人的应用程序来控制对我私人时刻的访问) 我正在进行分块和发送,所以摄像机会记录视频数秒,停止,将捕获文件的二进制编码到Base64,然后通过POST请求将其发送到家庭服务器,所有这些都是无休止的循环。服务器将其解包+解码+保存为原始二进制文件“MP4”到自己的磁盘上(TODO:运动检测的有趣后处理) 在我的目标手机的操作系统版本和屏幕大小(以及周围)使用各种虚拟设备,所有这些都可以在较长的时

我正试图把一部旧手机变成网络安全摄像头,因为在所有这些骚乱期间,我所在地区的犯罪率急剧上升(我不想依靠其他人的应用程序来控制对我私人时刻的访问)

我正在进行分块和发送,所以摄像机会记录视频数秒,停止,将捕获文件的二进制编码到Base64,然后通过POST请求将其发送到家庭服务器,所有这些都是无休止的循环。服务器将其解包+解码+保存为原始二进制文件“MP4”到自己的磁盘上(TODO:运动检测的有趣后处理)

在我的目标手机的操作系统版本和屏幕大小(以及周围)使用各种虚拟设备,所有这些都可以在较长的时间内工作。我已经用了15分钟60秒的时间,加上一个多小时6秒的时间。我总是在我的服务器上接收模拟器生成的愚蠢的虚拟房间视频

但在三星Galaxy S5上,运行Android 6.0.1的三星Galaxy S5梦想成为安全摄像头,在应用程序崩溃之前,通常需要发送2到3个视频。。。除非您的分辨率设置得太高,否则您会遇到不同的症状

症状#0:在块末尾崩溃 E/Parcel:dup()在Parcel::read中失败,i为1,fds[i]为-1,fd_计数为2,错误:打开的文件太多

E/Surface:dequeueBuffer:IGraphicBufferProducer::requestBuffer失败:-22

W/Adreno EGLSUB:DequeueBuffer:721:dequeue本机缓冲区失败:无效参数,缓冲区=0x0,句柄=0x0

W/Adreno EGL::EGL_坏_表面

紧接着是第二个错误:

E/CameraDeviceGLThread-1:在GL渲染线程上收到异常:

java.lang.IllegalStateException: swapBuffers: EGL error: 0x300d
最后,一旦区块时间结束,相机再次开始录制,就会出现最终错误,导致整个应用程序崩溃:

I/CameraDeviceState:旧摄像头服务转换为状态错误

E/AndroidRuntime:致命异常:CameraThread

Process: com.example.roselawncam, PID: 14639
android.hardware.camera2.CameraAccessException:相机设备遇到严重错误


症状1:在块的中部崩溃,因为你也去了> P>我有一些建议:

  • 在需要
    文件锁的地方强制使用同步函数,以便线程按顺序执行该代码块,以有组织的方式打开和关闭
    文件流
    ,例如访问文件。这将避免
    内存不足
    文件已在使用
    错误

  • 是否可以不将文件编码到
    Base 64
    ?字符串太大,请检查是否避免了任何错误

还有一个很好的启动,可以启动你自己的应用程序。

打开的文件太多了 症状#0的第一条错误消息为

E/Parcel: dup() failed in Parcel::read, i is 1, fds[i] is -1, fd_count is 2, error: Too many open files
来自:

状态错误=无错误;
对于(size_t i=0;ireadFileDescriptor());
if(fds[i]<0){
err=错误值;
ALOGE(“dup()在包裹::读取中失败,i为%zu,fds[i]为%d,fd_计数为%zu,错误:%s”,
i、 fds[i],fd_计数,strerror(errno));
}
}
它表明上述错误发生在

fds[i]=dup(this->readFileDescriptor());
我还搜索了太多打开的文件,找到了。它有详细的错误日志和答案。两者都表示文件描述符

根本原因可能是。。。 请检查
convertToBase64()
的实现


根据和,文件描述符可能会泄漏。

哇,你正在做的很酷的事情。我知道你不想将其他人的应用程序用于你的私人订阅源。但GitHub上也有一个FOSS项目就是为了这个:(我从这篇文章中记得:)。即使你不想直接使用,你仍然可以检查它,看看它是否对你的S5有效,如果是,找出区别。祝你好运<代码>打开的文件过多错误
可能在资源紧缩时出现,在您的情况下,这可能是由于同时调用多个异步任务而同时打开的线程数。您可以通过使用线程池机制来限制这一点,而不是使用原始异步任务。快速而简单的回答:内存泄漏,或者有太多线程打开而未关闭。为异步调用创建线程池。在Samsung S5 Only上以后台模式使用摄像头时出现此错误。您解决了吗?
params["videodata"] = convertToBase64(outputFile)