3

これはしばらくの間、私を夢中にさせてきました。

QTKit / QTMovie についての知識はほとんどありませんが、ビデオをプレビューし、Handbrake で 3 秒バージョンを保存できる小さな Cocoa アプリを作成しました。

問題は、QTKit の現在の時刻 (QTTime) をフレーム番号に変換することです。

Quicktime Player 7 でビデオを開くと、標準時間または現在のフレームを表示するように選択できます。そのフレーム番号を Handbrake 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]);
    }
}

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

4

1 に答える 1

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 に特定のフレーム (--start-at frame:xxx) から 3 秒のクリップを保存するように指示するという、特に私が望んでいることについては、魅力のように機能します。

今、自分の賞金をハズできますか?

于 2013-03-11T12:28:20.883 に答える