我已将ExtractDecodeEditEncodeMuxTest.java中的代码复制到我的应用中以转码视频,最重要的更改是将该类重命名为var args = {status:"enabled", updated:"yes" };
if(d){
args.target = 'div';
} else {
args.main = 'body';
}
并移除VideoTranscoder
,因为我要去将它从任何活动中分离出去。一切正常,直到我使用proguard编译发布版本,然后它在运行时失败:
extends AndroidTestCase
根据像this或that这样的答案,我需要创建单独的线程等等,但实际上我正在使用已创建这些线程的原始代码。当我将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设置才能使其正常工作吗?
答案 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 带来了问题。评论该行工作正常。