Probleme de redimensionnement pour QTTracks

Bonjour


 


Je souhaite insérer la track video d'une QTMovie ([maVueVideo1 movieQT]) sur une autre QTmovie ([maVueVideo movieQT]). Sachant que les dimensions (taille) de ces 2 tracks sont différentes, je souhaite que la track à  insérer soit de la dimension de la track de l'autre QTmovie qui va la recevoir.


 


Pour cela, j'ai fais : 




NSSize movieSize = [[[maVueVideo movieQT] attributeForKey:@QTMovieNaturalSizeAttribute] sizeValue];

NSRect newPosition = NSMakeRect(0, 0,movieSize.width, movieSize.height);

// make sure the movie is editable
[[maVueVideo movieQT] setAttribute:[NSNumber numberWithBool:YES] forKey:QTMovieEditableAttribute];


NSArray* theTracks1 = [[maVueVideo1 movieQT] tracksOfMediaType:QTMediaTypeVideo];
QTTrack *maTrack1 = [theTracks1 objectAtIndex:0];

NSArray* theTracks0 = [[maVueVideo movieQT] tracksOfMediaType:QTMediaTypeVideo];
QTTrack *maTrack0 = [theTracks0 objectAtIndex:0];

NSValue *maValue = [maTrack0 attributeForKey:QTTrackBoundsAttribute];
//changer la taille de la video à  insérer
NSSize s = [[maTrack1 attributeForKey:QTTrackDimensionsAttribute] sizeValue];
NSSize s0 = [[maTrack0 attributeForKey:QTTrackDimensionsAttribute]sizeValue];
NSRect r = [[maTrack1 attributeForKey:QTTrackBoundsAttribute] rectValue];
NSRect r0 = [[maTrack0 attributeForKey:QTTrackBoundsAttribute] rectValue];

[maTrack1 setAttribute:maValue forKey:QTTrackBoundsAttribute];

NSSize ss = [[maTrack1 attributeForKey:QTTrackDimensionsAttribute] sizeValue];
NSSize ss0 = [[maTrack0 attributeForKey:QTTrackDimensionsAttribute]sizeValue];
NSRect rr = [[maTrack1 attributeForKey:QTTrackBoundsAttribute] rectValue];
NSRect rr0 = [[maTrack0 attributeForKey:QTTrackBoundsAttribute] rectValue];

//position d'insertion
QTTime timeInsert = [[maVueVideo movieQT]duration];
timeInsert.timeValue = [[maVueVideo movieQT]currentTime].timeValue;

[[maVueVideo movieQT] insertSegmentOfTrack:maTrack1 timeRange:movieRange atTime:timeInsert];
NSArray* theTracks2 = [[maVueVideo movieQT] tracksOfMediaType:QTMediaTypeVideo]; 

J'obtiens bien un ajustement de la track à  insérer en la testant avant et après la conversion, et après l'insertion,  j'ai bien 2 tracks de mêmes dimensions.


Cependant, à  l'affichage sur QTMovieView, les 2 tracks ont retrouvées leurs tailles d'origines


 


Comment faire ?


 


 


Merci d'avance

Réponses

  • Après un gros travail d'essai je viens de trouver la solution : EN fait, la movie qui doit se superposer doit être redimmensionnée en proportion de la première 


     


    Voici mon code complet qui prend en compte ce redimmensionnement, sa transparence, la position de cette superposition sur la video de receptio et la valeur du QTTime de la video à  superpositionner : 



    //définir le range de la 2e video s'il existe via les in et out
    QTTime timeDebut = [[maVueVideo1 movieQT] duration];
    QTTime timeDuree = [[maVueVideo1 movieQT] duration];

    timeDebut.timeValue = [maVueVideo1 infoIn].doubleValue;
    timeDuree.timeValue = [maVueVideo1 infoOut].doubleValue - [maVueVideo1 infoIn].doubleValue;

    QTTimeRange movieRange;
    if (timeDebut.timeValue == timeDuree.timeValue) { // si pas de séléction de range
    movieRange = QTMakeTimeRange(QTZeroTime, [[maVueVideo movieQT] duration]);
    }else{
    movieRange = QTMakeTimeRange(timeDebut, timeDuree);
    }

    //position d'insertion
    QTTime timeInsert = [[maVueVideo movieQT]duration];//init les flags
    //insertion au currentTime de la 1ere movie
    timeInsert.timeValue = [[maVueVideo movieQT]currentTime].timeValue - [[maVueVideo1 movieQT]currentTime].timeValue;
    //si val <0 => ne pas mettre ds movie de 0 à  val
    if (timeInsert.timeValue < 0) {

    float val = timeInsert.timeValue;
    int valInt = val;
    movieRange.time.timeValue = abs (valInt);
    movieRange.duration.timeValue = [[maVueVideo1 movieQT] duration].timeValue + val;// val est négatif
    timeInsert.timeValue = 0; // on se place au début
    }

    // make sure the movie is editable
    [[maVueVideo movieQT] setAttribute:[NSNumber numberWithBool:YES] forKey:QTMovieEditableAttribute];

    NSArray* theTracks1 = [[maVueVideo1 movieQT] tracksOfMediaType:QTMediaTypeVideo];
    QTTrack *maTrack1 = [theTracks1 objectAtIndex:0];
    NSArray* theTracks0 = [[maVueVideo movieQT] tracksOfMediaType:QTMediaTypeVideo];
    QTTrack *maTrack0 = [theTracks0 objectAtIndex:0];


    //changer taille
    NSSize movieSize1 = [[[maVueVideo1 movieQT] attributeForKey:@QTMovieNaturalSizeAttribute] sizeValue];
    NSSize movieSize0 = [[[maVueVideo movieQT] attributeForKey:@QTMovieNaturalSizeAttribute] sizeValue];
    NSSize trackSize0 = [[maTrack0 attributeForKey:@QTTrackDimensionsAttribute] sizeValue];
    float rapportX = movieSize1.height / movieSize0.height;
    float rapportY = movieSize1.width / movieSize0.width;
    float valY = trackSize0.height / rapportX;
    float valX = trackSize0.width / rapportY;
    NSSize size = NSMakeSize(valX, valY);

    NSValue* sizeValue=[NSValue valueWithSize:size];
    [maTrack1 setAttribute:sizeValue forKey:QTTrackDimensionsAttribute];
    /*
    //Augmente la résolution pour une sauvegarde mais le tps de save est + long
    trackSize0.width = trackSize0.width *3;
    trackSize0.height = trackSize0.height *3;
    NSValue* sizeValueTest1 = [NSValue valueWithSize:trackSize0];
    [maTrack0 setAttribute:sizeValueTest1 forKey:QTTrackDimensionsAttribute];
    size.height = size.height * 3;
    size.width = size.width * 3;
    NSValue* sizeValueTest2 = [NSValue valueWithSize:size];
    [maTrack1 setAttribute:sizeValueTest2 forKey:QTTrackDimensionsAttribute];
    */



    //transparence
    [self trackOpacity:maTrack1 monOpacity:126];//opacité moyenne

    //inserer
    [[maVueVideo movieQT] insertSegmentOfTrack:maTrack1
    timeRange:movieRange
    atTime:timeInsert];

    //retour transparence
    [self trackOpacity:maTrack1 monOpacity:1];//opacité 0

    //on change le titre du bouton
    [b_superpose setTitle:@Normal];


    SI ça peut servir à  quelqu'un

  • Merci pour ton retour.


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