Я пытаюсь добавить функциональность для извлечения, декодирования, редактирования, кодирования и мультиплексирования видео на Android. Поэтому я нашел очень полезную реализацию, которая является частью Android CTS ExtractDecodeEditEncodeMuxTest. К сожалению, код работает только в том случае, если он выполняется как часть тестового файла. Я попытался выполнить его из обычной активности и получить:
E/ExtractDecodeEditEncodeMuxTest (18781): java.lang.IllegalStateException: Не удалось остановить мультиплексор
W/System.err(18781): java.lang.RuntimeException: Ожидаемый срок службы фреймов W/System.err(18781): at... OutputSurface.awaitNewImage(OutputSurface.java:216)
Любые идеи, почему выходная поверхность не получает фреймы?
UPDATE: Вот файлы журнала для рабочего тестового примера и неработоспособной реализации. Код для обоих точно такой же. Единственное различие заключается в том, что рабочий является AndroidTestCase, а другой работает в приложении в IntentService.
Кажется, что все это останавливает извлечение и декодирование после примерно 6 кадров. Любые идеи?
Благодаря fadden, я смог решить эту проблему. Теперь я использую услугу намерения и запускаю поток без петлителя, который отлично работает.
Для запуска кода в службе Android это означает, что поток обертки должен запускаться из пользовательского потока. Запуск потока в потоке, вероятно, не самое лучшее решение, но оно фактически решает проблему.
Вероятно, вам нужно запустить его в отдельном потоке
public static void runTest(ExtractDecodeEditEncodeMuxTest test) throws Throwable {
test.setOutputFile();
TestWrapper wrapper = new TestWrapper(test);
Thread th = new Thread(wrapper, "codec test");
th.start();
th.join();
if (wrapper.mThrowable != null) {
throw wrapper.mThrowable;
}
}