2013-04-14 43 views
6

我正在使用GPUImage庫將視頻錄製到文件系統上的文件。我把它保存爲m4v文件。這是我正在使用的代碼: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]; 
    }]; 

這會記錄m4v視頻。然後我嘗試用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]; 

然而,玩家只要開始緩衝,沒有任何反應。視頻不開始播放。玩家只是永遠緩衝。該應用程序不會崩潰,並且控制檯中沒有警告,所以我不知道是什麼問題。

+0

你檢查視頻是否有在保存的目的地是哪裏?下載並在電腦上播放以確保視頻沒有損壞 – Ushan87

回答

0

我看到了一些看起來不正確的東西。

首先,您直接寫入NSHomeDirectory,它返回的是不可寫入的應用程序目錄(請參閱reference)。 請改爲寫入Documents文件夾或Library/Caches文件夾。

其次我不明白videoCameraFilter是如何定義的。您需要確保將其添加爲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]; 
}]; 

目標*編輯:

你嘗試喲做moviePlayer屬性/伊娃作爲@SAMIR RATHOD建議?電影播放器​​停留在那裏無休止的事實最可能是因爲它沒有被保留而造成的。

屬性添加到您的viewController的接口:

@property (nonatomic, strong) MPMoviePlayerController *moviePlayer; 

和實例化MPMoviewPlayerController

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

不,我正在寫文檔目錄。然後,我在錄製後嘗試播放視頻。我知道這個視頻是正確的,因爲如果我只是從相機膠捲上打開它,它就可以工作。 –

+0

看我的編輯.... –

0

試試這個:

首先檢查將videoPath它顯示正確的路徑或不?

.h文件中

MPMoviePlayerController*  player 

.M @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]; 
    }