[코틀린] 고도엔진에서 카메라 플러그인 쓸 수 있도록 코드 수정중..실패

 일단 그 전에 만들어둔

고도용 안드로이드 플러그인에

카메라 x기능을 추가해주어야한다.

가물가물해지기 전에 해놓아야겠다.


카메라 x 종속성 부여

def camerax_version = "1.4.1"
implementation "androidx.camera:camera-core:${camerax_version}"
implementation "androidx.camera:camera-camera2:${camerax_version}"
implementation "androidx.camera:camera-lifecycle:${camerax_version}"
implementation "androidx.camera:camera-video:${camerax_version}"
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation "androidx.camera:camera-view:${camerax_version}"
implementation "androidx.camera:camera-extensions:${camerax_version}"

안드로이드 매니페스트에 권한 작성



음 보니까 안드로이드 스튜디오의

액티비티 클래스에 저런 권한 함수가 있어서 그대로

오버라이드해서 사용하는데

이걸 고도엔진에서는 액티비티 클래스가 없으니까 만들어줘야하는 것 같다.

보니까 고도 액티비티가 있는데 이게 대응되는 것?같은데

https://github.com/godotengine/godot/blob/master/platform/android/java/lib/src/org/godotengine/godot/GodotActivity.kt



아 이미 구현되어있네 이거 가져다 쓰면되겠다.라고 생각했는데

이건 목적이 다르넹

나는 안드로이드 네이티브 라이브러리 기능을 고도엔진에서 사용할 수 있게 플러그인으로 만드는 것이고

저거는 게임엔진으로 만든 게임을 안드로이드 네이티브 환경에서 보여준다라고 생각

아예 다르다 안드로이드 스튜디오로 빌드하는거니까...

난 지금 고도엔진으로 빌드할건데

근데어느쪽이든 가능하긴한데

굳이 고도로 만든 겜을 네이티브 안드로이드로 빌드하기 위해 저걸 써서한다? 왜지?

성능이나 마켓준수가 쉽다는데...흠

근데 그럼 고도엔진 프로젝트를 안드로이드 스튜디오에 맞게 또 찾아보고 해야하는데...

이건 좀..근데 코드자체는 codelab그대로 옮기면되니까 이건 편한데...


아 일다 나는

플러그인->고도엔진->빌드를 택해서 진행하기로..

다른방법도 있다는건 알겠다.


아 결국 GodotPlugin라이브러리에 다 이미 구현되어있다.


이거 구조도 비슷해서 앞에 Main붙어있는데 그대로 옮기고 고쳐줬다.


나머지도 해봄


음 빌드도됨..

함수를 불러올려면 위에 use고도해야하나?;

꼭있어야하넹.



오류나서 앱중지가 되고 있었는데 원인을 찾았다.

/* val imageAnalyzer = ImageAnalysis.Builder()
.build()
.also {
it.setAnalyzer(cameraExecutor, ImageAnalysis.Analyzer { image ->
val buffer = image.planes[0].buffer
val data = ByteArray(buffer.remaining())
buffer.get(data)
latestFrame = data
image.close()
})
}*/

이 실시간 정보 얻는 부분이 뭔가 잘못된 것 같다. 

이부분은 ai가 짜준건데 -ㅅ-;;

저걸 주석하니까 내가원하는 버튼 눌렀을 때 권한요구하는 ui가 등장한당.



아 이게 되어야 뭘하는데 매개변수로 넣으면 앱중지되고 어떤 오류인지 파악도 안된다. ㅠㅠ


혹시 버전차이 때문인가 싶어서 버전을 바꿔보려고한당!!

고도엔진 4.3.0인데

4.2.2 고도엔진에 맞는버전으로 다운그레이드 진행

4.2.2로 다운그레이드 했는데도 똑같다.  

고도문서를 찾아봐야겠다. 왜 호환이 안되지

camerax를못쓰나?;


일단 

고도 안드로이드 플러그인 카메라도 뜯어봤는데..

이거 비윤리적인 짓같은데 -ㅅ-;;

어쨌든

자바 디컴파일러라는 프로그램으로 봤는데 이 분은 

기본 카메라로 한 것 같다 라이브러리 같은 걸 안쓰고..



그래서 

안드로이드 개발자 문서를 다시보러감.

인텐트라는게 있넹... 라이브러리 통합안해도된다고? ㅇㅎ


아니야 좀더 봅시다..



원인을 알게됐는데...

안드로이드 스튜디오로 오류를 파악할 수 있었다.


저 라이프사이클 클래스가 발견되지 않는다는데 -ㅅ-??

https://docs.gradle.org/current/userguide/custom_plugins.html#sec:packaging_a_plugin

플러그인 관련 문서가 있다.

aar파일을 열고 

아래 명령어를 git bash로 치니

jdeps classes.jar

classes.jar에 포함된 종속성 클래스들을

볼 수 있는데

not found가 뜨고 있었다.

아..

플러그인은 종속성이 포함이 안된것;; 쉣;;


다른 분 플러그인도 까서봐야겠다.

엥? 여기도안나오는데 -ㅅ-;;
아 이거 잘못된 방법임 ;;


아 삽질 괜히함..
가이드 코드 보니까 설명이있었따 -ㅅ-;;
보면 그 종속성을 고도엔진쪽에서 선언을 해야되는거였음;; 에효...


이 부분이 있었는데 ㅠㅠ

와 드디어 고도용 플러그인 종속성을 읽는 것 까지 알게됐넹.
함수가 없다가 생겼음..
나는 aar이면 종속성이 포함안된줄알았는데
고도엔진에서 읽지 못하는거였구낭.

