我正在编写一个处理批量快速时间的脚本,这是我第一次使用pyobjc(我只在实际的Objective-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
但这比较慢,我宁愿在代码中全部完成。我必须遗漏在Cocoa / QTKit方面可以使用的东西。有经验的人吗?
还有另一个SO问题再次引用使用C api来解析编解码器:Find out the Codec for a Quicktime Movie,但据我所知,我无法直接从pyobjc中直接做到这一点。
答案 0 :(得分:2)
当我等待有人回答,并继续挖掘,甚至进入Carbon模块......我发现有很多方法包含在pyobjc对象中,这些方法在文档中没有真正记录,甚至可能存在于文档中原生QTKit objc。我认为这是为了抵消缺少对Quicktime C-api层的访问。
首先我的搜索出现了这个QTKit类:QTFormatDescription
但是没有明确的方法来创建其中的一个。显然我不是唯一一个confused as to how to retrive one
当我开始搜索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
...
答案 1 :(得分:0)
pyobjc确实包含对LaunchServices
下from LaunchServices import *
UTCreateStringForOSType()
UTGetOSTypeFromString()
的访问权限。
readLine()