这已经让我发疯了一段时间了。
我对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秒的剪辑。
我现在可以得到我自己的赏金吗?