[英]How to use OpenGL with Timer
當我預先加載所有位圖(帶有測試數據)時,以下代碼有效
for (bitmap in bitmaps){
feedInOpenGL(bitmap)
}
但是當我嘗試使用計時器創建位圖時,
timer!!.scheduleAtFixedRate(object : TimerTask() {
override fun run() {
if (!recording) return
val bitmap = getNextBitmap()
feedInOpenGL(bitmap)
}
}, 0, frameDuration)
我再也無法停止 MediaMuxer。 當我試圖阻止它時,它得到
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.tolotra.screenrecordexample, PID: 31248
java.lang.IllegalStateException: Failed to stop the muxer
at android.media.MediaMuxer.nativeStop(Native Method)
at android.media.MediaMuxer.stop(MediaMuxer.java:454)
at com.tolotra.screen_recorder.VideoBuilder._cleanUp(VideoBuilder.kt:292)
at com.tolotra.screen_recorder.VideoBuilder.finish(VideoBuilder.kt:95)
at com.tolotra.screen_recorder.ScreenRecorder$stop$1.run(ScreenRecorder.kt:156)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6734)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
挖掘后,我在某處閱讀
OpenGL 始終在“當前”上下文上運行,並且該上下文將數據保存在線程本地存儲中。 這意味着它是特定於線程的。 因此,您始終需要了解從哪個線程調用 OpenGL 函數。
所以我懷疑問題在於我的計時器是問題,因為它每次都會創建一個新線程。
如果我的懷疑是真的,我如何使用計時器進行這項工作?
解決方案是在同一線程上運行 OpenGL/MediaMuxer/MediaEncoder setup/start/stop 和計時器回調。 這是使用單線程執行器實現的
tpe = Executors.newSingleThreadExecutor()
tpe?.submit(Runnable {
this.recording = true;
_startRecorderWorker();
})
在計時器中
timer!!.scheduleAtFixedRate(object : TimerTask() {
override fun run() {
if (!recording) return;
tpe?.submit(Runnable {
loop()
})
}
}, 0, frameDuration)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.