我正在尝试使用示例代码 Grafika 中的 Live Camera Recording (With Opengl)。在我的 Moto G 上一切正常,但我在我的其他设备(带有 Cyanogendmod 11 的 Galaxy Tab 2)上尝试,似乎方法:signalEndofInputStream() 不起作用,编码器永远不会停止。有没有办法以其他方式将信号发送到 MediaCodec?
抱歉英语不好。
我正在尝试使用示例代码 Grafika 中的 Live Camera Recording (With Opengl)。在我的 Moto G 上一切正常,但我在我的其他设备(带有 Cyanogendmod 11 的 Galaxy Tab 2)上尝试,似乎方法:signalEndofInputStream() 不起作用,编码器永远不会停止。有没有办法以其他方式将信号发送到 MediaCodec?
抱歉英语不好。
你可以解决它。
如果您查看DecodeEditEncodeTest,您会看到一个名为WORK_AROUND_BUGS
. 它是这样使用的:
if (WORK_AROUND_BUGS) {
// Might drop a frame, but at least we won't crash mediaserver.
try { Thread.sleep(500); } catch (InterruptedException ie) {}
outputDone = true;
} else {
encoder.signalEndOfInputStream();
}
这在 CTS 测试的开发过程中使用,当时特定于供应商的代码还不能很好地与流结束信号一起工作。添加它是为了让我们可以在供应商处理补丁时使用其他功能。该标志在 4.3 中发布的测试之前被禁用。您可能会在 Cyanogen 上遇到未打补丁的编解码器。
解决方法是永远不要发送流结束信号。相反,您只需停止编解码器。飞行中的缓冲区可能会丢失并且您会丢失一帧,但对于实时录制而言,这可能无关紧要。(对于视频编辑来说,这更像是一个问题。)