为什么 "Surface frame wait timed out" 启用混淆编码?
Why does "Surface frame wait timed out" encoding with proguard turned on?
我已将代码从 ExtractDecodeEditEncodeMuxTest.java 复制到我的应用程序中以便对视频进行转码,最重要的更改是将 class 重命名为 VideoTranscoder
并删除 extends AndroidTestCase
因为我要 运行 它与任何 activity 分离。一切正常,直到我使用 proguard 编译发布版本,然后它在 运行 时间失败:
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!
根据 this or that 之类的回答,我需要创建单独的线程等,但实际上我使用的是已经创建这些线程的原始代码。当我将 gradle 发布设置更改为 minifyEnabled false
以禁用 proguard 时,一切都会再次运行。
那么 proguard 对扰乱 encoder/decoder 的线程做了什么?或者它可能正在删除 MediaCodec
间接使用的一些 class?我需要在混淆器设置中添加什么才能使其正常工作吗?
将 -dontoptimize
添加到 proguard 文件后,一切恢复正常。显然这不是一个理想的解决方案,但似乎这是唯一可以做的事情,因为这里的嫌疑人是。在我的特殊情况下,我可以避免使用 -dontoptimize
并使用不会禁用所有优化的以下行:
-optimizations !code/removal/advanced,!method/inlining/short,!method/inlining/unique,!method/removal/*,!method/marking/*
从 TestWrapper Class 的 runTest 函数中删除 th.join()。它对我有用。
实际上 th.join() 阻塞了主线程,因此给 Surface 带来了问题。评论该行效果很好。
我已将代码从 ExtractDecodeEditEncodeMuxTest.java 复制到我的应用程序中以便对视频进行转码,最重要的更改是将 class 重命名为 VideoTranscoder
并删除 extends AndroidTestCase
因为我要 运行 它与任何 activity 分离。一切正常,直到我使用 proguard 编译发布版本,然后它在 运行 时间失败:
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!
根据 this or that 之类的回答,我需要创建单独的线程等,但实际上我使用的是已经创建这些线程的原始代码。当我将 gradle 发布设置更改为 minifyEnabled false
以禁用 proguard 时,一切都会再次运行。
那么 proguard 对扰乱 encoder/decoder 的线程做了什么?或者它可能正在删除 MediaCodec
间接使用的一些 class?我需要在混淆器设置中添加什么才能使其正常工作吗?
将 -dontoptimize
添加到 proguard 文件后,一切恢复正常。显然这不是一个理想的解决方案,但似乎这是唯一可以做的事情,因为这里的嫌疑人是-dontoptimize
并使用不会禁用所有优化的以下行:
-optimizations !code/removal/advanced,!method/inlining/short,!method/inlining/unique,!method/removal/*,!method/marking/*
从 TestWrapper Class 的 runTest 函数中删除 th.join()。它对我有用。 实际上 th.join() 阻塞了主线程,因此给 Surface 带来了问题。评论该行效果很好。