Сбой AVAssetWriter, когда приложение входит в фоновый режим во время рендеринга - PullRequest
5 голосов
/ 03 октября 2011

В моем приложении я рендерину видео, сгенерированное из изображений, которые я извлекаю из фотографий пользователей.Я установил AVAssetwriter с AVAssetwriterInput имеет AVAssetWriterInputPixelBufferAdaptor.Я могу преобразовать объекты ALAsset, которые я извлекаю из библиотеки пользователей, в CVPixelBuffers и добавить их в видео, которое затем сохраняется как mp4.Добавление всех изображений к видео выполняется в фоновом потоке, который отправляет уведомление в основной поток каждый кадр, поэтому интерфейс может быть обновлен.Все это хорошо работает, и я получаю полезный файл Movie из приложения.

Моя проблема сейчас заключается в том, что, когда пользователь входит в другое приложение, после повторной активации статус ALAssetWriter меняется на «сбой», и я не могу добавить больше изображений в файл фильма.Сначала я подумал, что, возможно, придется завершить текущую сессию на устройстве записи и заново открыть новую, как только приложение снова станет активным, но, похоже, это не помогает.

Мне было просто интересно, каков будет общий подход, когда я хочу, чтобы пользователь входил в другие приложения.Лучшее решение было бы, если бы рендеринг мог продолжаться в фоновом режиме.Я полагаю, мне нужен фоновый поток из UIApplication.Но сейчас я был бы рад, если бы рендеринг мог просто продолжиться после возобновления работы моего приложения.

Я не буду сейчас публиковать какой-либо код, потому что это действительно много, и мой вопрос, возможно, является концептуальным.Если вам нужно увидеть код, я выложу его.

Редактировать 1: протестировано на iOS 4.3 и iOS 5. Я видел фоновый рендеринг в других приложениях, таких как iTimelapse, но я не уверен, какие платформы они используют.

Edit2: Iтеперь есть информация члена яблочного devforum, что AVAssetWriter не работает в фоновом режиме.Так есть ли еще какие-нибудь фреймворки, способные рендерить быстрые видеоролики?

Ответы [ 2 ]

5 голосов
/ 17 октября 2011

Оказывается, что AVAssetWriter просто не выдержит приостановки приложения. Вы можете добавить дополнительные 10 минут времени рендеринга, запросив фоновое время, но после этого сбой AssetWriter. То же самое происходит, если вы используете определенные услуги на телефоне. Например, выполнение или ответ на вызов также приведет к сбою AVAssetWriter.

1 голос
/ 10 октября 2011

Если есть какие-либо вызовы OpenGL, сделанные, когда ваше приложение находится в фоновом режиме, то это объяснило бы это поведение, выглядит вполне вероятным. Из Руководства по программированию OpenGL ES

Фоновые приложения могут не выполнять команды на графическом оборудовании

Приложение OpenGL ES завершается, если оно пытается выполнить Команды OpenGL ES на графическом оборудовании. Это относится не только к звонки, сделанные в OpenGL ES, когда ваше приложение находится в фоновом режиме, но также относится к ранее представленным командам, которые еще не завершено. Основная причина предотвращения фоновых приложений от обработка команд OpenGL ES заключается в создании графического процессора полностью доступны для переднего приложения. Передний Приложение всегда должно представлять большой опыт для пользователя. Разрешение фоновым приложениям перегружать графический процессор может предотвратить это. Ваша заявка должна гарантировать, что все ранее представленные команды были завершены до перехода в фон.

Документы продолжают перечислять набор рекомендаций для обратных вызовов делегата приложения background background / foreground. Я думаю, что найти способ сделать рендеринг без графического оборудования было бы сложно, также фреймворки, которые позволяют кодирование mp4 (например, ffMpeg ), в основном GPL / LGPL, поэтому вы должны быть осторожны, если имеете дело с коммерческий продукт (LGPL означает, что вы можете ссылаться на библиотеку динамически, а не статически, что бесполезно для iOS), поскольку лицензия будет распространяться на ваш код.

...