2012-01-12 3 views
2
:

QTKit을 사용하여 이미지 목록을 퀵타임 동영상으로 변환하려고합니다. 나는 프레임 속도를 29.97로 잡는 것 외에는 모든 것을하는 방법을 알아 냈습니다.QTMake 시간 : 29.97 (QTMakeTime)

QTTime frameDuration = QTMakeTime(1001, 30000) 

는 그러나,이 방법, 또는 (1000, 29970)를 사용하여 내 모든 시도는 여전히 초당 30 프레임에서 동영상을 제작 : 다른 포럼과 자원을 통해 트릭는 다음과 같이 사용하는 것으로 보인다. 이 fps는 Quicktime 플레이어로 재생할 때 표시됩니다.

아이디어가 있으십니까? 한 번 제작 된 전체 영화의 프레임 속도를 설정하는 다른 방법이 있습니까?

는 여기에 몇 가지 예제 코드입니다 : 당신이 뭘 하려는지 해본 적이

NSDictionary *outputMovieAttribs = [NSDictionary dictionaryWithObjectsAndKeys:@"jpeg", QTAddImageCodecType, [NSNumber numberWithLong:codecHighQuality], QTAddImageCodecQuality, nil]; 
QTTime frameDuration = QTMakeTime(1001, 30000); 
QTMovie *outputMovie = [[QTMovie alloc] initToWritableFile:@"/tmp/testing.mov" error:nil]; 
[outputMovie setAttribute:[NSNumber numberWithBool:YES] forKey:QTMovieEditableAttribute]; 
[outputMovie setAttribute:[NSNumber numberWithLong:30000] forKey:QTMovieTimeScaleAttribute]; 

if (!outputMovie) { 
    printf("ERROR: Chunk: Could not create movie object:\n"); 
} else { 
    int frameID = 0; 
    while (frameID < [framePaths count]) { 
     NSAutoreleasePool *readPool = [[NSAutoreleasePool alloc] init]; 
     NSData *currFrameData = [NSData dataWithContentsOfFile:[framePaths objectAtIndex:frameID]]; 
     NSImage *currFrame = [[NSImage alloc] initWithData:currFrameData]; 

     if (currFrame) { 
      [outputMovie addImage:currFrame forDuration:frameDuration withAttributes:outputMovieAttribs]; 
      [outputMovie updateMovieFile]; 
      NSString *newDuration = QTStringFromTime([outputMovie duration]); 
      printf("new Duration: %s\n", [newDuration UTF8String]); 
      currFrame = nil; 
     } else { 
      printf("ERROR: Could not add image to movie"); 
     } 
     frameID++; 
     [readPool drain]; 
    } 
} 

NSString *outputDuration = QTStringFromTime([outputMovie duration]); 
printf("output Duration: %s\n", [outputDuration UTF8String]); 

답변

0

좋습니다. 코드 덕분에 문제를 해결할 수있었습니다. Atom Inpector라는 개발 도구를 사용하여 현재 작업중인 영화와 완전히 다른 모습의 데이터 구조를 보았습니다. 제가 말했듯이, 당신이하는 것처럼 이미지로 영화를 만들지는 못했지만, 나중에 영화를 만들고 싶다면이 방법이 아닌 것 같습니다. QuickTime은 클립을 "Photo-JPEG"로 인식하므로 일반 동영상 파일이 아닙니다. 그 이유는 추가 된 사진이 영화 트랙에 추가되는 것이 아니라 영화의 어딘가에 추가되는 것입니다. 이것은 Atom Inspector에서도 볼 수 있습니다. "movieTimeScaleAttribute"를 사용하면 사용되지 않는 timeScale을 설정합니다!

문제를 해결하기 위해 코드를 조금만 변경했습니다.

NSDictionary *outputMovieAttribs = [NSDictionary dictionaryWithObjectsAndKeys:@"jpeg", 
         QTAddImageCodecType, [NSNumber numberWithLong:codecHighQuality], 
         QTAddImageCodecQuality,[NSNumber numberWithLong:2997], QTTrackTimeScaleAttribute, nil]; 

QTTime frameDuration = QTMakeTime(100, 2997); 
QTMovie *outputMovie = [[QTMovie alloc] initToWritableFile:@"/Users/flo/Desktop/testing.mov" error:nil]; 
[outputMovie setAttribute:[NSNumber numberWithBool:YES] forKey:QTMovieEditableAttribute]; 
[outputMovie setAttribute:[NSNumber numberWithLong:2997] forKey:QTMovieTimeScaleAttribute]; 

다른 모든 것은 변경되지 않습니다. 오, 그건 그렇고. timeValue 및 timeScale을 인쇄하려면 다음을 수행 할 수도 있습니다.

NSLog(@"new Duration timeScale : %ld timeValue : %lld \n", 
     [outputMovie duration].timeScale, [outputMovie duration].timeValue); 

이렇게하면 원하는대로 코드를 볼 수 있습니다.

희망 하시겠습니까? 감사합니다.

+0

완벽 해, 잘 작동합니다! 도움 주셔서 감사합니다. – bchapman

+0

대단히 환영합니다! – guitarflow

0

,하지만 난 어떻게 생각 원하는 프레임 속도를 얻을하는 방법을 알 수 있습니다. 동영상에 현재 타이밍 정보를 "요청"하는 경우 항상 timeScale 및 timeValue가 포함 된 QTTime 구조가 생성됩니다. 29.97fps 비디오의 경우 timeScale이 2997이됩니다 (예 : 아래 참조). 이것은 초당 "단위"의 양입니다.

동영상의 재생 위치가 현재 정확히 2 초인 경우 timeValue는 5994입니다. 2997/100 = 29.97 fps이므로 frameDuration은 100입니다.

QuickTime에서는 부동 소수점 값을 처리 할 수 ​​없으므로 모든 값을 곱하기 값으로 변환해야합니다. 그런데 100을 사용할 필요가 없으며 1000과 29970의 timeScale, 200을 프레임 기간과 5994 timeScale으로 사용할 수도 있습니다. 이미 존재하는 클립에서 타이밍 정보를 읽으면 얻을 수있는 것부터 내가 말할 수있는 것이 전부입니다. 당신은이 방법이 효과가 없다고 썼지 만, 이것이 내부적으로 QuickTime이 작동하는 방법입니다. 다시 살펴보아야합니다!

감사합니다.

+0

문제를 격리하기 위해 더 많은 노력을 기울였습니다. 내가 겪고있는 문제는 QTMovie의 addImage와 관련된 것 같습니다. QTTime은 QTMakeTime (1001, 30000)을 사용하여 29.97 시간을 생성 할 수 있습니다.그러나이 지속 시간을 addImage에 제공하면 1000/30000으로 반올림됩니다. addImage를 사용할 때마다 지속 시간을 인쇄하는 테스트 코드를 만들었습니다. 매번 지속 시간이 1001에 비해 1000만큼 증가했습니다. – bchapman

+0

흠, 이상합니다. 제가 지금까지 작업해온 29.97fps의 모든 영화는 2997의 timeScale과 100의 frameDuration을가집니다. 제 생각에 이것은 30000, 1001 계산보다 이해하기 쉽지만 이론적으로는 동일해야합니다. 몇 가지 코드를 공유 하시겠습니까? 나는 그 오류가 다른 곳에서있을 것이라고 확신한다. 베스트 – guitarflow

+0

샘플 코드를 추가했습니다. 당신의 도움을 주셔서 감사합니다! – bchapman