cocoa - 获取 QuickTime 元数据 : codecs, 比特率、维度

标签 cocoa quicktime macos-carbon qtkit

我发现很难确定如何使用 QTKit 或 OS X 中较旧的 QuickTime API(面向 10.5+)从 QuickTime 影片中提取以下信息:

  • 使用的视频和音频编解码器(例如“H.264”)
  • 视频和音频比特率(例如 64 kbps)
  • 尺寸

我遇到的具体问题是:

1) 我发现的视频和音频编解码器名称的唯一方法涉及使用 ImageDescriptionHandleSoundDescriptionHandle,这两者似乎都需要 Carbon -仅限方法 NewHandleClearDisposeHandle,并且仅需要 32 位 Media 对象。有没有一种更现代的方法,不需要Carbon框架并且兼容64位?

2) 对于比特率,我获取 GetMediaDataSizeTime64 并除以轨道持续时间(以秒为单位)。但是,对于一个音轨,该方法返回 128 kbps 的值,但使用音轨媒体和 kQTAudioPropertyID_FormatString 参数调用 QTSoundDescriptionGetProperty 会返回一串“64 kbps”。为什么这两个值会不同?有没有更好的方法来计算轨道的比特率?

3) 对于某一特定电影,[QTMovie movieAttributes] objectForKey:QTMovieNaturalSizeAttribute][QTTrack attributeForKey:QTTrackDimensionsAttribute] 返回的尺寸不正确。返回的尺寸为 720 x 480,但 QuickTime Player 中的实际 View 尺寸为 640 x 480。播放器的信息窗口显示尺寸字符串“720 x 480 (640 x 480)”。有没有更好的方法来确定实际的电影尺寸?

提前致谢!

最佳答案

此元数据可以从[电影轨道] QTTrack* 对象获取。

1)通过轨道枚举可以找到视频轨道和音频轨道。

QTMedia* media = [轨道媒体];

if ([media hasCharacteristic:QTMediaCharacteristicVisual])
{
    // video track
}

if ([media hasCharacteristic:QTMediaCharacteristicAudio])
{
    // audio track
}

有关编解码器的信息:

NSString* summary = [track attributeForKey:QTTrackFormatSummaryAttribute];

2) 要计算电影的比特率,您需要计算所有轨道的总数据大小并将其除以电影持续时间。

枚举轨道得到每个轨道的数据大小:

QTMedia* media = [track media];
Track quicktimeTrack = [track quickTimeTrack];
TimeValue startTime = 0;
TimeValue duration = GetTrackDuration(quicktimeTrack);
long trackDataSize = GetTrackDataSize(quicktimeTrack, startTime, duration);

3) 获取电影的尺寸

NSSize movieSize = [(NSValue*)[[movie movieAttributes] objectForKey:QTMovieNaturalSizeAttribute] sizeValue];

但是,视频轨道的实际尺寸可能有所不同:

Fixed width = 0;

Fixed height = 0;

GetTrackDimensions(videoTrack, &width, &height);

关于cocoa - 获取 QuickTime 元数据 : codecs, 比特率、维度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7664715/

相关文章:

除非打开 Quicktime,否则 AVCaptureDevice.devices() 不会列出 iOS 设备

c++ - 从另一个线程调用 CFRunLoopStop 是否安全?

objective-c - EMKey 链问题

iphone - 复制 NSMutableArray 时出现问题

macos - 实例变量(NSString)在自定义类中不会改变

cocoa - 从 Cocoa 中的其他 nib(即 Interface Builder)加载 nib

c++ - 从 OSx 上的自定义 url 打开 carbon c++ 程序

objective-c - 当我设置新图像时,如何自动调整 NSPanel (和 NSImageView)的大小?

c++ - 如何在 OSX PlaySoftMidi 示例中增加音量。

objective-c - QTMovie 内容循环中的逐渐内存泄漏