1

録画したビデオのプレビューを可能にするプレーヤー (MPMoviePlayerController) を追加するために、AVCam デモ サンプルで遊んでみました

xib に再生ボタンを追加し、対応する IBOutlet と IBActions + プレーヤーを追加しました。

@property (nonatomic,retain) IBOutlet UIBarButtonItem *playerButton;
@property (nonatomic, assign) MPMoviePlayerController *player;

- (IBAction)playVideo:(id)sender;

viewdidload でプレーヤーを初期化します。

player = [[MPMoviePlayerController alloc] init];

プレイアクションは以下の通り

- (IBAction)playVideo:(id)sender {

     if(player) {
     [player stop];
     }
     // Create a new movie player object.
     [player setContentURL:[[[self captureManager] recorder] outputFileURL]];
     player.movieSourceType = MPMovieSourceTypeFile;
    [player prepareToPlay];
    CGRect viewInsetRect = CGRectMake( 0, 0, 200, 300);
    // Inset the movie frame in the parent view frame.
    [[player view] setFrame:viewInsetRect];

    player.scalingMode = MPMovieScalingModeAspectFill;
    player.controlStyle = MPMovieControlStyleNone;
    //player.useApplicationAudioSession = NO;

    //[self.view addSubview: [_player view]];
    [self.view addSubview:player.view];

    if(player) {
    [player play];
    }

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playComplete) name:MPMoviePlayerPlaybackDidFinishNotification object:player];

}

そして、再生が終了したときに呼び出される playComplete:

-(void)playComplete {
    [player.view removeFromSuperview];
}

結果: アプリを起動すると、好きなだけビデオを録画できます。最後に録画したビデオを再生すると、問題なく再生できますが、ビデオを再生した後、再度録画しようとすると、録画を開始するとすぐに次のエラーが発生します。

Error Domain=AVFoundationErrorDomain Code=-11803 "Cannot Record" UserInfo=0x152e60 {NSLocalizedRecoverySuggestion=Try recording again., AVErrorRecordingSuccessfullyFinishedKey=false, NSLocalizedDescription=Cannot Record}

一時出力ファイルに問題があると思いましたが、そうではないようです。

MPMoviePlayerController を導入すると、アプリの動作が何らかの形で壊れてしまうのではないかと思っています。

あなたの何人かは何か考えがありますか?

ありがとう

P

4

1 に答える 1

2

-11803 は、captureManager セッションが実行されていないことが原因であることがわかりました (Stackoverflow で回答が見つかりましたが、非常に速く理解できませんでした...)

ビデオ プレビュー再生の最後に、playComplete で、キャプチャ マネージャーのセッション ステータスを確認するテストを追加し、これがなくなった場合に実行できるようにしました。

-(void)playComplete {
    [player.view removeFromSuperview];
    if(![[[self captureManager] session] isRunning]) {
        // Start the session. This is done asychronously since -startRunning doesn't return until the session is running.
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            [[[self captureManager] session] startRunning];
        });
    }
}

現在は機能していますが、ビデオ プレビューで captureManager セッションが停止する理由を誰かが知っている場合は、喜んでそれを理解してください。

P

于 2013-04-05T13:06:22.363 に答える