Получение кодеков OSType из формата UTType в pyobjc - PullRequest
1 голос
/ 18 февраля 2012

В настоящее время я пишу сценарий, который обрабатывает пакеты быстрых времен, и я впервые использую pyobjc (я написал только один действительно простой сценарий в реальной цели-c). Мне нужно иметь возможность определить четырехсимвольный OSType кодека для QuickTime, чтобы я мог правильно использовать один и тот же кодек для изображений, используя addImage_forDuration_withAttributes _ ()

Поскольку у pyobjc есть доступ только к инфраструктуре obj-c, я не могу получить к ней доступ ни к одной из функций C. Я могу получить строку формата UTType кодека:

from objc import YES, NO, nil
from Cocoa import *
from QTKit import *

movieAttribs = {
    QTMovieOpenAsyncOKAttribute: NSNumber.numberWithBool_(NO),
    QTMovieEditableAttribute: NSNumber.numberWithBool_(YES),
    QTMovieFileNameAttribute: "quicktime.mov"
}

clip, err = QTMovie.movieWithAttributes_error_(movieAttribs, None)
track = clip.tracks()[0]
print track.format()
# u'Avid DNxHD Codec'

На данный момент мне нужно получить OSType, который для этого кодека будет 'AVdn' Я предполагаю, что хочу что-то вроде этого: https://developer.apple.com/library/mac/#documentation/MobileCoreServices/Reference/UTTypeRef/Reference/reference.html Но у меня нет доступа к нему в pyobjc

Мое последнее средство - выложить на qt_thing что-то вроде этого:

qt_thing --type=imco | grep "AVID DNxHD Codec" | awk -F: '{print $2}'
# Result: AVdn

Но это медленнее, и я бы предпочел сделать все это в коде. Я, должно быть, упускаю что-то, что доступно мне в части вещей Какао / QTKit. Кто-нибудь с опытом?

Есть еще один SO вопрос, который снова ссылается на использование C api для разрешения кодека: Найдите кодек для QuickTime Movie , но я не могу, очевидно, сделать это напрямую с помощью pyobjc, насколько я знаю.

Ответы [ 2 ]

2 голосов
/ 25 февраля 2012

Пока я ждал, пока кто-нибудь ответит, и продолжал копать, даже в модуль Carbon ... Я обнаружил, что существует множество методов, обернутых в объекты pyobjc, которые на самом деле не документированы в документах или, возможно, даже не представлены вродной объект QTKit.Я полагаю, что это компенсирует отсутствие доступа к слою Quicktime C-api.

Сначала мой поиск обнаружил этот класс QTKit: QTFormatDescription

Но не былоЯсный способ, как создать один из них.Очевидно, я был не единственным , смущенным тем, как извлечь один

Когда я начал искать фактические члены объектов QTMovie, QTTrack и QTMedia, возможно, искал способ извлечьобъект QTFormatDescription, я наткнулся на вызов метода: QTTrack.mediaSubType

>>> movie = QTMovie.alloc().initWithFile_error_("/path/to/quicktime.mov", None)
>>> track = movie.tracks()[1]
>>> track.mediaSubType()
u'AVdn'

Я предполагаю, что они включают много удобных методов в экземпляры pyobjc, чтобы вы могли получать информацию такого типа без C-api.Это просто позор, что он так недокументирован.

Для тех, кто ищет случайную функциональность, подобную этой, все, что я могу порекомендовать, это сделать что-то вроде этого, чтобы найти любые добавленные не-arg методы, которые могут быть вам доступны:

>>> print '\n'.join([attrib for attrib in dir(QTTrack) if not '_' in attrib])
....
mediaName
mediaRetained
mediaSubType
mediaType
mediaTypeInMedia
...
0 голосов
/ 05 августа 2015

pyobjc содержит доступ к UTType под LaunchServices.

from LaunchServices import *

UTCreateStringForOSType()
UTGetOSTypeFromString()
...