人造人。在协程上下文中使用 AudioTrack.write 方法会使应用崩溃

Android. Using the AudioTrack.write method in coroutine context makes app crash

提问人:Stefan Olteanu 提问时间:11/9/2023 更新时间:11/9/2023 访问量:43

问:

我有下面的代码行。我正在尝试播放流,并且正在使用 AudioTrack。

  CoroutineScope(Dispatchers.IO).launch {
                    withContext(Dispatchers.IO) {
                        try {
                            decodedFrames.forEach {frame ->
                                audioTrack?.write(frame,0,frame.size)
                            }
                        } catch (e : Exception) {
                            Log.e("ERROR",e.message!!)
                        }
                    }
                }

当我在没有协程上下文的情况下使用写入方法时,声音很好,但应用程序变得滞后。如果我使用带有WRITE_NON_BLOCKING的 write 方法,那么声音会被中断,但应用程序不再滞后。当我在协程上下文中使用 write 方法时,如上所述,声音很好,应用程序不再滞后,但几秒钟或几分钟后,应用程序崩溃并出现以下错误。下面的错误是一个非常长的错误,表明有问题的行是那行audiotrack?.write

releaseBuffer: mUnreleased out of range, !(stepCount:952 <= mUnreleased:0 <= mFrameCount:3848), BufferSizeInFrames:3848 2023-11-09 07:52:54.652 18535-18615 A runtime.cc:691] Runtime aborting... runtime.cc:691] Dumping all threads without mutator lock held runtime.cc:691] All threads: runtime.cc:691] DALVIK THREADS (26): runtime.cc:691] "main" prio=10 tid=1 Native runtime.cc:691] | group="" sCount=1 ucsCount=0 flags=1 obj=0x73500d40 self=0xb40000781c02c7b0 runtime.cc:691] | sysTid=18535 nice=-10 cgrp=top-app sched=0/0 handle=0x79ce39d500 runtime.cc:691] | state=S schedstat=( 10320252622 172287193 3307 ) utm=972 stm=59 core=5 HZ=100 runtime.cc:691] | stack=0x7fe496a000-0x7fe496c000 stackSize=8188KB runtime.cc:691] | held mutexes= runtime.cc:691] native: #00 pc 0004e1dc /apex/com.android.runtime/lib64/bionic/libc.so (syscall+28) (BuildId: 7464f932fe1115e080f728808bf0ade7) runtime.cc:691] native: #01 pc 0023746c /apex/com.android.art/lib64/libart.so (art::ConditionVariable::WaitHoldingLocks+140) (BuildId: 4cfdaa9e5146c43e20ae36ee1caf9b7f) runtime.cc:691] native: #02 pc 004676ac /apex/com.android.art/lib64/libart.so (artQuickGenericJniEndTrampoline+1008) (BuildId: 4cfdaa9e5146c43e20ae36ee1caf9b7f) runtime.cc:691] native: #03 pc 0034aa40 /apex/com.android.art/lib64/libart.so (art_quick_generic_jni_trampoline+160) (BuildId: 4cfdaa9e5146c43e20ae36ee1caf9b7f) runtime.cc:691] native: #04 pc 00333fa4 /apex/com.android.art/lib64/libart.so (art_quick_invoke_stub+612) (BuildId: 4cfdaa9e5146c43e20ae36ee1caf9b7f) runtime.cc:691] native: #05 pc 00511078 /apex/com.android.art/lib64/libart.so (bool art::interpreter::DoCall<false>+1976) (BuildId: 4cfdaa9e5146c43e20ae36ee1caf9b7f) runtime.cc:691] native: #06 pc 0049e538 /apex/com.android.art/lib64/libart.so (void art::interpreter::ExecuteSwitchImplCpp<false>+2040) (BuildId: 4cfdaa9e5146c43e20ae36ee1caf9b7f) runtime.cc:691] native: #07 pc 0034d1d8 /apex/com.android.art/lib64/libart.so (ExecuteSwitchImplAsm+8) (BuildId: 4cfdaa9e5146c43e20ae36ee1caf9b7f) runtime.cc:691] native: #08 pc 001fe800 /system/framework/framework.jar (android.os.MessageQueue.next) runtime.cc:691] native: #09 pc 00378bb0 /apex/com.android.art/lib64/libart.so (art::interpreter::Execute +232) (BuildId: 4cfdaa9e5146c43e20ae36ee1caf9b7f) runtime.cc:691] native: #10 pc 00511d44 /apex/com.android.art/lib64/libart.so (bool art::interpreter::DoCall<false>+5252) (BuildId: 4cfdaa9e5146c43e20ae36ee1caf9b7f) runtime.cc:691] native: #11 pc 0049e100 /apex/com.android.art/lib64/libart.so (void art::interpreter::ExecuteSwitchImplCpp<false>+960) (BuildId: 4cfdaa9e5146c43e20ae36ee1caf9b7f) runtime.cc:691] native: #12 pc 0034d1d8 /apex/com.android.art/lib64/libart.so (ExecuteSwitchImplAsm+8) (BuildId: 4cfdaa9e5146c43e20ae36ee1caf9b7f) runtime.cc:691] native: #13 pc 001fd700 /system/framework/framework.jar (android.os.Looper.loopOnce) runtime.cc:691] native: #14 pc 00378bb0 /apex/com.android.art/lib64/libart.so (art::interpreter::Execute +232) (BuildId: 4cfdaa9e5146c43e20ae36ee1caf9b7f) runtime.cc:691] native: #15 pc 00511d44 /apex/com.android.art/lib64/libart.so (bool art::interpreter::DoCall<false>+5252) (BuildId: 4cfdaa9e5146c43e20ae36ee1caf9b7f) runtime.cc:691] native: #16 pc 0049e470 /apex/com.android.art/lib64/libart.so (void art::interpreter::ExecuteSwitchImplCpp<false>+1840) (BuildId: 4cfdaa9e5146c43e20ae36ee1caf9b7f) runtime.cc:691] native: #17 pc 0034d1d8 /apex/com.android.art/lib64/libart.so (ExecuteSwitchImplAsm+8) (BuildId: 4cfdaa9e5146c43e20ae36ee1caf9b7f) runtime.cc:691] native: #18 pc 001fdf24 /system/framework/framework.jar (android.os.Looper.loop) runtime.cc:691] native: #19 pc 00378bb0 /apex/com.android.art/lib64/libart.so (art::interpreter::Execute +232) (BuildId: 4cfdaa9e5146c43e20ae36ee1caf9b7f) runtime.cc:691] native: #20 pc 00511d44 /apex/com.android.art/lib64/libart.so (bool art::interpreter::DoCall<false>+5252) (BuildId: 4cfdaa9e5146c43e20ae36ee1caf9b7f)

我尝试了上述所有解决方案,但没有任何效果。

Android Kotlin 协程 音轨

评论

0赞 Michael 11/9/2023
是什么类型的?这块代码什么时候会被执行(什么事件触发了它的执行)?decodedFrames
0赞 Stefan Olteanu 11/9/2023
decodedFrames 是 ShortArrays 的 ArrayList,每当应用在套接字上接收帧时,就会执行代码
0赞 Michael 11/9/2023
我同意(现已删除)关于您的代码问题是什么的答案。我还认为提出的解决方案看起来很合理,只是它似乎没有考虑返回的值(即实际写入的空头数量)。write
0赞 JanItor 11/9/2023
我同意结果,@StefanOlteanu你能检查一下返回的值,如果是,请记录下来吗?特别是,崩溃前是否返回负值?writewrite< 0write

答: 暂无答案