2012-03-15 7 views
2

私はブルースクリーンに記録されたビデオを持っています。透明ビデオiPhone

iOSデバイスで透明にする方法はありますか?私はピクセルシェーダとOpenGLでそれを行うことができますが、私はビデオフレームをデコード/ OpenGLテクスチャをアップロードし、ピクセルシェーダでフラグメントを除去するプロセスが遅すぎると恐れています。

提案がありますか?

+1

クローズ有権者が投票を説明してもらえますか? –

+0

この質問を閉じる投票は、次の2つの重複が原因である可能性があります。http://stackoverflow.com/questions/4796626/iphone-display-a-semi-transparent-video-on-top-of-a-uiview、 http://stackoverflow.com/questions/1401517/iphone-sdk-how-to-play-a-video-with-transparencyしかし重複は古いです(2年と1年)ので、ここに新しいものがあるかもしれません。 –

+0

あなたは必要以上に多くの作業をしようとしています。既存のデスクトップビデオパッケージでビデオを処理して、ブルースクリーンを削除し、アルファチャンネル付きのビデオを作成します。次に、アルファチャンネル付きのビデオには2つのオプションがあります。アルファチャンネルをサポートするライブラリ(AVAnimator、Bink、他にもあります)を使用するか、この質問に記載されているように2チャンネルh.264をエンコードすることができます。http://stackoverflow.com/questions/10815805/mpeg-4- and-alpha-transparency-the-ongoing-saga#答え - 17072503 – MoDJ

答えて

2

ビデオをレンダリングし、青色のピクセルを透明に設定する場合は、これを行う効率的な唯一の方法はOpenGLです。これはiOSデバイスでは簡単に可能で、ビデオデコードはハードウェアで処理され、glTexSubImage2Dを使用してOpenGLにビデオフレームを転送するいくつかのプロジェクトがあります。

+0

これは唯一の方法ですが、ソースピクセルを取得する方法がわかりません。 –

+0

2010年のWWDCサンプルコードを確認するには、GLVideoFrameというサンプルプロジェクトがあります。それ以外の場合は、SquareCamサンプルプロジェクトをチェックしてください。ほとんどの作業を行います。基本的に 'CVPixelBufferGetBaseAddress'を使ってピクセルデータへのポインタを取得するだけです。 – Tark

3

ビデオでクロマキーイングをしたいように思えます。私はちょうど私のGPUImageフレームワークにこれを行う機能を追加しました。これは、GPUベースの処理を使用して、CPUバインドされたフィルタよりも何倍も高速にこれらの操作を実行することを示しています。

フレームワークのSimpleVideoFileFilterの例では、ムービーを読み込んでフィルタリングし、ディスクにエンコードする方法を示しています。クロマキー合成を行うために、これを変更すると、次のようになります:

NSURL *sampleURL = [[NSBundle mainBundle] URLForResource:@"sample" withExtension:@"m4v"]; 
movieFile = [[GPUImageMovie alloc] initWithURL:sampleURL]; 

filter = [[GPUImageChromaKeyBlendFilter alloc] init]; 
[filter setColorToReplaceRed:0.0 green:0.0 blue:1.0]; 
[filter setThresholdSensitivity:0.4]; 

[movieFile addTarget:filter]; 

UIImage *inputImage = [UIImage imageNamed:@"background.jpg"]; 
sourcePicture = [[GPUImagePicture alloc] initWithImage:inputImage smoothlyScaleOutput:YES]; 
[sourcePicture addTarget:filter]; 

NSString *pathToMovie = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Movie.m4v"]; 
NSURL *movieURL = [NSURL fileURLWithPath:pathToMovie]; 
movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(480.0, 640.0)]; 
[filter addTarget:movieWriter]; 

[movieWriter startRecording]; 
[movieFile startProcessing]; 

[movieWriter setCompletionBlock:^{ 
    [filter removeTarget:movieWriter]; 
    [movieWriter finishRecording]; 
}]; 

上記のコードは、感度で純粋な青のOFFキーに設定されているクロマキーフィルタにそれを養う、sample.m4vと呼ばれるアプリケーションのリソースからのムービーをロードしますクロマキーイングに使用する背景画像を添付してから、すべての画像をエンコーダMovie.m4vをアプリケーションの/Documentsディレクトリに書き込むエンコーダに送ります。

必要に応じて入力画像を別のムービーまたは他のソースに置き換えたり、必要に応じて青の色合いを調整したりすることができます。このプロセスは、iOSデバイスのカメラからのライブビデオにも適用することができ、必要に応じて結果を画面に表示することができます。

iOS 5.0を実行しているiPhone 4では、クロマキーリングは640x480フレームのビデオで1.8ms(500+ FPS)、720pフレーム(15FPS)で65msかかります。新しいA5ベースのデバイスは、これらの操作よりも6〜10倍高速であるため、汗をかくことなく1080pのビデオを処理できます。私はフレームのアップロードと検索の両方にiOS 5.0の高速テクスチャキャッシュを使用しています。これにより、4.xを超えるそのOSバージョンでの処理が加速されます。

私がこれについて覚えていることは、私が映画のエンコーディングで音声を録音することをかなり手に入れていないことですが、私はその時点で作業しています。

+0

こんにちはブラッド - 素晴らしい図書館!オーディオを機能させることができましたか?ありがとう! – ewindsor

+0

@windsor - はい、ほとんどの場合です。ライブビデオでは、ビデオの終わり付近で数秒間オーディオがカットされることがありますが、事前録画されたビデオの場合はうまく動作します。 –

+0

素晴らしい!ありがとう。このコードを入れて試してみます:) – ewindsor

関連する問題