2012-01-12 5 views
2

QTKitを使用して画像のリストをQuickTimeムービーに変換しようとしています。私は29.97にフレームレートを得ること以外はすべてを行う方法を考え出しました。QTMakeが29.97でQTMakeTimeが

QTTime frameDuration = QTMakeTime(1001, 30000) 

は、しかし、この方法で、または(1000年、29970)を使用して、すべての私の試みは、まだ30fpsの時に映画を作る:他のフォーラムやリソースを通じて、トリックは、このようなものを使用しているようです。この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

[OK]を、あなたのコードのおかげで、私はこの問題を解決することができます。 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とタイムスケールを印刷するには、あなたも行うことができます:必要に応じて、あなたのコードがない場合は、より良い見ることができます

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

この方法です。

希望に役立ちます! よろしくお願いします。

+0

パーフェクト、それは素晴らしい作品! ご協力いただきありがとうございます! – bchapman

+0

大歓迎です! – guitarflow

0

私はあなたが何をしようとしてやったことがないが、私はどのように私は推測する目的のフレームレートを取得することを伝えることができます。 ムービーの現在のタイミング情報を "尋ねる"場合、常にtimeScaleとtimeValueを含むQTTime構造体が取得されます。 29.97 fpsビデオの場合、timeScaleは2997になります(たとえば、下記を参照)。 これは1秒あたりの「単位」の量です。

したがって、ムービーの再生位置が現在正確に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

関連する問題