我一直在扯头发。
我在这里发现了一些东西,但实际上似乎什么都没用。而且文件是非常有限的。
我想知道的是如何从TimeCo轨道获得ObjtoC C中的QuiTimes电影的起始时间代码,并从中获得人类可读的输出。
我发现这个:
SMPTE TimeCode from Quick Time
它在32位模式下工作得很好。但是由于QuiTime API,它不能在64位模式下工作。我需要将其合并到的软件已经并且必须继续运行64位。
我在这里失去理智了。有人知道这些api吗?
最终,这里的目标是找出QuxTime的起始时间码,因为它需要在FCP-XXML文件中设置偏移量。没有它,视频文件就没有音频了(或者说,它只是滑了很多)。
最佳答案
使用avfoundation框架而不是quicktime。文档中对播放器初始化进行了详细说明:https://developer.apple.com/library/mac/#documentation/AudioVideo/Conceptual/AVFoundationPG/Articles/02_Playback.html#//apple_ref/doc/uid/TP40010188-CH3-SW2
将avasset加载到内存中后,可以通过读取时间码轨迹(如果存在)的内容来提取第一个样本帧编号(timestampframe):
long timeStampFrame = 0;
for (AVAssetTrack * track in [_asset tracks]) {
if ([[track mediaType] isEqualToString:AVMediaTypeTimecode]) {
AVAssetReader *assetReader = [AVAssetReader assetReaderWithAsset:_asset error:nil];
AVAssetReaderTrackOutput *assetReaderOutput = [AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:track outputSettings:nil];
if ([assetReader canAddOutput:assetReaderOutput]) {
[assetReader addOutput:assetReaderOutput];
if ([assetReader startReading] == YES) {
int count = 0;
while ( [assetReader status]==AVAssetReaderStatusReading ) {
CMSampleBufferRef sampleBuffer = [assetReaderOutput copyNextSampleBuffer];
if (sampleBuffer == NULL) {
if ([assetReader status] == AVAssetReaderStatusFailed)
break;
else
continue;
}
count++;
CMBlockBufferRef blockBuffer = CMSampleBufferGetDataBuffer(sampleBuffer);
size_t length = CMBlockBufferGetDataLength(blockBuffer);
if (length>0) {
unsigned char *buffer = malloc(length);
memset(buffer, 0, length);
CMBlockBufferCopyDataBytes(blockBuffer, 0, length, buffer);
for (int i=0; i<length; i++) {
timeStampFrame = (timeStampFrame << 8) + buffer[i];
}
free(buffer);
}
CFRelease(sampleBuffer);
}
if (count == 0) {
NSLog(@"No sample in the timecode track: %@", [assetReader error]);
}
NSLog(@"Processed %d sample", count);
}
}
if ([assetReader status] != AVAssetReaderStatusCompleted)
[assetReader cancelReading];
}
}
这比quicktime api稍微复杂一点,上面的代码必须有一些改进,但它对我有效。
关于objective-c - 如何在64位的Objective-C中获取Quicktime-Movie的开始时间码(SMPTE)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12083325/