2013-04-14 8 views
6

Używam biblioteki GPUImage do nagrywania wideo do pliku w systemie plików. Zapisuję go jako plik m4v. To jest kod, którego używam:Nie można odtwarzać nagrań wideo za pomocą GPUImage

NSString *pathToMovie = [NSHomeDirectory() stringByAppendingPathComponent:recordingDestination]; 
    unlink([pathToMovie UTF8String]); 
    NSURL *movieURL = [NSURL fileURLWithPath:pathToMovie]; 

    movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(1280.0, 720.0)]; 
    [videoCameraFilter addTarget:movieWriter]; 

    movieWriter.shouldPassthroughAudio = YES; 
    movieFile.audioEncodingTarget = movieWriter; 
    [movieFile enableSynchronizedEncodingUsingMovieWriter:movieWriter]; 

    [movieWriter startRecording]; 
    [movieFile startProcessing]; 

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

Zapisuje wideo m4v. I następnie spróbować odtworzyć go z MPMoviePlayerController:

NSString *videoPath = [NSString stringWithFormat:@"%@/%@", [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"], [libraryFiles objectAtIndex:selectedCell]]; 
    NSLog(videoPath); 
    NSURL *url=[[NSURL alloc] initWithString:videoPath]; 
    MPMoviePlayerController *moviePlayer=[[MPMoviePlayerController alloc] initWithContentURL:url]; 

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayBackDidFinish) name:MPMoviePlayerPlaybackDidFinishNotification object:moviePlayer]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayBackDonePressed) name:MPMoviePlayerDidExitFullscreenNotification object:moviePlayer]; 

    moviePlayer.controlStyle=MPMovieControlStyleDefault; 
    [moviePlayer play]; 
    [self.view addSubview:moviePlayer.view]; 
    [moviePlayer setFullscreen:YES animated:YES]; 

Jednak gracz właśnie rozpoczyna buforowanie i nic się nie dzieje. Film nie rozpoczyna odtwarzania. Gracz po prostu buforuje na zawsze. Aplikacja nie zawiesza się i nie ma żadnych ostrzeżeń w konsoli, więc nie wiem, na czym polega problem.

+0

masz zaznaczone wideo jest tam zapisanego miejsca przeznaczenia? pobierz i graj na swoim komputerze, aby upewnić się, że wideo nie jest uszkodzone. – Ushan87

Odpowiedz

0

Widzę na kilka rzeczy, które nie wyglądają dobrze.

Po pierwsze, piszesz bezpośrednio na NSHomeDirectory, która zwraca katalog aplikacji, który jednak nie jest zapisywalny (patrz reference). Albo zapisz w folderze Documents lub w folderze Library/Caches.

Po drugie, nie widzę, jak zdefiniowano videoCameraFilter. Musisz upewnić się, aby dodać ją jako cel movieFile

GPUImageMovie *movieFile = [[GPUImageMovie alloc] initWithURL:sampleURL]; 

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
NSString *pathToMovie = [documentsDirectory stringByAppendingPathComponent:@"filtered-movie.m4v"]; 
unlink([pathToMovie UTF8String]); 
NSURL *movieURL = [NSURL fileURLWithPath:pathToMovie]; 

GPUImageMovieWriter *movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(1920.0, 1080.0)]; 
GPUImageBoxBlurFilter * videoCameraFilter = [[GPUImageBoxBlurFilter alloc] init]; // just a random filter... 
videoCameraFilter.blurSize = 2.0; 
[movieFile addTarget:videoCameraFilter]; 
[videoCameraFilter addTarget:movieWriter]; 

movieWriter.shouldPassthroughAudio = YES; 
movieFile.audioEncodingTarget = movieWriter; 
[movieFile enableSynchronizedEncodingUsingMovieWriter:movieWriter]; 

[movieWriter startRecording]; 
[movieFile startProcessing]; 

__weak GPUImageMovieWriter *weakMoviewWriter = movieWriter; 
[movieWriter setCompletionBlock:^{ 
    [movieFile removeTarget:weakMoviewWriter]; 
    [weakMoviewWriter finishRecording]; 
}]; 

* EDIT:

Próbowałaś yo co moviePlayer właściwością/Ivar jak sugeruje @SAMIR Rathod? Fakt, że moviePlayer jest tam bez końca buforowany jest najprawdopodobniej spowodowany tym, że nie został zachowany.

dodać obiekt do interfejsu viewController za:

@property (nonatomic, strong) MPMoviePlayerController *moviePlayer; 

i instancję swoje MPMoviewPlayerController:

self.moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:url]; 
+0

Nie, piszę do katalogu dokumentów. Próbuję odtworzyć wideo PO jego nagraniu. Wiem, że film jest prawidłowy, ponieważ jeśli po prostu otworzę go z rolki z kamery, działa. –

+0

Zobacz moją edycję .... –

0

Spróbuj tego:

Najpierw sprawdź film Czy wyświetla właściwą ścieżkę?

.h plików

MPMoviePlayerController*  player 

.m gracz @synthesize;

-(void) viewWillAppear:(BOOL)animated { 
      [super viewWillAppear:animated]; 

      player = [[MPMoviePlayerController alloc] initWithContentURL:[NSURL URLWithString:videoPath]]; 
      player.scalingMode = MPMovieScalingModeFill; 
      player.movieSourceType = MPMovieSourceTypeFile; 
      player.view.frame = CGRectMake(0, 45, 320, 400); 
      player.shouldAutoplay = YES; 
      [player prepareToPlay]; 
      [self.view addSubview:player.view]; 
      [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(movieFinishedCallback:) name:MPMoviePlayerPlaybackDidFinishNotification object:player]; 

      [player play]; 
    } 

    #pragma mark MoviPlayer Method 

    - (void) movieFinishedCallback:(NSNotification*) aNotification { 
      MPMoviePlayerController *player1 = [aNotification object]; 
      [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:player1]; 
      [player stop]; 
      [player1.view removeFromSuperview]; 

      player1 = nil; 
      [self.navigationController popViewControllerAnimated:YES]; 
    } 

    -(void) dealloc { 
      [player release]; 
      [super dealloc]; 
    }