【问题标题】:Get frame number (like Quicktime Player 7) from QTKit从 QTKit 获取帧号(如 Quicktime Player 7)
【发布时间】:2013-03-07 15:56:54
【问题描述】:

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

我对 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

【问题讨论】:

    标签: cocoa video quicktime qtkit


    【解决方案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 框架,但这只是结束的手段:)
    猜你喜欢
    • 2011-03-01
    • 1970-01-01
    • 2011-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多