我目前正在编写一个处理批量快速时间的脚本,这是我第一次使用pyobjc(我在实际objective-c中只编写了另一个非常简单的脚本)。我需要能够确定quicktimes编解码器的四个字符的OSType,这样我就可以使用addImage_foruration_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
但这比较慢,我宁愿全部用代码完成。我一定错过了Cocoa/QTKit方面的一些可用信息。有经验的人吗?
还有另一个SO问题再次提到使用C api来解决编解码器:找到Quicktime电影的编解码器,但据我所知,我显然不能直接从pyobjc中做到这一点。
当我等待有人回答时,我一直在挖掘,甚至是碳模块。。。我发现有相当多的方法被封装到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
...
pyobjc确实包含对UTType
的访问,它位于LaunchServices
之下。
from LaunchServices import *
UTCreateStringForOSType()
UTGetOSTypeFromString()