2013-08-29 41 views
15

Tôi muốn áp dụng bộ lọc (hiệu ứng) trên tệp video trong khi video đang phát.Áp dụng bộ lọc trên tệp video

Tôi hiện đang sử dụng khung công tác tuyệt vời của @BradLarson (tuyệt vời) GPUImage để làm như vậy, vấn đề ở đây là khung không hỗ trợ phát lại âm thanh trong khi phát video.

Vì vậy, tôi có hai lựa chọn:

1) Dive vào mã GPUImage và thay đổi GPUImageMovie vì vậy nó cũng sẽ xử lý bộ đệm âm thanh. Điều này đòi hỏi kiến ​​thức đồng bộ hóa âm thanh & khung hình video và rất tiếc là tôi không có. Tôi thấy một số hacks cố gắng chơi âm thanh với AVAudioPlayer nhưng với rất nhiều vấn đề đồng bộ.

2) Sử dụng khung CoreImage thay vì GPUImage.

Vì vậy, tôi muốn xem xét tùy chọn thứ hai của việc sử dụng iOS gốc CoreImageCIFilter để thực hiện công việc.

Vấn đề là, tôi không thể tìm thấy bất kỳ ví dụ nào về cách thực hiện điều này với CIFilter, làm cách nào để áp dụng bộ lọc trên video từ tệp?

Tôi có phải sử dụng số AVAssetReader để đọc video và xử lý từng khung không? nếu vậy tôi quay trở lại vấn đề đầu tiên của tôi về việc đồng bộ hóa âm thanh & video.
Hoặc có cách nào để áp dụng chuỗi bộ lọc trực tiếp trên video hoặc trên lớp xem trước không?

Đánh giá cao sự giúp đỡ nào :)

+0

Tôi chắc chắn sẽ đánh giá cao bất kỳ trợ giúp nào trong việc thêm phát lại âm thanh. Nó không phải là một khu vực tôi rất quen thuộc, và thậm chí hỗ trợ ghi âm thanh đã được thêm bởi một người nào khác. Tất cả tôi đã làm với nó là cố gắng tinh chỉnh cho hiệu suất. –

+0

@BradLarson Tôi thực sự ngạc nhiên khi không ai thực hiện nó cho đến bây giờ, đặc biệt là vì rất nhiều người sử dụng và đóng góp cho GPUImage – Eyal

+0

Tôi đã thực hiện một số công việc với tổng hợp nhiều video và âm thanh bằng AVComposition và tôi có thể liên quan đến các vấn đề với đồng bộ hóa . Tôi không biết cách thêm âm thanh vào GPUImage. Tuy nhiên, tôi có thể cung cấp một dự án mẫu có thể giúp - nó được gọi là RosyWriter từ Apple và nó đề cập đến việc thêm bộ lọc trong phiên AVCapture: apple.https: //developer.apple.com/library/ios/samplecode/RosyWriter/Introduction/ Intro.html – IanStallings

Trả lời

0

Mặc dù giải pháp 2 có vẻ giống như giải pháp "OK" nếu ứng dụng của tôi vẫn thích sử dụng bộ lọc GPUImage Video.

Giải pháp:

  1. Lấy video gốc và xé các track âm thanh ra khỏi nó. (tốt nhất là trong chuỗi nền) với một cái gì đó như https://github.com/unixpickle/MP4Audio
  2. Cho phép người dùng chọn bộ lọc video của mình với GPUImage, xử lý video và lưu video.
  3. Khi video đã sẵn sàng, hãy hợp nhất video đã lọc mới đã chỉnh sửa với bản âm thanh bạn đã lưu trước khi can thiệp GPUImage.(Nhiều cách để làm việc hợp nhất, đây là một trong số họ: Merging Audio with Video Objective-C )

Shana Tova

3

Sử dụng GPUImage khuôn khổ duy nhất mà bạn đang sử dụng ... đó là khuôn khổ tốt nhất cho đến nay cho các bộ lọc video. GO thông qua các tài liệu của khung https://github.com/BradLarson/GPUImage di chuyển xuống trang bạn sẽ tìm thấy các chi tiết của các bộ lọc có sẵn ...

bộ lọc này được áp dụng trên video và ghi video bạn phải sử dụng lớp GPUImageMovieWriter ... Nó tự động xử lý âm thanh ..

bạn không phải duy trì nó ... Sử dụng thuộc tính shouldPassThroughAudio của GPUImageMovieWriter và nó sẽ tự quản lý âm thanh.

Sử dụng hướng dẫn này để được giúp đỡ http://www.sunsetlakesoftware.com/2012/02/12/introducing-gpuimage-framework

Đây là mã mà tôi đang sử dụng khuôn khổ GPUImage để cắt video và âm thanh được lưu trữ không được gỡ bỏ sau khi chỉnh sửa.

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; 
    } 
}]; 
+0

Không ai trong số đó sẽ giúp họ phát âm thanh từ một bộ phim bằng cách sử dụng khung, vì khả năng đó hiện không tồn tại trong khuôn khổ. –

+0

@BradLarson Ohh! thats the reason.Tôi đã tải về lớp học của bạn thời gian dài trước đây. –

+0

@ParvezBelim GPUImage về mặt kỹ thuật là một khung công tác chứ không phải là 'lớp'. –

Các vấn đề liên quan