3

カメラビューの横の画面で別のビデオが再生されている間に、ユーザーが自分自身をビデオ録画することになっているアプリを作成しています。その結果、2 つのビデオ ファイル、1 つのソース、および 1 つの録画が作成されます。AVCaptureSession などを使用して、別のビデオが画面で再生されているのと同時にビデオを録画することに成功しました。問題は、完全に同期していないことです。

これは私が今それを設定した方法です:

-(void)playAndRecordInSync //Session is already set etc.
{
        player = [AVPlayer playerWithURL:url];
        playerLayer = [AVPlayerLayer playerLayerWithPlayer:player];
        [playerLayer setFrame:leftCameraView.bounds];
        [playerLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill];
        [leftCameraView.layer addSublayer:playerLayer];

        //Will stop recording camera when source video reaches end(notification):
        player.actionAtItemEnd = AVPlayerActionAtItemEndNone;
        [[NSNotificationCenter defaultCenter] addObserver:self
                              selector:@selector(playerItemDidReachEnd:)
                               name:AVPlayerItemDidPlayToEndTimeNotification
                                                   object:[player currentItem]];
        //Start playback:
        [player play]; 
        //Start recording:
        [movieOutput startRecordingToOutputFileURL:outputURL recordingDelegate:self];
}
- (void)playerItemDidReachEnd:(NSNotification *)notification {
    [movieOutput stopRecording];
}

この結果、2 つのビデオが作成されますが、2 番目の (記録された) ビデオはソース/元のビデオよりもわずかに長くなります。それらを重ねて(同時に)再生すると、ビデオ番号。2 はほぼ 0.5 秒の遅延があります。「余分な」時間があったため、video2 の録画開始が早すぎたように感じます。また、再生の開始が遅すぎた可能性もあります。いずれにせよ、これに基づいてここで一貫性を保つ方法がわかりません。おそらくスリープなどでいろいろいじることができますが、これは電話の速度に関係しているため、私の電話でのみ機能します。のようなデリゲートメソッドがあって-(void)willStartPlayingAVPlayer、私はないと思いますが、戻ってくるまで少し待つので、同期にはまだ問題があります。一度に 2 つのコマンドを実行する方法はありますか? または、これに対する別の解決策はありますか?

編集

これ( ) を読んでいますがAVSynchronizedLayer、これが自分の状況に当てはまるかどうかわかりません。また、どのように進めればよいかわかりません。

4

1 に答える 1

1

遅延は常に再生の開始が遅すぎることが原因であることがわかりましたが、記録と再生の両方が同時に停止したため、 を見つけてこれを解決しv2.duration - v1.duration、 を使用して v2 の先頭から結果を減算しましたAVAssetExportSession。現在、両方のビデオを異なるレイヤーで同時に再生すると、両方の開始からまだ若干の遅延がありますが、ビデオをエクスポートすることで、同じ長さで同期していることが確認されました。

于 2013-08-18T15:43:55.717 に答える