Получить метаданные QuickTime: кодеки, битрейты, размеры - PullRequest
1 голос
/ 05 октября 2011

Мне трудно определить, как извлечь следующую информацию из фильма QuickTime, используя QTKit или более старые API QuickTime в OS X, нацеленные на 10,5 +:

  • Используемые видео и аудио кодеки (например, "H.264")
  • Скорость передачи видео и аудио (например, 64 кбит / с)
  • Размеры

Конкретные проблемы, с которыми я столкнулся:

1) Единственное средство для имен видео и аудиокодеков, которое я обнаружил, заключается в использовании ImageDescriptionHandle и SoundDescriptionHandle, оба из которых, по-видимому, требуют только углеродных методов NewHandleClear и DisposeHandle , а также требует только 32-битный объект Media. Есть ли более современный метод, который не требует Carbon Framework и совместим с 64-битной версией?

2) Для битрейта я получаю GetMediaDataSizeTime64 и делю на длительность трека в секундах. Однако в случае одной звуковой дорожки этот метод возвращает значение 128 кбит / с, но вызов QTSoundDescriptionGetProperty с носителем звуковой дорожки и параметром kQTAudioPropertyID_FormatString возвращает строку "64 кбит / с". Почему эти два значения будут разными? Есть ли лучший способ рассчитать битрейт трека?

3) Размеры, возвращаемые [QTMovie movieAttributes] objectForKey:QTMovieNaturalSizeAttribute] или [QTTrack attributeForKey:QTTrackDimensionsAttribute], являются неправильными для одного конкретного фильма. Возвращаемый размер - 720 x 480, но фактический размер представления в QuickTime Player - 640 x 480. В окне информации проигрывателя отображается строка размера «720 x 480 (640 x 480)». Есть ли лучший способ определить фактические размеры фильма?

Заранее спасибо!

1 Ответ

3 голосов
/ 06 октября 2011

Эти метаданные могут быть получены из [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);
...