Je suis en train de créer une application où l'utilisateur est censé s'enregistrer en vidéo pendant qu'une autre vidéo est en cours de lecture sur l'écran à côté de la vue de la caméra. Le résultat sera deux fichiers vidéo, une source et un enregistrement. En utilisant AVCaptureSession etc., j'ai réussi à enregistrer une vidéo en même temps qu'une autre vidéo est en cours de lecture sur l'écran. Le problème est qu'il n'y a pas de synchronisation totale.
C'est ainsi que je l'ai configuré pour l'instant :
-(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];
}
Il en résulte deux vidéos, mais la deuxième vidéo (enregistrée) est légèrement plus longue que la vidéo source/originale. Lorsqu'on les passe l'une au-dessus de l'autre (en même temps), la vidéo n° 2 a un retard de presque une demi-seconde. On a l'impression que la vidéo n°2 a commencé à enregistrer beaucoup trop tôt, à cause du temps "supplémentaire". Il se peut aussi que la lecture ait commencé trop tard. Quoi qu'il en soit, je ne sais pas comment établir une cohérence sur cette base. Je pourrais probablement jouer beaucoup avec le sommeil, etc., mais cela ne fonctionnerait que pour mon téléphone, car cela a quelque chose à voir avec la vitesse du téléphone. Même s'il existe une méthode déléguée comme -(void)willStartPlaying
pour le AVPlayer
ce que je ne pense pas, il y aurait toujours un problème de synchronisation, car il y a une petite attente jusqu'au retour. Existe-t-il un moyen de lancer deux commandes à la fois ? Ou existe-t-il une autre solution pour cela ?
EDIT
J'ai lu ce ( AVSynchronizedLayer
), mais je ne suis pas sûr que cela s'applique à ma situation, et je ne comprends pas comment procéder.