获取QuickTime元数据:编解码器,比特率,维度

时间:2011-10-05 16:40:18

标签: cocoa quicktime macos-carbon qtkit

我发现很难确定如何从QuickTime影片中提取以下信息,使用QTKit或OS X中的旧版QuickTime API,目标是10.5 +:

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

我遇到的具体问题是:

1)我发现的视频和音频编解码器名称的唯一方法是使用ImageDescriptionHandleSoundDescriptionHandle,这两种方法似乎都需要使用纯碳方法{{1 }和NewHandleClear,以及只需要32位的Media对象。是否有更现代的方法不需要Carbon框架并且是64位兼容的?

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

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

提前致谢!

1 个答案:

答案 0 :(得分:3)

可以从[movie tracks] QTTrack*个对象获取此元数据。

1)通过曲目列举,您可以找到视频和音轨。

QTMedia* media = [track 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);