我发现很难确定如何使用 QTKit 或 OS X 中较旧的 QuickTime API(面向 10.5+)从 QuickTime 影片中提取以下信息:
- 使用的视频和音频编解码器(例如“H.264”)
- 视频和音频比特率(例如 64 kbps)
- 尺寸
我遇到的具体问题是:
1) 我发现的视频和音频编解码器名称的唯一方法涉及使用 ImageDescriptionHandle
和 SoundDescriptionHandle
,这两者似乎都需要 Carbon -仅限方法 NewHandleClear
和 DisposeHandle
,并且仅需要 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/