17

ビデオの再生中に、ビデオ ファイルにフィルタ (効果) を適用したいと考えています。

私は現在 @BradLarson の (素晴らしい)GPUImageフレームワークを使用しています。ここでの問題は、ビデオの再生中にフレームワークがオーディオの再生をサポートしていないことです。

したがって、2つのオプションがあります。

GPUImage1)コードに飛び込んでGPUImageMovie、オーディオ バッファも処理するように変更します。これには、オーディオ フレームとビデオ フレームの同期に関する知識が必要ですが、残念ながら私はそれを持っていません。オーディオを再生しようとするハックをいくつか見ましAVAudioPlayerたが、多くの同期の問題がありました。

2)CoreImageの代わりにフレームワークを使用しGPUImageます。

CoreImageそこで、ネイティブ iOSを使用CIFilterして仕事をする という 2 番目のオプションを検討したいと思います。

問題は、 でこれを行う方法の例が見つからなかったことです。ファイルからビデオにフィルタを適用するにCIFilterはどうすればよいですか?

AVAssetReaderビデオを読み取って各フレームを処理するには、 を使用する必要がありますか? もしそうなら、オーディオとビデオの同期という最初の問題に戻ります。
または、フィルター チェーンをビデオまたはプレビュー レイヤーに直接適用する方法はありますか?

どんな助けにも感謝します:)

4

3 に答える 3

3

使用しているGPUImageフレームワークのみを使用してください...これは、これまでビデオフィルターに最適なフレームワークです。フレームワークhttps://github.com/BradLarson/GPUImageのドキュメントに目を通し、ページを下にスクロールすると、利用可能なフィルターの詳細が表示されます...

このフィルターはビデオに適用され、ビデオを書き込むには GPUImageMovieWriter クラスを使用する必要があります...自動的にオーディオを処理します..

維持する必要はありません... GPUImageMovieWriter の shouldPassThroughAudio プロパティを使用すると、独自にオーディオを管理します。

このチュートリアルを参考にしてください http://www.sunsetlakesoftware.com/2012/02/12/introducing-gpuimage-framework

GPUImageフレームワークを使用してビデオをトリミングし、オーディオを編集後に削除せずに保存するコードを次に示します。

NSURL *videoUrl = [selectedAsset defaultRepresentation].url;

GPUImageMovie *movieUrl = [[GPUImageMovie alloc] initWithURL:videoUrl];

self.cropFilter = [[GPUImageCropFilter alloc] initWithCropRegion:videoArea];
movieUrl.runBenchmark = YES;
movieUrl.playAtActualSpeed = YES;
[movieUrl addTarget:self.cropFilter];

//Setting path for temporary storing the video in document directory
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *myPathDocs =  [documentsDirectory stringByAppendingPathComponent:
                         [NSString stringWithFormat:@"CroppedVideo-%d.mov",arc4random() % 1000]];
NSURL *movieURL = [NSURL fileURLWithPath:myPathDocs];

AVURLAsset *asset = [AVURLAsset URLAssetWithURL:videoUrl options:nil];
AVAssetTrack *videoAssetTrack = [[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
CGAffineTransform videoTransform = videoAssetTrack.preferredTransform;

movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(videoAssetTrack.naturalSize.width, videoAssetTrack.naturalSize.height)];

[_cropFilter addTarget:movieWriter];
movieWriter.shouldPassthroughAudio = YES;

movieUrl.audioEncodingTarget = movieWriter;

[movieUrl enableSynchronizedEncodingUsingMovieWriter:movieWriter];

[self.movieWriter startRecordingInOrientation:videoTransform];
[self.movieWriter startRecording];

[movieUrl startProcessing];
__block BOOL completeRec = NO;
__unsafe_unretained typeof(self) weakSelf = self;
[self.movieWriter setCompletionBlock:^{

    [weakSelf.cropFilter removeTarget:weakSelf.movieWriter];
    [weakSelf.movieWriter finishRecording];
    [movieUrl removeTarget:weakSelf.cropFilter];
    if (!completeRec)
    {
        [weakSelf videoCropDoneUrl:movieURL];
        completeRec = YES;
    }
}];
于 2013-09-07T19:03:34.703 に答える
0

解決策 2 は私のアプリであれば「OK」の解決策のように聞こえますが、それでも GPUImage ビデオ フィルターを使用することをお勧めします。

解決策:

  1. 元のビデオを取得し、そこからオーディオ トラックを切り離します。(できればバックグラウンドスレッドで)https://github.com/unixpickle/MP4Audioのようなもので
  2. ユーザーが GPUImage でビデオ フィルターを選択し、ビデオを処理して保存します。
  3. ビデオの準備ができたら、GPUImage の介入前に保存したオーディオ トラックに、新しく編集されたフィルター処理されたビデオをマージします。(マージを行うには多くの方法がありますが、そのうちの 1 つ: Merging Audio with Video Objective-C )

シャナ・トヴァ

于 2013-09-04T23:36:38.457 に答える
0

OpenCVフレームワークを使用して、ビデオ編集で遊ぶことができます..

ここにOpenCvをダウンロードするためのリンクがあります

http://sourceforge.net/projects/opencvlibrary/files/opencv-ios/2.4.6/opencv2.framework.zip/download

ここに OpenCV で遊ぶためのチュートリアルがあります

http://docs.opencv.org/doc/tutorials/ios/video_processing/video_processing.html#opencviosvideoprocessing.

私はこれがあなたを助けると思う..

于 2013-08-29T09:41:15.950 に答える