Обмен QTMovieView на NSWindow вызывает мерцание - PullRequest
0 голосов
/ 07 марта 2012

Я хотел бы сделать следующее:

  • воспроизвести мастер-фильм быстрого времени (prores или pjpg) на одном экране (со звуком)
  • воспроизвести другой подчиненный фильм быстрого времени (prores или pjpg) на другом экране, синхронно с мастером
  • , когда я нажимаю влево или вправо, циклически переключаясь между различными ведомыми фильмами

Вот что я сделал:

  • создать NSWindow для каждого экрана
  • создать массив QTMovies (фактически массив массивов на экран)
  • создать массив QTMovieViews (фактически массивмассивов на экран)
  • нормально воспроизводить мастер QTMovie
  • настроить NSTimer для обновления текущего времени подчиненного фильма по времени мастер-фильмов
  • , если нажата клавиша, поменять местамипредставление содержимого окна с новым QTMovieView

мой полный код находится на http://codepad.org/gDsJLPAy

Все это работает, однако, когда я переключаю видео, я получаю однокадровую вспышкустарый кадр видео переключается на.Т.е., если я запускаю приложение на 50 кадров и переключаюсь на SlaveVideo2, я мельком вижу SlaveVideo2 кадр 0, а затем он сразу же переходит на SlaveVideo2 кадр 50 и продолжает работу как обычно.Если после 20 кадров я переключаюсь обратно на SlaveVideo1, я мельком вижу SlaveVideo1 кадр 50, а затем он переходит на SlaveVideo1 кадр 70 и продолжает работу как обычно.

Я схожу с ума, пытаясь понять это.Я пробовал все виды обновления, методы отображения, но безрезультатно.Любые идеи о том, как я могу это исправить?

PS Вы можете увидеть в timerFireMethod, если я обновляю все ведомые фильмы все время (вместо только активного), я не получаю мерцание.Очевидно, что это не решение, поскольку я постоянно ищу тонны видео, которые слишком тяжелые и ненужные!

PPS Я попытался воссоздать настройку в Quartz Composer, и у меня точно такая же проблема.

Я нахожусь на 10.7.3

1 Ответ

0 голосов
/ 15 марта 2012

Ради архивов я опубликую свои выводы здесь.

Я не смог найти прямого решения этой проблемы.Если подчиненный фильм приостановлен, когда я делаю его просмотр активным - даже если я начинаю воспроизводить фильм немного раньше - когда он становится видимым, он сначала показывает старый кадр.Обходное решение, которое я нашел, состояло в том, чтобы фильм постоянно воспроизводился (что отстой).

Однако я нашел это https://developer.apple.com/library/mac/#documentation/QuickTime/RM/MovieInternals/MTTimeSpace/B-Chapter/2MovieTimeandSpace.html

, вызвав GetMovieTimeBase в главном фильме и применив SetTimeBaseMasterTimeBaseдля подчиненного фильма он позволяет синхронизировать два фильма на внутренней стороне, без необходимости вручную синхронизировать их.Таким образом, весь код синхронизации может быть уменьшен до:

-(void)setLayerIndex:(int)i {
    // make sure target index is within bounds
    if(i<0) i=[[movies objectAtIndex:1] count]-1;
    else if(i>[[movies objectAtIndex:1] count]-1) i=0;

    // pause all slave views
    [[viewers objectAtIndex:1] makeObjectsPerformSelector:@selector(pause:) withObject:self];

    // save current index
    currentLayerIndex = i;

    // sync frame of new slave movie
    [[self currentSlaveMovie] setCurrentTime:[masterMovie currentTime]];

    // set windows view to QTView
    [[windows objectAtIndex:1] setContentView:[self currentSlaveView]];

    // set timebase of slave to timebase of master
    TimeBase masterTimeBase = GetMovieTimeBase([masterMovie quickTimeMovie]);
    TimeValue masterTimeScale = GetMovieTimeScale([masterMovie quickTimeMovie]);
    TimeRecord slaveZero;
    TimeValue slaveZeroTV = GetTimeBaseStartTime(masterTimeBase, masterTimeScale, &slaveZero); 
    SetMovieMasterTimeBase([[self currentSlaveMovie] quickTimeMovie], masterTimeBase, &slaveZero);    

    // play master movie
    [masterViewer play:self];

    // play slave movie
    [[self currentSlaveView] play:self];

}

...