从QTKit获取帧编号(如Quicktime Player 7)

时间:2013-03-07 15:56:55

标签: cocoa video quicktime qtkit

这让我疯了一段时间。

我对QTKit / QTMovie知之甚少,但已经创建了一个小型Cocoa应用程序来预览视频,并让你用Handbrake保存它的3秒版本。

问题是将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上的最终帧数相同。

我认为,我需要的是样本计数的值,在我所在的特定时间点,而不是总数。

有关我如何能够得到它的任何想法?

谢谢!

P.S:

还尝试使用以下内容:

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 个答案:

答案 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)。

我现在可以冒犯自己的赏金吗?