2

画像から長いビデオを作成するにはどうすればよいですか? かなり時間がかかり、ユーザーはそれを待つのに飽きてしまうので、バックグラウンドでムービーを生成し、終了後にユーザーに通知することを考えています。

私のアプリの構造は次のようなものです。シミュレートされたムービーを含む 1 つのコントローラーを保持する UINavigationController があり、いくつかの画像は CoreAnimation で移動します。次に、ムービーを生成する新しいコントローラーをプッシュします。コントローラー2で、コントローラー1にリクエストを送信して、ムービーに書き込むフレームを含む画像を送信します(CoreGraphicsで画像を生成します)。これは多くの時間がかかり、継続的であるため、ほとんどすべてをブロックしています。

バックグラウンド タスクについて読んだところ、唯一の解決策のように思えますが、それらはあまり長くは続かず、途中で停止する可能性があり、30 秒のビデオを生成するのに約 6 分かかります。また、アプリが VoIP またはその他のサポートされているタイプではないため、バックグラウンドで実行されていると宣言することもできません。

アイデアをありがとう。

4

1 に答える 1

4

私の理解では、アプリは限られた時間しか実行されませんが、ビデオのサイズによってはそれで十分な場合があります。実際、私はアニメーション オーサリング アプリidAnimate でこれを正確に行います。指で触れるだけで、iPad でアニメーションを作成できます。私の知る限り、アプリはタスクを完了するのに約 10 分かかりますが、これで十分です。アプリに追加の時間が必要な場合は、ビデオ レンダリング アルゴリズムを最適化する方法、ビデオの品質を下げる方法などを検討することをお勧めします。

とにかく、AVAssetWriter を使用してビデオを生成すると仮定して、これを行う方法のコードを少し示します。タスクの有効期限ハンドラー):

UIApplication *app = [UIApplication sharedApplication];

_backgroundRenderingID = [app beginBackgroundTaskWithExpirationHandler:^{
    [app endBackgroundTask:_backgroundRenderingID];
    _backgroundRenderingID = UIBackgroundTaskInvalid;
}];

その後、ビデオのレンダリングを開始できます。

videoWriter = [[AVAssetWriter alloc] initWithURL:
               [NSURL fileURLWithPath:self.moviePath] fileType:AVFileTypeMPEG4
                                           error:&error];
NSParameterAssert(videoWriter);
...

そして、完了したら、バックグラウンドで判読可能なタスクが完了したことを OS に知らせてください。

 [[UIApplication sharedApplication] endBackgroundTask:_backgroundRenderingID];

お役に立てば幸いです。

于 2013-04-23T09:01:04.113 に答える