3 votes

Enregistrement/lecture synchronisés ios

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.

1voto

Sti Points 1386

J'ai découvert que le retard était toujours dû au fait que la lecture commençait trop tard, mais que l'enregistrement et la lecture étaient arrêtés en même temps. v2.duration - v1.duration et soustraire le résultat du début de v2, en utilisant la méthode suivante AVAssetExportSession . En lisant les deux vidéos en même temps, dans des couches différentes, il y a encore un certain retard au démarrage des deux, mais en exportant les vidéos, j'ai confirmé qu'elles ont la même longueur et sont synchronisées.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X