Film à partir d'images : le .mov est créé mais les images ne s'y ajoutent pas.

Bonjour

Suite de ma discussion d'hier...

Mon logiciel d'animation crée des images sur le disque, puis AVAssert les monte. Le fichier .mov est bien créé mais j'ai ce message d'erruer lorsque il s'agit d'y mettre les images :

Error Domain=AVFoundationErrorDomain Code=-11800 "The operation could not be completed" UserInfo={NSLocalizedFailureReason=An unknown error occurred (-16364), NSLocalizedDescription=The operation could not be completed, NSUnderlyingError=0x600003ab8000 {Error Domain=NSOSStatusErrorDomain Code=-16364 "(null)"}}

J'ai cherché partout mais je ne trouve pas. le .mov pèse 0 kOctets...

La boucle pour l'image est :

`for (int j = 0; j < nbImExtrait; j++){

    NSString *fileImage = [nomFichier stringByAppendingString:[NSString stringWithFormat:@"_%d.tiff", (j + planInit)]];
    NSImage *uneImage = [[NSImage alloc]initWithContentsOfFile:fileImage];
    NSImage *uneImageB = [[NSImage alloc]initWithData:[uneImage TIFFRepresentation]]; //J'ai essayé les deux, l'image et la B
    if (uneImageB){
        CMTime frameTime = CMTimeMake(1, perSec);
        CVImageBufferRef imRef = [self fastImageFromNSImage:uneImageB];
        if (![adaptor appendPixelBuffer:imRef withPresentationTime:frameTime]) {
                NSError *error = [videoWriter error];
                NSLog(@"erreur dans l'ajout = %@", error);
            }
        CFRelease(imRef);
    }
    else NSLog(@"noImage");//jamais appelé
    [NSThread sleepForTimeInterval:0.1];//est-ce là le problème?
}//fin boucle for images`

La méthode pour créer les CVImageBufferRef a été prise ici :
https://prograide.com/pregunta/59851/avfoundation--assetwriter-generer-un-film-avec-des-images-et-du-son

Je crains un problème d'horloge, j'ai laissé le "sleep" mais différentes valeurs ne changent rien. j'ai essayé plusieurs codec (jpeg, H264)

Si vous avez un peu d'expérience sur ce sujet très débattu déjà, merci.

Réponses

  • PyrohPyroh Membre

    Aucune réponse pour le moment mais une question: [NSThread sleepForTimeInterval:0.1];, pourquoi ?

  • HerveHerve Membre

    En effet, je me suis posé cette question. Je pense que cela ne sert à rien. (Laisser un peu de temps au logicei pour écrire l'image?????)

    Mon idée est tout de même que AVFoundation doit simplifier beaucoup les choses (quoique le code avec QTimeMovie était on ne peut plus simple, j'essaie ici de m'en inspirer). Dans le domaine audio (que je maitrise bien cette fois), AVAudioSession a grandement simplifié les choses par rapport à CoreAudio seul. Je pense que l'on doit pouvoir faire simple aussi pour le montage vidéo.

    Je lis le livre de Bob McCune ("Learning AVFoundation") qui insiste beaucoup sur l'importance du CMTime. Je pense que la solution est par là.

  • HerveHerve Membre
    juin 2022 modifié #4

    C'est bon j'ai trouvé. C'était bien un problème de CMTime. Il fallait faire :

    if (uneImageB){
                CMTime frameTime = CMTimeMake(1, perSec);
                CMTime lastTime = CMTimeMake(j, perSec);
                CMTime presentTime = CMTimeAdd(lastTime, frameTime);//Et oui, il faut le mettre plus tard!!
                CVImageBufferRef imRef = [self fastImageFromNSImage:uneImageB];
                append_ok = [adaptor appendPixelBuffer:imRef withPresentationTime:presentTime];
                CFRelease(imRef);
            }
    

    Si cela peut aider ...

Connectez-vous ou Inscrivez-vous pour répondre.