这让我疯了一段时间。
我对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); } }
但我得到的只是:
frameNum -1 / tcData 0:2:0.0
答案 0 :(得分: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从特定帧保存3秒的剪辑(--start-at frame:xxx)。
我现在可以冒犯自己的赏金吗?