简而言之,我将两个开源应用程序组合成一个新的 VR 应用程序,因此它只能在使用 GearVR 耳机的 Note 4 和 S6 上运行。我的应用程序适用于 kitkat,但棒棒糖上的视频是黑色的。这两个源应用程序都在棒棒糖上运行良好。
我有一个从 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 中,该 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 转换为名称的东西,不应该影响任何东西。另一个解码器没有给出这个消息,但也不起作用。)
向 MediaFormat 添加显式颜色格式,并在其他任何地方使用颜色格式和图像大小没有任何效果(只有黑屏,没有错误)
我可以在表面上锁定画布并绘制ARGB(255,0,255,0),屏幕变为绿色。
我创建了一个表面的子类,它记录了每个公共方法并将其传递给解码器,并且没有一个在 kitkat 或棒棒糖上被调用(除了我创建它时的初始化),工作与否,所以这根本没有告诉我.
进行视频解码器设置的代码来自 Moonlight,它在棒棒糖上运行良好:
github.com/moonlight-stream/moonlight-android
另一半是 Oculus Cinema,它使用 android.media.MediaPlayer 在表面上显示,并且在棒棒糖上运行良好。
所以我的问题是棒棒糖发生了什么变化或者我做错了什么,我该如何进一步调试这个问题?
我的代码在这里:
https ://github.com/GTMoogle/StreamTheater
更新 6/2:
尝试遵循http://bigflake.com/mediacodec/的 Q11 的建议来设置缓冲区位置和限制,但仍然没有输出,尽管我可能实施不正确。还照顾了一些贬低的电话,也没有效果。
更新:来自 dequeueOutputBuffer 的 BufferInfo 似乎总是有 8 的大小,0 偏移量,没有设置标志。还不确定健康的流是什么样子。