2013-04-14 24 views
6

Tôi đang sử dụng thư viện GPUImage để quay video vào một tệp trên hệ thống tệp. Tôi lưu nó dưới dạng file m4v. Đây là mã tôi đang sử dụng:Không thể phát máy quay video bằng 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]; 
    }]; 

Điều này ghi lại video m4v. Sau đó, tôi cố gắng phát nội dung đó với 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]; 

Tuy nhiên, trình phát chỉ bắt đầu lưu vào bộ đệm và không có gì xảy ra. Video không bắt đầu phát. Người chơi chỉ là đệm mãi mãi. Các ứng dụng không sụp đổ và không có cảnh báo trong giao diện điều khiển, vì vậy tôi không biết vấn đề là gì.

+0

có bạn kiểm tra video có trong điểm đến cứu? tải về và chơi nó trên máy của bạn để đảm bảo rằng video không bị hỏng – Ushan87

Trả lời

0

Tôi thấy một vài điều không ổn.

Trước tiên, bạn đang viết trực tiếp vào NSHomeDirectory trả về thư mục ứng dụng tuy nhiên không thể ghi (xem reference). Thay vào đó, hãy viết thư mục Documents hoặc thư mục Library/Caches.

Thứ hai, tôi không thấy cách videoCameraFilter được xác định. Bạn cần phải chắc chắn để thêm nó như là một mục tiêu của 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:

Bạn đã thử yo làm moviePlayer một tài sản/Ivar như @SAMIR RATHOD gợi ý? Thực tế là moviePlayer ở lại đó đệm không ngừng có lẽ là nguyên nhân gây ra bởi vì nó không được giữ lại.

thêm một tài sản để giao diện viewController của bạn:

@property (nonatomic, strong) MPMoviePlayerController *moviePlayer; 

và nhanh chóng của bạn MPMoviewPlayerController:

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

Không, tôi đang viết thư mục Documents. Sau đó tôi cố gắng phát video sau khi tôi ghi lại. Tôi biết video là thích hợp, bởi vì nếu tôi chỉ cần mở nó từ máy ảnh cuộn, nó hoạt động. –

+0

Xem chỉnh sửa của tôi .... –

0

Hãy thử điều này:

Kiểm tra đầu tiên VideoPath có hiển thị đường dẫn phù hợp hay không?

.h file

MPMoviePlayerController*  player 

.m chơi @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]; 
    }