我们在Google App Engine中使用托管虚拟机实例.直到今天它一切顺利并且正在运行,但是在过去的12个小时左右,运行状况检查始终失败,这会每10分钟左右触发一次新的VM重启.值得一提的是,图像是相同的,例如,自三天前到现在为止,未对docker图像进行任何更改.
对此有何解决方案?模块不会明确处理运行状况检查.GAE管理控制台显示最新的运行状况检查返回502代码而不是200代码.
这非常糟糕,因为每次重启后IP也会发生变化,日志会因健康失败错误而泛滥,最终实例无法使用(它正在运行MQTT代理,因此需要永久启动).
有线索吗?
我正在开发一个 Android 应用程序,该应用程序使用 MediaCodec 使用 Surface 方法对 H.264 视频进行编码。我的目标是 Android 5.0,并且我遵循了 bigflake.com 上的所有示例和示例(我两年前开始研究这个项目,所以我经历了所有的问题和其他问题)。
在 Nexus 6(它使用 Qualcomm 硬件编码器来执行此操作)上一切正常,并且我能够以多种输出(来自 MP4 本地文件,高达 http 流)。但是,当我尝试在使用 Mediatek 芯片组的 Sony Android TV(运行 Android 5.1)上使用该应用程序时,即使从编码级别开始,一切都变得混乱起来。更具体:
基本上不可能让硬件编码器正常工作(即“OMX.MTK.VIDEO.ENCODER.AVC”)。使用最基本的设置(在 MediaCodec 级别成功),我将永远不会从中获取输出缓冲区,只有奇怪的、垃圾邮件、logcat 错误消息指出驱动程序在每次应编码帧时遇到错误,如下所示:
01-20 05:04:30.575 1096-10598/? E/venc_omx_lib: VENC_DrvInit failed(-1)!
01-20 05:04:30.575 1096-10598/? E/MtkOmxVenc: [ERROR] cannot set param
01-20 05:04:30.575 1096-10598/? E/MtkOmxVenc: [ERROR] EncSettingH264Enc fail
Run Code Online (Sandbox Code Playgroud)有时,尝试将其配置为以 360 x 640 像素分辨率进行编码将成功使编码器实际编码内容,但我会注意到的第一个问题是它只会创建一个关键帧,即第一个视频帧。在那之后,不再创建任何关键帧,只有 P 帧。当然,i-frame-interval 设置为一个不错的值,并且在其他设备上没有问题。不用说,这使得创建可查找的 MP4 文件或任何类型的流媒体解决方案成为不可能。
大多数情况下,在释放编码器后,logcat 将开始无休止地发送“等待输入帧被释放...”的垃圾邮件,这基本上需要重新启动设备,因为从那时起无论如何都不会起作用。
如果它没有在简单的 release() 之后大肆破坏,没问题 - 硬件编码器确保它不能被第二次创建,并且它回退到通用的 SOFTWARE avc google 编码器。hich ofcourse 基本上是一个模型编码器,它在尝试编码大于 160p 的任何视频时只会吐出一个错误......
所以,我的问题是:有没有希望让这个 …
更新:这看起来与此相关:Image data from Android camera2 API Flipped & squished on Galaxy S5 - 我认为这是一个错误,因为 Nexus 5/6 工作正常,需要获取完整的传感器尺寸然后再获取是没有意义的手动裁剪以达到所需的宽高比,也可能不使用“支持的”输出尺寸!
问题:
编解码器输出具有正确的大小。但结果因设备而异:
有人会说,没问题。也许表面不是完全按照指定的宽度和高度创建的,或者其他什么(即使输出尺寸是专门为 MediaCodec.class 目标提取的)。
因此,我创建了一个 OpenGL 上下文,生成了一个纹理,为其创建了一个 SurfaceTexture,将其默认缓冲区大小设置为相机输出大小,并使用该纹理创建了一个 Surface。我不会详细讨论将其绘制到 TextureView 或返回到 MediaCodec 的 EGL 表面的具体细节。结果是相同的 - Camera2 捕获请求仅针对某些分辨率输出扭曲的图像。深入挖掘:在 updateTexImage 之后立即调用 SurfaceTexture 上的 getTransformMatrix - 正如预期的那样,矩阵始终是单位矩阵。
因此,这里真正的问题是相机没有按照提供的目标表面的大小进行捕捉。因此,解决方案是获取相机正在捕获的实际尺寸,其余部分是纯 GL 矩阵变换以正确绘制。但是 - 我怎样才能得到它?
注意:使用旧的相机 API,具有与目标完全相同的“预览尺寸”和相同的表面(MediaCodec 或自定义的)- …
使用Android的MediaProjection API,我遇到了一些问题(实际上更多,但这些问题更为重要).阅读图形架构并不会有所帮助,所以我只想了解我是否在代码流中跳过了某些内容.
我们假设:
我有一个专门的GL渲染线程,初始化,并在其上生成GL纹理.我为纹理设置了默认缓冲区大小WxH.
我使用GL纹理创建SurfaceTexture,为此表面纹理创建Surface.
通过MediaProjection创建大小为WxH的虚拟显示,并将其曲面设置为上表面.
问题1:一切都运行正常(全帧正确进入)或不正常(所有帧都是黑色;或者每帧只有一半是可见的 - 所有帧的相同一半;或者屏幕的某些部分重复到其他帧部分,有时甚至是倾斜的).
问题2:在一些全屏幕GL游戏中花费时间,在一段固定的时间(大约4分钟)之后,所有传入的帧都被冻结(例如我收到"新"帧,但实际上是同一个图像) .用glReadPixels读取确认结果 - 问题是,实际显示是超过该帧.强制它"恢复"的唯一方法是调出状态栏或导航栏,立即开始向我发送正确的帧.当然,又过了4分钟,又发生了......
问题3:调用VirtualDisplay上的resize(),同时调用setDefaultBUfferSize()到GL纹理后,最终在90%的情况下展示问题#1(黑色/切割帧,其他屏幕区域的工件...... )
我正在使用updateTextureImage的调用序列 - > GL纹理绘制在同一个线程中,所以我的正常理解是它永远不应该发生我以某种方式从半满的GL缓冲区读取,或者某事......对吗?
我也通过将VirtualDisplay直接渲染到MediaCodec的表面(没有涉及自定义GL)来测试这个问题 - 相同的行为. 更新实际上由于MediaCodec有一个固定大小的创建表面,因此我们只能调整虚拟显示器的大小,而不是编码器的表面大小,因此无法重现该错误,所以这不是一个真正的错误(但即便如此,它也会很好VirtualDisplay以某种方式相应地调整表面大小).
我觉得在关闭虚拟显示器时有些东西在泄漏,或者在VirtualDisplay的创建之间没有正确初始化,因为它不一致.很有可能一个全新的MediaProjection屏幕捕获权限,全新的虚拟显示器,刚刚创建的表面纹理,最终只会给我一半的框架......让我有一个大的扑克脸. ..
PS:所有这一切都发生在带有Android 6.0.1的Nexus 6上.