从QTKit获取帧数(如Quicktime Player 7)



这已经让我抓狂一段时间了

我对QTKit/QTMovie知之甚少,但创建了一个小Cocoa应用程序,可以预览视频,并让您保存3秒的版本。

问题是将QTKit (QTTime)上的当前时间转换为帧数,这是相当模糊的(似乎是最接近的秒)。

如果您在Quicktime Player 7中打开视频,您可以选择查看标准时间或当前帧。如果我将帧数直接传递给Handbrake命令行,则预览结果非常准确。

所以我一直在试图找到一种方法将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

对,我找到了一个方法!感谢二进制主!

这是我的解决方案:

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

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

相关内容

  • 没有找到相关文章