Получение кодеков 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()
Другие вопросы по тегам