Почему время ожидания кадра Surface истекло при кодировании с включенным proguard?

Я скопировал код из ExtractDecodeEditEncodeMuxTest.java в свое приложение для перекодирования видео, наиболее значительным изменением является переименование класса в VideoTranscoder и удаление extends AndroidTestCase, так как я собираюсь запускать его отдельно от какой-либо активности. Все работает нормально, пока я не скомпилирую сборку релиза с помощью 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!

Согласно таким ответам, как этот или что мне нужно создать отдельные потоки и все такое, но на самом деле я использую исходный код, уже создающий эти потоки. Когда я меняю настройку выпуска gradle на minifyEnabled false, чтобы отключить proguard, все снова работает.

Так что же proguard делает с потоками, которые портят работу кодировщика/декодера? Или, может быть, он удаляет какой-то класс, косвенно используемый MediaCodec? Есть ли что-то, что мне нужно добавить в настройки proguard, чтобы заставить его работать?


person Grzegorz Adam Hankiewicz    schedule 05.08.2016    source источник


Ответы (2)


После добавления -dontoptimize в файл proguard все снова работает. Очевидно, что это не идеальное решение, но кажется, что это единственное, что можно сделать, поскольку подозреваемым здесь является proguard, оптимизирующий некоторые циклов в потоках кодирования/декодирования. В моем конкретном случае я мог бы избежать использования -dontoptimize и вместо этого использовать следующую строку, которая не отключает все оптимизации:

-optimizations !code/removal/advanced,!method/inlining/short,!method/inlining/unique,!method/removal/*,!method/marking/*
person Grzegorz Adam Hankiewicz    schedule 08.08.2016

Удалите th.join() из функции runTest в классе TestWrapper. Это сработало для меня. На самом деле th.join() блокирует основной поток и, следовательно, создает проблемы для Surface. Комментирование этой строки работало нормально.

person Mohan    schedule 22.06.2021