2013-03-07 3 views
3

이것은 지금 당황하고 있습니다.QTKit에서 프레임 번호 (Quicktime Player 7과 같음)를 가져옵니다.

QTKit/QTMovie에 대한 지식이 거의 없지만 비디오를 미리보고 Handbrake로 3 초 버전을 저장할 수있는 작은 코코아 응용 프로그램을 만들었습니다.

현재 문제는 QTKit (QTTime)의 현재 시간을 프레임 번호로 변환하는 것입니다 (가장 가까운 초로 보임).

Quicktime Player 7에서 비디오를 열면 표준 시간 또는 현재 프레임을 볼 수 있습니다. 프레임 번호를 직접 핸드 브레이크 CLI에 전달하면 미리보기가 매우 정확 해집니다.

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]); 
    } 
} 

나는 퀵타임 플레이어에 대한 최종 프레임 번호와 동일한 샘플의 총 수를 얻을 내가 필요로 무엇 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); 
    } 
} 

을하지만 얻을 모두이다

frameNum -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); 

작품, (특정 프레임에서 3 초 클립을 저장하는 수동 브레이크 CLI를 이야기하는 것입니다 - -start-at frame : xxx).

지금 현상금에 어떤 위험이 있습니까?

+0

그러나 이것은 QTKit가 아닙니다. – martinjbaker

+0

@martinjbaker - 음, QTMovieView에서 QTMovie를 재생하면서 QTKit을 사용하고 있습니다. 허락하신다면, QuickTime 프레임 워크를 가져와야 할 것 같지만, 결국에는 끝입니다. :) – Andre