这已经让我发疯了一段时间了。

我对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的最终帧数相同。

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

关于我可能如何获得这一点的任何想法?

谢谢!

附言:

还尝试使用以下方法:


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

最佳答案

是的,我找到了一种方法!感谢二进制领主!

这是我的解决方案:


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秒的剪辑。

我现在可以得到我自己的赏金吗?

07-28 07:49