【问题标题】:Get QuickTime metadata: codecs, bitrates, dimensions获取 QuickTime 元数据:编解码器、比特率、尺寸
【发布时间】:2011-10-05 16:40:18
【问题描述】:

我发现很难确定如何从 QuickTime 电影中提取以下信息,无论是使用 QTKit 还是 OS X 中针对 10.5+ 的旧版 QuickTime API:

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

我遇到的具体问题是:

1) 我发现的视频和音频编解码器名称的唯一方法是使用 ImageDescriptionHandleSoundDescriptionHandle,这两种方法似乎都需要 Carbon-only 方法 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 中的实际视图大小为 640 x 480。播放器的信息窗口显示大小字符串“720 x 480 (640 x 480)”。有没有更好的方法来确定电影的实际尺寸?

提前致谢!

【问题讨论】:

    标签: cocoa quicktime macos-carbon qtkit


    【解决方案1】:

    这个元数据可以从[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) 要计算电影的比特率,您需要计算所有轨道的总数据大小,然后除以电影时长。

    通过tracks枚举得到每个track的数据大小:

    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);
    

    【讨论】:

    • 您可能希望从检查“QTMediaCharacteristicVisual”的行的末尾删除分号。如果有人复制并粘贴该代码,它将始终进入视频轨道块。
    猜你喜欢
    • 1970-01-01
    • 2020-10-19
    • 2017-06-10
    • 1970-01-01
    • 2017-11-02
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多