我有一个从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
纹理更新并绑定到曲面并渲染。
这在kitkat上非常有效。在棒棒糖上,视频完全是黑色的。
你可以在这里看到日志的差异(好的kitkat红色,坏的棒棒糖绿色):
https://www.diffchecker.com/lxxopmhc
对我而言,没有什么比特别有用的了
(我所能找到的消息do not know color format 0x7fa30c04 = 2141391876
只是将解码器ID转换成名称的东西,不应该影响任何东西。另一个解码器没有给出这个消息,但也没有#39}。工作。)
向MediaFormat添加显式颜色格式,并在其他任何地方使用颜色格式和图像尺寸进行调整并没有任何效果(只有黑屏,没有错误)
我可以锁定表面上的画布并绘制ARGB(255,0,255,0),屏幕变为绿色。
我创建了一个surface的子类,它记录了每个公共方法并将其传递给解码器,并且没有一个在kitkat或棒棒糖上被调用(除了我创建它时的初始化),无论是否工作,所以告诉我什么都没有。
进行视频解码器设置的代码来自Moonlight,它在棒棒糖上工作得很好:
github.com/moonlight-stream/moonlight-android
另一半是Oculus Cinema,使用android.media.MediaPlayer在表面上显示,并且在棒棒糖上工作正常。
我的代码在这里:
https://github.com/GTMoogle/StreamTheater
尝试了来自http://bigflake.com/mediacodec/的Q11的以下建议来设置缓冲区位置和限制,但仍然没有输出,尽管我可能已经错误地实现了它。还照顾了一些赎回的电话,也没有效果。
Up-Update:来自dequeueOutputBuffer的BufferInfo似乎总是大小为8,0偏移,没有设置标志。不确定健康的流是什么样的。
答案 0 :(得分:1)
Ahhah。最终找到了它。
由于某种原因,updateTexImage不会更改曲面纹理的时间戳。 Mediacodec将其设置为kitkat,因此输入缓冲区没有正确设置时间戳,mediacodec正在清理它,或者更新纹理时mediacodec不再设置它?
我可以调试它,但我至少可以暂时更新而不是检查时间戳是否发生了变化。