从QTKit获取帧数(类似于Quicktime Player 7)

3

这件事情一直困扰着我。

我对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);
    }
}
但是我得到的只有:
帧编号为-1 / 时间码数据为0:2:0.0
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秒剪辑。

现在我可以拥有自己的奖励了吗?


@martinjbaker - 嗯,我正在使用QTKit和在QTMovieView中播放的QTMovie。诚然,为了使其工作,似乎我必须导入Quicktime框架,但这只是达到目的的手段 :) - Andre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接