2013-03-07 4 views
3

Это уже давно заводило меня на орехи.Получить номер кадра (например, Quicktime Player 7) от QTKit

У меня очень мало знаний о QTKit/QTMovie, но вы создали небольшое приложение Cocoa, которое просматривает видео и позволяет вам сохранить 3-секундную версию с Handbrake.

Проблема заключается в переводе текущего времени на QTKit (QTTime), которое довольно неопределенно (кажется, является ближайшим вторым), к номеру кадра.

Если вы открываете видеоролик в Quicktime Player 7, вы можете выбрать стандартное время или текущий кадр. Если я передаю этот номер кадра непосредственно в CLI Handbrake, предварительный просмотр выходит суперточно.

Итак, я пытался найти способ преобразования QTTime в абсолютный номер кадра, который, по-видимому, основан на образцах в QTMedia (настолько запутанным).

Например, с этим:

NSArray *videoTracks = [movie tracksOfMediaType:QTMediaTypeVideo]; 
QTTrack *tcTrack = [videoTracks objectAtIndex:0]; 

if (tcTrack != nil) 
{  
    QTMedia * media = [tcTrack media]; 
    if (media != nil) 
    { 
     NSLog(@"sample : %@", [media attributeForKey:QTMediaSampleCountAttribute]); 
    } 
} 

Я получаю общее количество образцов, которая является такой же, как окончательный номер кадра в QuickTime Player 7.

Что мне нужно , Я думаю, это значение для отсчета выборки, в конкретный момент времени, где я есть, а не итог.

Любые мысли о том, как я могу это получить?

Спасибо!

PS:

пытался также с помощью следующего:

NSArray *videoTracks = [movie tracksOfMediaType:QTMediaTypeVideo]; 
QTTrack *tcTrack = [videoTracks objectAtIndex:0]; 

if (tcTrack != nil) 
{  
    QTMedia * media = [tcTrack media]; 
    if (media != nil) 
    { 
     NSLog(@"sample : %@", [media attributeForKey:QTMediaSampleCountAttribute]); 

     Media qtMedia = [media quickTimeMedia]; 
     MediaHandler mh = GetMediaHandler(qtMedia); 

     long frameNum; 

     TimeCodeDef tcDef; 
     TimeCodeRecord tcData; 
     UserData srcRefH; 

     TCTimeCodeToFrameNumber(mh, &tcDef, &tcData, &frameNum); 

     NSLog(@"frameNum %ld", frameNum); 
     NSLog(@"tcData %d:%d:%d.%d", tcData.t.hours, tcData.t.minutes, tcData.t.seconds, tcData.t.frames); 
    } 
} 

Но все это я получаю:

-1 ном-/ tcData 0: 2: 0,0

ответ

1

Правильно, я нашел способ сделать это! Спасибо двоичному лорду!

Вот мое решение:

QTTime time = [movie currentTime]; 

NSArray *videoTracks = [movie tracksOfMediaType:QTMediaTypeVideo]; 
QTTrack *tcTrack = [videoTracks objectAtIndex:0]; 

Track track = tcTrack.quickTimeTrack; 

Media media = GetTrackMedia(track); 

SInt64 frameNum; 

MediaDisplayTimeToSampleNum(media, 
          time.timeValue, 
          &frameNum, 
          NULL, 
          NULL); 

NSLog(@"Save frame number %lli", frameNum); 

работает как шарм, особенно за то, что я хочу, это тоже, что сказать Handbrake CLI сохранить 3 второго клипа с определенного кадра (- -start-at frame: xxx).

Могу ли я окунуться в свою собственную щедрость?

+0

Это не QTKit. – martinjbaker

+0

@martinjbaker - Ну, я использую QTKit с QTMovie, играющим в QTMovieView. Конечно, для этого, кажется, мне нужно импортировать среду Quicktime, но это просто средство для конца :) – Andre