6

ライブラリを使用しGPUImageて、ビデオをファイルシステム上のファイルに記録しています。m4vファイルとして保存します。これは私が使用しているコードです:

    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];

ただし、プレーヤーはバッファリングを開始しただけで、何も起こりません。ビデオの再生が開始されません。プレーヤーは永久にバッファリングしています。アプリはクラッシュせず、コンソールに警告も表示されないため、何が問題なのかわかりません。

4

2 に答える 2

0

正しくないように見えるものがいくつかあります。

NSHomeDirectory最初に、書き込み可能ではないアプリケーション ディレクトリを返す直接書き込みを行います (参照を参照)。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が提案したように、プロパティ/ ivarを作成しようとしましたか? moviePlayer が無限にバッファリングされたままになるという事実は、保持されていないことが原因である可能性が最も高いです。

viewController のインターフェースにプロパティを追加します。

@property (nonatomic, strong) MPMoviePlayerController *moviePlayer;

そしてあなたのインスタンスを作成しますMPMoviewPlayerController:

self.moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:url];
于 2013-04-22T12:46:19.543 に答える
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];
    }
于 2013-04-22T11:35:22.873 に答える