为什么打开proguard的“Surface frame wait timed out”编码?

时间:2016-08-05 10:43:57

标签: android multithreading video-processing mediacodec android-proguard

我已将ExtractDecodeEditEncodeMuxTest.java中的代码复制到我的应用中以转码视频,最重要的更改是将该类重命名为var args = {status:"enabled", updated:"yes" }; if(d){ args.target = 'div'; } else { args.main = 'body'; } 并移除VideoTranscoder,因为我要去将它从任何活动中分离出去。一切正常,直到我使用proguard编译发布版本,然后它在运行时失败:

extends AndroidTestCase

根据像thisthat这样的答案,我需要创建单独的线程等等,但实际上我正在使用已创建这些线程的原始代码。当我将gradle release设置更改为E/d: com.testapp.a.g.a.b.b(OutputSurface.java:270) E/d: com.testapp.a.g.a.d.a(VideoTranscoder.java:944) E/d: com.testapp.a.g.a.d.a(VideoTranscoder.java:6353) E/d: com.testapp.a.g.a.f.run(VideoTranscoder.java:162) E/d: java.lang.Thread.run(Thread.java:818) E/d: TestWrapper E/MediaCodecController: com.testapp.a.g.a.b.b(OutputSurface.java:270) E/MediaCodecController: com.testapp.a.g.a.d.a(VideoTranscoder.java:944) E/MediaCodecController: com.testapp.a.g.a.d.a(VideoTranscoder.java:6353) E/MediaCodecController: com.testapp.a.g.a.f.run(VideoTranscoder.java:162) E/MediaCodecController: java.lang.Thread.run(Thread.java:818) W/System.err: java.lang.RuntimeException: Surface frame wait timed out W/System.err: at com.testapp.a.g.a.b.b(OutputSurface.java:270) W/System.err: at com.testapp.a.g.a.d.a(VideoTranscoder.java:944) W/System.err: at com.testapp.a.g.a.d.a(VideoTranscoder.java:6353) W/System.err: at com.testapp.a.g.a.f.run(VideoTranscoder.java:162) W/System.err: at java.lang.Thread.run(Thread.java:818) E/CompressionController: Compressor reported error, not hashing! 以禁用proguard时,一切都会再次运行。

那么对于弄乱编码器/解码器的线程来说,什么是proguard呢?或者它可能正在移除minifyEnabled false间接使用的某些类?有什么东西需要添加到proguard设置才能使其正常工作吗?

2 个答案:

答案 0 :(得分:3)

-dontoptimize添加到proguard文件后,一切都有效。显然这不是一个理想的解决方案,但似乎这是唯一可以做到的事情,因为这里的嫌疑人是proguard optimising away some of the loops in the encoding/decoding threads。在我的特定情况下,我可以避免使用-dontoptimize,而是使用以下不禁用所有优化的行:

-optimizations !code/removal/advanced,!method/inlining/short,!method/inlining/unique,!method/removal/*,!method/marking/*

答案 1 :(得分:0)

从 TestWrapper 类中的 runTest 函数中删除 th.join()。它对我有用。 实际上 th.join() 阻塞了主线程,从而为 Surface 带来了问题。评论该行工作正常。