Получение кодеков OSType из формата UTType в pyobjc
В настоящее время я пишу сценарий, который обрабатывает пакеты quicktimes, и я впервые использую pyobjc (я написал только один действительно простой сценарий в реальной цели-c). Мне нужно иметь возможность определить четырехсимвольный OSType кодека для быстрого времени, чтобы я мог правильно использовать один и тот же кодек для изображений, используя 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 ответа
Пока я ждал, пока кто-нибудь ответит, и продолжал копаться, даже в модуль Carbon... я обнаружил, что существует множество методов, обернутых в объекты pyobjc, которые на самом деле не документированы в документах или, возможно, даже отсутствуют в собственном QTKit. ObjC. Я полагаю, что это компенсирует отсутствие доступа к слою 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. Это просто позор, что это так без документов.
Для тех, кто ищет случайную функциональность, подобную этой, все, что я могу порекомендовать, это сделать что-то вроде этого, чтобы найти любые дополнительные неаргитные методы, которые могут быть вам доступны:
>>> print '\n'.join([attrib for attrib in dir(QTTrack) if not '_' in attrib])
....
mediaName
mediaRetained
mediaSubType
mediaType
mediaTypeInMedia
...
Pyobjc содержит доступ к UTType
это под LaunchServices
,
from LaunchServices import *
UTCreateStringForOSType()
UTGetOSTypeFromString()