- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正试图将旧手机变成联网安全摄像头,因为在所有这些骚乱期间,我所在地区的犯罪率急剧增加(而且我不想依赖其他人的应用程序来控制对我私有(private)时刻的访问)。
我正在分 block 和发送,所以相机记录视频几秒钟,停止,将捕获文件的二进制编码为 Base64,然后通过 POST 请求将其发送到家庭服务器,所有这些都在一个无限循环中。服务器解包 + 解码 + 将其作为原始二进制“MP4”保存到自己的磁盘上(TODO:用于运动检测的有趣后处理)。
在我的目标手机的操作系统版本和屏幕尺寸(及其周围)使用各种虚拟设备,这一切都可以长时间工作。我使用 60 秒的 block 超过 15 分钟,加上 6 秒的 block 超过一个小时。我一直收到模拟器在我的服务器上生成的愚蠢的虚拟房间视频。
但在运行 Android 6.0.1 并梦想成为安全摄像头的三星 Galaxy S5 上,通常需要发送 2 或 3 个视频才能让应用崩溃……除非你的分辨率设置得太高,否则你会遇到不同的情况症状。
症状 #0:在 block 的末尾崩溃
E/Parcel: dup() failed in Parcel::read, i is 1, fds[i] is -1, fd_count is 2, error: Too many open files
E/Surface: dequeueBuffer: IGraphicBufferProducer::requestBuffer failed: -22
W/Adreno-EGLSUB: DequeueBuffer:721: dequeue native buffer fail: Invalid argument, buffer=0x0, handle=0x0
W/Adreno-EGL: <qeglDrvAPI_eglSwapBuffers:3800>: EGL_BAD_SURFACE
E/CameraDeviceGLThread-1: Received exception on GL render thread:
java.lang.IllegalStateException: swapBuffers: EGL error: 0x300d
I/CameraDeviceState: Legacy camera service transitioning to state ERROR
E/AndroidRuntime: FATAL EXCEPTION: CameraThread
Process: com.example.roselawncam, PID: 14639
android.hardware.camera2.CameraAccessException: The camera device has encountered a serious error
W/Adreno-GSL: <gsl_ldd_control:475>: ioctl fd 28 code 0xc01c0915 (IOCTL_KGSL_MAP_USER_MEM) failed: errno 12 Out of memory
W/Adreno-EGLSUB: SyncBackBuffer:3130: failed to map the memory for fd=281 offs=0
E/Adreno-EGLSUB: SyncBackBuffer:3131: SyncBackBuffer: FATAL ERROR : (null)
A/Adreno-GSL: Exiting the process com.example.roselawncam from function SyncBackBuffer and line 3131
A/libc: Fatal signal 6 (SIGABRT), code -6 in tid 19618 (CameraDeviceGLT)
private fun createRecorder(surface: Surface) = MediaRecorder().apply {
setAudioSource(MediaRecorder.AudioSource.MIC)
setVideoSource(MediaRecorder.VideoSource.SURFACE)
setOutputFormat(MediaRecorder.OutputFormat.MPEG_4)
setOutputFile(outputFile.absolutePath)
setVideoEncodingBitRate(RECORDER_VIDEO_BITRATE)
if (args_fps > 0) setVideoFrameRate(args_fps)
setVideoSize(args_width, args_height)
setVideoEncoder(MediaRecorder.VideoEncoder.H264)
setAudioEncoder(MediaRecorder.AudioEncoder.AAC)
setInputSurface(surface)
}
private fun recordIt(cameraManager: CameraManager, cameraThread: HandlerThread) {
val cameraHandler = Handler(cameraThread.looper)
val stateCallback: CameraDevice.StateCallback = object: CameraDevice.StateCallback() {
override fun onOpened(camera: CameraDevice) {
camera.createCaptureSession(
listOf<Surface>(recorderSurface),
object : CameraCaptureSession.StateCallback() {
override fun onConfigured(session: CameraCaptureSession) {
val recTimeSeconds = findViewById<TextView>(R.id.recTimeSeconds)
val chunkTimeMilliseconds = recTimeSeconds.text.toString().toLong() * 1000
// Boolean "stopREC" (e.g. "Stop Recording") is false at this point
while (!stopREC) {
// // // This loop should run forever, but crashes after a few times // // //
val recorder: MediaRecorder by lazy { createRecorder(recorderSurface) }
val recordRequest: CaptureRequest by lazy {
session.device.createCaptureRequest(CameraDevice.TEMPLATE_RECORD).apply {
addTarget(recorderSurface)
set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, Range(args_fps, args_fps))
}.build()
}
session.setRepeatingRequest(recordRequest, null, cameraHandler)
recorder.apply { prepare(); start() }
Thread.sleep(chunkTimeMilliseconds)
recorder.apply { stop(); release() }
// Send the video file across the network in JSON via POST request:
val params = HashMap<String, String>()
params["videodata"] = convertToBase64(outputFile)
val jsonObject = JSONObject(params as Map<*, *>)
val request = JsonObjectRequest(Request.Method.POST, url, jsonObject, null, null)
queue.add(request)
// // // End of loop that should've ran forever, but crashes occasionally instead // // //
}
camera.close()
}
override fun onConfigureFailed(session: CameraCaptureSession) {}
},
cameraHandler
)
}
override fun onDisconnected(camera: CameraDevice) { recorder.stop(); recorder.release() }
override fun onError(camera: CameraDevice, error:Int) { camera.close() }
}
cameraManager.openCamera(args_cameraId, stateCallback, cameraHandler)
}
最佳答案
我有一些建议:
file lock
的地方强制使用同步函数因此线程将按顺序执行该代码块,打开和关闭 file stream
以有组织的方式,例如,访问文件。这样可以避免 out of memory
和 file already in use
错误。Base 64
?字符串太大,检查是否避免任何错误。关于Android 应用程序在物理设备上崩溃但不是模拟器 : "Parcel: dup() failed in Parcel::read [...] error: Too many open files",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63626751/
我有两个 Activity,A 和 B。我试图将对象从 Activity A 发送到 Activity B。在 Activity A 中,我可以看到我的列表包含两个项目,但是当我在 Activity
我想在android中使用Parcelable而不是Serializable,因为它更快,推荐。我的问题是,我好像无法打包Java提供的类LinkedHashMap,对吧? 例如 public cla
我在为我的 Android 应用程序使用 parcelables 时遇到了一些问题。 我有一个名为 Transport 的自定义类,其中包含一堆 RoutePoint - 从文件加载并保存在数组中的实
编辑 清理和重建后,没有生成类 我在尝试使用 Parcels.wrap() 时遇到此错误 Unable to find generated Parcelable class for xyz.xyz.m
我有一个扩展 Parcelable 的类,我们称它为 A 类。 我有另一个扩展 Parcelable 的类,我们称之为 B 类。 A 的成员变量之一是 B 类对象的 ArrayList。 我正在尝试编
当我尝试使用 @Parcelize 注释 enum class 或 object 时,会导致错误 'Parcelable' should是一个类,既作为编辑器提示又作为编译失败。我可以 @Parcel
确实是相当简单的场景,但我在 Google 上找不到任何相关内容,所以这里是: class ContainerClass implements Parcelable { List _items;
我有一个实现Parcelable接口(interface)的类: class A implements Parcelable { } 我有另一个类 B 包含一个 A 对象作为实例变量。在类 B 内的
我如何实现写我的Set >使用通用数据类型到我的包裹? 这是我的代码.. dest.writeList(getArrTRA()); dest.writeList(ge
我有一个 Java Bean 类,在某些字段上用 @Parcel(Parcel.Serialization.BEAN) 和 Gson 的 @SerializedName 注释: 问题.java: @P
有时,我收到此错误,我不知道我的代码出了什么问题帮忙! 任何有帮助的建议代码。 这是我的错误报告: com.example E/UncaughtException: java.lang.Runtime
我正在实现具有另一个 Parcelable insde 的 Parcelable 类。 在 OuterParcelable 类中: @Override public void writeToParce
我想编码和解码一个实现 Parcelable 到/来自字节数组的类。 我很清楚 Parcelable 表示不稳定,因此不适合长期存储实例。但是我有一个用例,我需要序列化一个对象,它不是一个展示停止器如
有没有办法使用Parceler使用 Kotlin 数据类和构造函数进行序列化,而不为每个字段使用 @ParcelProperty 注释? 如果我尝试使用这样的库: @Parcel data class
我正在尝试编写一个可打包的数据对象,以便在我的 android 应用程序中从 activityA 传递到 activityB。 我的对象正在传递所有数据,除了我的可用服务类的 arraylist da
我在上课时遇到问题 Parcelable .问题是,我正在尝试将类(class)中的成员写入包裹,该成员是 ArrayList。目的。 ArrayList是 Serializable ,并且列表中的对
我有一个可打包的团队类 @Parcelize class Team(var name: String, var teamMembers: List, var id: UUID): Parcelable
我有一个包含另一个对象的对象,我想使用 Parcelable 将一个 fragment 发送到另一个 fragment ,例如: Fragment fragment = new Fragment();
Parceler 的自述文件指出它可以与其他基于 POJO 的库一起使用,尤其是 SimpleXML。 是否有任何示例可以证明其用法? 我已经成功地将 Parceler 与 GSON 结合使用: Gs
我是 android 的新手,在思考 Parcelable 界面时遇到了一些麻烦。 我终于找到了这个: https://stackoverflow.com/a/2141166/6647053 上述回答
我是一名优秀的程序员,十分优秀!