gpt4 book ai didi

objective-c - 如何在 64 位的 Objective-C 中获取 Quicktime 电影的开始时间码 (SMPTE)?

转载 作者:搜寻专家 更新时间:2023-10-30 20:25:55 25 4
gpt4 key购买 nike

我一直在为此烦恼。

我在这里找到了一些东西,但似乎没有任何效果。而且文档真的很有限。

我在这里想弄清楚的是如何从时间码轨道获取 Objective-C 中 Quicktime 电影的开始时间码,并从中获取人类可读的输出。

我发现了这个: SMPTE TimeCode from Quick Time

它在 32 位模式下完美运行。但由于 Quicktime API,它不能在 64 位模式下工作。我需要将它合并到的软件已经并且必须继续运行 64 位。

我在这里失去了理智。有人知道这些 API 吗?

最终,这里的目标是找出 Quicktime 的开始时间码,因为它需要在 FCP-X XML 文件中设置偏移量。没有它,视频文件将没有音频(或者,实际上,它只是下滑了很多)。

最佳答案

使用 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 电影的开始时间码 (SMPTE)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12083325/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com