gpt4 book ai didi

Android 视频解码器仅在 Lollipop 上不绘制到 gles 表面

转载 作者:行者123 更新时间:2023-11-30 02:08:43 31 4
gpt4 key购买 nike

简而言之,我将两个开源应用程序合并到一个新的 VR 应用程序中,因此它只能在使用 GearVR 耳机的 Note 4 和 S6 上运行。我的应用程序适用于 kitkat,但视频在 Lollipop 上是黑色的。这两个源应用程序都可以在 Lollipop 上正常运行。

我有一个由 gl 纹理创建的表面:

glGenTextures( 1, &textureId );
glBindTexture(GL_TEXTURE_EXTERNAL_OES, textureId);
glTexParameterf(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glBindTexture(GL_TEXTURE_EXTERNAL_OES, 0);

它被放入一个 SurfaceTexture 中,然后被放入一个 Surface 中,经过一些传递,然后发送到视频解码器:

videoDecoder = MediaCodec.createByCodecName(decoderName);
MediaFormat videoFormat = MediaFormat.createVideoFormat("video/avc", width, height);
videoDecoder.configure(videoFormat, ((SurfaceHolder)renderTarget).getSurface(), null, 0);
videoDecoder.setVideoScalingMode(MediaCodec.VIDEO_SCALING_MODE_SCALE_TO_FIT);

// OMX.qcom.video.decoder.avc gets picked for decodername
// Width and height at 1280x720 everywhere

纹理被更新并绑定(bind)到表面并被渲染。

这在 kitkat 上非常有效。在 Lollipop 上,视频完全是黑色的。

您可以在此处看到日志的差异(好的 kitkat 红色,坏的 lollipop 绿色):
https://www.diffchecker.com/lxxopmhc

对我来说,没有什么是特别有用的。
(消息 do not know color format 0x7fa30c04 = 2141391876 我能找到的只是来自将解码器 ID 转换为名称的东西,不应该影响任何东西。另一个解码器没有给出这条消息,但也不起作用。)

向 MediaFormat 添加明确的颜色格式,并在其他地方摆弄颜色格式和图像大小没有任何效果(只有黑屏,没有错误)

我可以在表面上锁定 Canvas 并绘制 ARGB(255,0,255,0),屏幕变为绿色。

我创建了一个 surface 的子类,它记录了每个公共(public)方法并将其传递给解码器,并且在 kitkat 或 lollipop 上没有一个被调用(除了我创建它时的初始化),无论工作与否,所以这告诉我什么都没有。

视频解码器设置的代码来自 Moonlight,它在 lollipop 上工作得很好:
github.com/moonlight-stream/moonlight-android

另一半是 Oculus Cinema,它使用 android.media.MediaPlayer 在表面上显示,在 Lollipop 上运行良好。

所以我的问题是 lollipop 上发生了什么变化或者我做错了什么,我该如何进一步调试这个问题?

我的代码在这里:
https://github.com/GTMoogle/StreamTheater

6/2 更新:

尝试遵循 http://bigflake.com/mediacodec/ 的 Q11 中的建议设置缓冲区位置和限制,但仍然没有输出,尽管我可能实现不正确。还处理了一些 depricated 调用,同样没有效果。

Up-Update:来自 dequeueOutputBuffer 的 BufferInfo 似乎总是大小为 8,偏移量为 0,未设置标志。还不确定健康的流是什么样子。

最佳答案

啊哈。终于找到了。

出于某种原因,updateTexImage 没有更改表面纹理的时间戳。 Mediacodec 在 kitkat 上设置它,所以输入缓冲区没有正确设置时间戳并且 mediacodec 在它之后清理,或者 mediacodec 在更新纹理时不再设置它?

我可以调试它,但至少目前我可以只更新而不是检查时间戳是否改变。

关于Android 视频解码器仅在 Lollipop 上不绘制到 gles 表面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30405018/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com