不绘制GLES Android的视频解码器表面上只棒棒糖(Android video decoder

2019-10-23 04:23发布

简单地说,我对注4合并两个开源的应用程序到一个新的VR应用程序,所以这只能运行和使用S6的GearVR耳机。 我的应用程式适用于奇巧,但视频是黑色棒棒糖。 这两个源的应用提供的棒棒糖都工作得不错。

我从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);

这被放入该被放进一个表面的表面纹理,这被张望了一下过去,然后发送到视频解码器:

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

纹理被更新,并且结合于一个表面和渲染。

这完全适用于奇巧。 在棒棒糖,视频是全黑的。

你可以在这里看到日志的差异(好奇巧红色,坏棒棒糖绿色):
https://www.diffchecker.com/lxxopmhc

没有站出来对我来说是特别丰富。
(该消息do not know color format 0x7fa30c04 = 2141391876从我能找到的是刚刚从原来解码器ID添加到名字的东西,应该不会影响任何东西。另一个解码器不把这个消息,但也不起作用。)

添加一个明确的颜色格式的MediaFormat,并与色彩格式和图像尺寸其他地方没有任何效果摆弄(仅黑屏,没有错误)

我可以在表面上锁定画布和drawARGB(255,0,255,0),屏幕变为绿色。

我创建的表面的子类,记录每一个公共方法,并通过了该解码器,和他们没有接到电话(不是初始化等,当我创造了它),在奇巧或棒棒糖,工作或没有,这样对我说什么都没有。

做视频解码器设置的代码来自月光,这工作完全正常的棒棒糖:
github.com/moonlight-stream/moonlight-android

另一半是魔环电影院,其显示使用android.media.MediaPlayer表面上,并能正常工作的棒棒糖。

所以我的问题是关于棒棒糖什么改变,或者你有什么我做错了,我怎么能调试这个问题的任何进一步的?

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

更新6/2:

试图从下面的Q11建议http://bigflake.com/mediacodec/设置缓冲区的位置和界限,但仍然没有输出,虽然我可能会错误地实现它。 也照顾了一些depricated的电话,也没有效果。

上更新:从dequeueOutputBuffer的BufferInfo似乎总是有8,0尺寸偏差,不设置标志。 不知道什么是健康的流样子呢。

Answer 1:

Ahhah。 最终找到了它。

出于某种原因,updateTexImage不改变表面纹理的时间戳。 Mediacodec是把它放在奇巧,因此无论是输入缓冲区没有时间戳正确设置和mediacodec在后清理,或更新纹理时mediacodec不再设置呢?

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



文章来源: Android video decoder not drawing to gles surface on lollipop only