我发现很难确定如何从QuickTime影片中提取以下信息,使用QTKit或OS X中的旧版QuickTime API,目标是10.5 +:
我遇到的具体问题是:
1)我发现的视频和音频编解码器名称的唯一方法是使用ImageDescriptionHandle
和SoundDescriptionHandle
,这两种方法似乎都需要使用纯碳方法{{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)”。有没有更好的方法来确定实际的电影尺寸?
提前致谢!
答案 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);