2012-03-06 3 views
0

Что я хотел бы сделать это:Перекачка QTMovieView на NSWindow вызывает мерцание

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

Это то, что я сделал:

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

мой полный код на http://codepad.org/gDsJLPAy

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

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

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

P.P.S. Я попытался воссоздать настройку в Quartz Composer, и я получаю точно такую ​​же проблему. Смотрите мои настройки QTZ здесь http://yfrog.com/jt8evp

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

ответ

0

Ради архивов я выложу мои выводы здесь.

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

Однако я нашел это 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]; 

}

Смежные вопросы