이미지 텍스쳐를 직접 빨간색으로 만들어서 화면에 뿌리는것까지 해봄.

일단 진행한 정보 끝에 도달한 것은
카메라 실시간 스트립정보를
고도엔진에서 계속 전달받아서 출력하는것은 성능이 너무 구림.
앱이 계쏙켜놓으면 얼마 후 꺼짐.
그리고 
카메라x의 스트림 버퍼가 yuv형태인 것 같은데 이걸
rgb로 바꾼 뒤 바이트형태로 가져와서 숫자까지 확인했는데
이게 고도엔진 packedArray에 넣으면 변환이 안되는 것 같음.

이렇게 이미지텍스쳐에 넣을 수 있게 image를 만들어야하는데 안만들어짐
사이즈 크기가 다르다고 나오는데..
아니 원래 사이즈 전달받아서 하는건데 왜 다르지 ;;


private fun yuv420ToRgb(image: ImageProxy): ByteArray {
val planes = image.planes
val yBuffer = planes[0].buffer
val uBuffer = planes[1].buffer
val vBuffer = planes[2].buffer

val ySize = yBuffer.remaining()
val uSize = uBuffer.remaining()
val vSize = vBuffer.remaining()

val width = image.width
val height = image.height

val rgbBytes = ByteArray(width * height * 3)

val yStride = planes[0].rowStride
val uStride = planes[1].rowStride
val vStride = planes[2].rowStride

var rgbIndex = 0
for (y in 0 until height) {
for (x in 0 until width) {
val yIndex = y * yStride + x
val uvIndex = (y / 2) * uStride + (x / 2)

val Y = yBuffer.get(yIndex).toInt() and 0xff
val U = uBuffer.get(uvIndex).toInt() and 0xff
val V = vBuffer.get(uvIndex).toInt() and 0xff

// YUV to RGB conversion
val R = Y + 1.402 * (V - 128)
val G = Y - 0.344 * (U - 128) - 0.714 * (V - 128)
val B = Y + 1.772 * (U - 128)

rgbBytes[rgbIndex++] = R.coerceIn(0.0, 255.0).toInt().toByte()
rgbBytes[rgbIndex++] = G.coerceIn(0.0, 255.0).toInt().toByte()
rgbBytes[rgbIndex++] = B.coerceIn(0.0, 255.0).toInt().toByte()
}
}

return rgbBytes
}


yv420 변환 코드 ai가 짜줌.



아 혹시 몰라 카메라x 문서를 가봤다.

근데 함수가 있었다 -ㅅ-;;

포맷을 지정해서 보낼 수가 있었던 것...
보내니까
내가 생각한대로 고도엔진 렌더링으로 카메라 스트림버퍼가 그려지고 있?음..

근데 2초 후  꺼짐
그리고 먹통됨 ㅋㅋ


메시지는..


ai한테 물어보니
과부하가 걸린 것 같당...
아무래도 거의 update 실시간급으로 고도엔진 c++언어도아니고 
느리긴 할거다..
근데 이걸 좀 속도 줄여서 사용하면 괜찮을라나?

일단 쉬고 속도한번 줄여서 진행해봐야겠다.


음... 30프레임으로 바꾸니까
val imageAnalyzer = ImageAnalysis.Builder()
.setOutputImageFormat(ImageAnalysis.OUTPUT_IMAGE_FORMAT_RGBA_8888)
.setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
.build()
.also {
it.setAnalyzer(cameraExecutor, object : ImageAnalysis.Analyzer {
private var lastEmitTime = 0L
private val EMIT_INTERVAL = 300 // 밀리초 단위

override fun analyze(image: ImageProxy) {
val currentTime = System.currentTimeMillis()
if (currentTime - lastEmitTime >= EMIT_INTERVAL) {
val width = image.width
val height = image.height
val buffer = image.planes[0].buffer
val data = ByteArray(buffer.remaining())
buffer.get(data)
emitSignal("updateData", data, width, height)
lastEmitTime = currentTime
}
image.close()
}
})
}
카메라가 끊기면서 결국 한 20초?쯤에 또 먹통되는데...
https://youtu.be/J4fD2DpdZFY


아..


렌더링쪽 설정으로 메모리 공간 크기랑 그런것들을 늘려주니까 꽤 오래간다
5분 넘게 유지되는데
결국 꺼진다.
똑같은 오류다. 이오류만 해결하면 좋겠는데..

그리고 실시간 스트림정보를 가져왔는데 카메라 화면이 회전되어있다.

이것도 처리를 해주어야함;;
원래 카메라가 정방향 설치가 아니라 회전된 상태로 설치된단다...;;
이것도 처음 알았다.;;


근데 결국 용량늘려도 결국 꺼진다는건 뭔가 잘못된건데 ㅠㅠ
파이프라인이나 vulkan쪽 지식이 거의 없어서 ..허허..어떻게 해야할지 난감하다.

ㅠㅠ
아하..원인이..
렌더링 쪽인줄 알았는데..
이건 문제없고
애초에 analyzer로 고도엔진에 시그널로 정보를 계속보내는 부분이 문제인 것 같다. 
이부분을 안받아도 꺼지고 받아도 꺼진다 -ㅅ-;;
하..
너무 어려운걸 도전했당 ㅋㅋ
그냥 고도엔진을 임베드하고 안드로이드 스튜디오로 빌드하는게 나을 것 같다..

댓글

이 블로그의 인기 게시물

[코틀린] 고도엔진 안드로이드 플러그인 최종정리

godot용 android plugin 제작

고도엔진을 안드로이드애플리케이션에 임베드하는거 공부하기