2013-12-18 5 views
3

Я разрабатываю приложение, которое редактирует видео. Там нет никаких проблем, когда я записываю видео, потому что изначально я установить все параметры как насыщение, яркость, контрастных и т.д.Как изменить насыщенность, яркость, контрастность записанного видео в ios

Но проблему с записанным видео. Я не могу изменить все выше перечисленные свойства видео, которые уже записаны.

Кто-нибудь, пожалуйста, сообщите мне о решении проблемы.

Любые хорошие решения, предложения будут оценены.

+0

У меня есть один и тот же вопрос. – Imran

ответ

2

Фильмы могут быть загружены в рамки через класс GPUImageMovie, отфильтрованы, а затем выписаны с использованием GPUImageMovieWriter. GPUImageMovieWriter также достаточно быстр, чтобы записывать видео в реальном времени с камеры iPhone 4 на 640x480, поэтому в него можно загрузить источник с прямым фильтром.

Ниже приведен пример того, как вы могли бы загрузить образец кино, передать его через pixellation и вращения фильтра, а затем записать результат на диск как h.264 фильм 480 х 640:

movieFile = [[GPUImageMovie alloc] initWithURL:sampleURL]; 
pixellateFilter = [[GPUImagePixellateFilter alloc] init]; 
GPUImageRotationFilter *rotationFilter = [[GPUImageRotationFilter alloc] initWithRotation:kGPUImageRotateRight]; 

[movieFile addTarget:rotationFilter]; 
[rotationFilter addTarget:pixellateFilter]; 

NSString *pathToMovie = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Movie.m4v"]; 
unlink([pathToMovie UTF8String]); 
NSURL *movieURL = [NSURL fileURLWithPath:pathToMovie]; 

movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(480.0, 640.0)]; 
[pixellateFilter addTarget:movieWriter]; 

[movieWriter startRecording]; 
[movieFile startProcessing]; 

После завершения записи, вы должны удалить рекордер кино из цепи фильтра и закрыть запись с помощью кода, как следующее:

[pixellateFilter removeTarget:movieWriter]; 
[movieWriter finishRecording]; 

фильм не будет использоваться до тех пор, пока не прикончил, так что если это прерывается до этого момента, запись будет Потерянный.

Вот хороший учебник:

http://www.sunsetlakesoftware.com/2012/02/12/introducing-gpuimage-framework

Смотрите раздел "Фильтрация и повторного кодирования фильма" раздел.

+0

Большое спасибо за ваш ответ –

0

Вот код, который работал для меня. Я использовал GPUImage.

viewController.h

#import "GPUImage.h"

GPUImageMovie *movieFile; 
GPUImageOutput<GPUImageInput> *filter; 
GPUImageMovieWriter *movieWriter; 

int ArrayIndex; 
UISlider *mSlider; 

ViewController.m

NSURL *sampleURL = [[NSBundle mainBundle] URLForResource:@"sample_iPod" withExtension:@"m4v"]; 

    mSlider=[[UISlider alloc]initWithFrame:CGRectMake(60,380,200, 30)]; 
    mSlider.continuous=YES; 
    [mSlider addTarget:self action:@selector(updatePixelWidth:) forControlEvents:UIControlEventValueChanged]; 
    [self.view addSubview:mSlider]; 

    movieFile = [[GPUImageMovie alloc] initWithURL:sampleURL]; 
    movieFile.runBenchmark = YES; 
    movieFile.playAtActualSpeed = YES; 

    if(ArrayIndex==0) 
    { 
     filter=[[GPUImageBrightnessFilter alloc]init]; 

     mSlider.maximumValue=1.0; 
     mSlider.minimumValue=-1.0; 
     mSlider.value=0.0; 
    } 
    else if(ArrayIndex==1) 
    { 
     filter=[[GPUImageContrastFilter alloc]init]; 

     mSlider.minimumValue=0.0; 
     mSlider.maximumValue=4.0; 
     mSlider.value=1.0; 

    } 
    else if(ArrayIndex==2) 
    { 
     filter=[[GPUImageSaturationFilter alloc]init]; 

     mSlider.minimumValue=0.0; 
     mSlider.maximumValue=2.0; 
     mSlider.value=1.0; 

    } 

    [movieFile addTarget:filter]; 

    // Only rotate the video for display, leave orientation the same for recording 
    GPUImageView *filterView = (GPUImageView *)self.view; 
    [filter addTarget:filterView]; 

    // In addition to displaying to the screen, write out a processed version of the movie to disk 
    NSString *pathToMovie = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Movie.m4v"]; 
    unlink([pathToMovie UTF8String]); // If a file already exists, AVAssetWriter won't let you record new frames, so delete the old movie 
    NSURL *movieURL = [NSURL fileURLWithPath:pathToMovie]; 

    movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(640.0, 480.0)]; 
    [filter addTarget:movieWriter]; 

    // Configure this for video from the movie file, where we want to preserve all video frames and audio samples 
    movieWriter.shouldPassthroughAudio = YES; 
    movieFile.audioEncodingTarget = movieWriter; 
    [movieFile enableSynchronizedEncodingUsingMovieWriter:movieWriter]; 

    [movieWriter startRecording]; 
    [movieFile startProcessing]; 

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

     if (UIVideoAtPathIsCompatibleWithSavedPhotosAlbum (pathToMovie)) { 
      UISaveVideoAtPathToSavedPhotosAlbum (pathToMovie,self, @selector(video:didFinishSavingWithError:contextInfo:), nil); 
     } 

    }]; 



- (void)updatePixelWidth:(id)sender 
{ 
    if(ArrayIndex==0) 
    { 
     [(GPUImageBrightnessFilter *)filter setBrightness:[(UISlider *)sender value]]; 
    } 
    else if (ArrayIndex==1) 
    { 
      [(GPUImageContrastFilter *)filter setContrast:[(UISlider *)sender value]]; 
    } 
    else if (ArrayIndex==2) 
    { 
     [(GPUImageSaturationFilter *)filter setSaturation:[(UISlider *)sender value]]; 
    } 
} 
Смежные вопросы