inity android Нативный видеоплеер - Audio Works, но видео Rends Black < /h1>
Я разрабатываю приложение Unity AR, которое необходимо воспроизводить видео на 3D -объектах, используя пользовательский нативный плагин Android. Аудио играет правильно, но поверхность видео остается черной. Я использую MediaCodec с Surfacetexture и OpenGL ES внешней текстурой.Unity Project/
├── Assets/
│ ├── Scripts/
│ │ └── AndroidVideoPlayer.cs
│ └── Shaders/
│ └── AR_Video_shader.shader
└── Plugins/
└── Android/
├── UnityVideoPlugin/
│ ├── src/main/
│ │ ├── java/org/vibrissestudio/unityvideoplugin/
│ │ │ ├── UnityVideoPlugin.kt
│ │ │ └── UnityBridge.kt
│ │ └── cpp/
│ │ └── UnityVideoPlugin.cpp
│ └── AndroidManifest.xml
< /code>
Проблема < /h2>
Аудио декодирование и воспроизведение работают отлично < /li>
Видео -кадры декодируются (журналы показывают успешное render) < /li>
. /> < /ul>
разделы кода ключей < /h2>
1. Unity C# Script (androidvideoplayer.cs) < /h3>
public void InitializeVideo(string finalPath)
{
// Create video texture via native plugin
IntPtr renderEventFunc = GetRenderEventFunc();
GL.IssuePluginEvent(renderEventFunc, kInitVideoTextureEventId);
System.Threading.Thread.Sleep(200);
_longPtrValue = directGetNativeVideoTexturePtr();
unityVideoPluginClass.CallStatic("setInitVideoPlayerParams", _longPtrValue, finalPath);
GL.IssuePluginEvent(GetRenderEventFunc(), 4);
// Create external texture
if (_longPtrValue != 0)
{
IntPtr nativeTexPtr = new IntPtr(_longPtrValue);
videoTexture = Texture2D.CreateExternalTexture(width, height, TextureFormat.RGBA32, false, false, nativeTexPtr);
}
targetRenderer.material.mainTexture = videoTexture;
}
private void Update()
{
GL.IssuePluginEvent(GetRenderEventFunc(), 3); // Update texture
_longPtrValue = directGetNativeVideoTexturePtr();
if (_longPtrValue != 0 && videoTexture != null)
{
videoTexture.UpdateExternalTexture(new IntPtr(_longPtrValue));
}
}
< /code>
2. Нативный мост C ++ (unityvideoplugin.cpp) < /h3>
static GLuint g_VideoTextureId = 0;
#define kInitVideoTextureEventId 2
#define kUpdateTextureEventId 3
extern "C" void UNITY_INTERFACE_API OnRenderEvent(int eventID)
{
if (eventID == kInitVideoTextureEventId)
{
if (g_VideoTextureId == 0)
{
glGenTextures(1, &g_VideoTextureId);
glBindTexture(GL_TEXTURE_EXTERNAL_OES, g_VideoTextureId);
glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glBindTexture(GL_TEXTURE_EXTERNAL_OES, 0);
}
}
else if (eventID == kUpdateTextureEventId)
{
// Call Java updateSurfaceTexture method
jmethodID updateMethod = env->GetStaticMethodID(g_UnityVideoPluginClass, "updateSurfaceTexture", "()V");
env->CallStaticVoidMethod(g_UnityVideoPluginClass, updateMethod);
}
}
extern "C" jlong directGetNativeVideoTexturePtr(JNIEnv *env, jclass clazz)
{
return static_cast(g_VideoTextureId);
}
< /code>
3. Видеаплер Android Kotlin (unityVideoplugin.kt) < /h3>
class UnityVideoPlugin {
companion object {
private var globalSurfaceTexture: SurfaceTexture? = null
private var mediaCodec: MediaCodec? = null
private var surface: Surface? = null
@JvmStatic
fun updateSurfaceTexture() {
try {
globalSurfaceTexture?.updateTexImage()
Log.i(TAG, "updateSurfaceTexture successfully updated frame")
} catch (e: Exception) {
Log.e(TAG, "Error in updateSurfaceTexture: ${e.message}")
}
}
}
fun initVideoPlayerStepTwoImpl(longPtr: Long, videoPath: String) {
globalSurfaceTexture = SurfaceTexture(longPtr.toInt())
surface = Surface(globalSurfaceTexture)
mediaExtractor = MediaExtractor().apply { setDataSource(videoPath) }
val trackIndex = selectTrack(mediaExtractor)
mediaExtractor?.selectTrack(trackIndex)
val format = mediaExtractor?.getTrackFormat(trackIndex)
val mime = format?.getString(MediaFormat.KEY_MIME)
mediaCodec = MediaCodec.createDecoderByType(mime!!).apply {
configure(format, surface, null, 0)
setOnFrameRenderedListener({ codec, presentationTimeUs, nanoTime ->
Log.i(TAG, "First video frame rendered") // This fires successfully
}, null)
start()
}
}
fun playGo() {
// Video decoding thread
videoThread = Thread {
val bufferInfo = MediaCodec.BufferInfo()
while (isPlaying) {
val outputIndex = mediaCodec?.dequeueOutputBuffer(bufferInfo, 10000) ?: -1
if (outputIndex >= 0) {
mediaCodec?.releaseOutputBuffer(outputIndex, true) // Render to surface
}
}
}
videoThread?.start()
}
}
< /code>
4. Unity Shader (ar_video_shader.shader) < /h3>
Shader "Custom/VideoExternalOES"
{
Properties
{
_MainTex ("External Video Texture", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType"="Opaque" }
Pass
{
GLSLPROGRAM
#extension GL_OES_EGL_image_external : require
precision mediump float;
uniform samplerExternalOES _MainTex;
varying vec2 uv;
void main()
{
gl_FragColor = texture2D(_MainTex, uv);
}
ENDGLSL
}
}
}
< /code>
Что я попробовал < /h2>
Проверенный MediaCodec представляет собой декодирующие кадры (кадр визуализации) < /li>
Подтвержденный аудиопровод работает отлично < /li>
Certed Opengl-Creation (Texture Id является верным и не верно. /> Проверенный surfacetexture.updateTexImage () называется регулярно < /li>
Подтверждено, что материал использует внешний шейдер EES < /li>
Эксплуатация журнала - нет ошибок < /li>
< /ol>
< /h2>
< /ol>
< /h2>
< /ol>
Проблема между поверхностным рендерингом MediaCodec и рендерингом Unity? Текстура? Любое понимание того, что может привести к этому отключению, будет очень оценено. /> MediaCodec с выходом поверхности < /li>
< /ul>
Заранее! < /p>
Подробнее здесь: https://stackoverflow.com/questions/796 ... ders-black
Nity Android Native Video Player - Audio Works, но видео Render Black ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Пожалуйста, объясните этот очень запутанный путь String String Works Works
Anonymous » » в форуме JAVA - 0 Ответы
- 8 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Пожалуйста, объясните этот очень запутанный путь String String Works Works
Anonymous » » в форуме JAVA - 0 Ответы
- 10 Просмотры
-
Последнее сообщение Anonymous
-