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