#预备知识
在 AAF 标准中对 AAF 文件层次定义为三层:时间线、 逻辑素材和物理素材。
##时间线
在非线性编辑系统中时间线对应于 EDL 表(Editorial Determination List,即:
编辑决策列表) ;在 AAF 中,时间线对应于一个 CompositionMob 对象。
CompositionMob 对象位于 AAF 文件的最上层,在 CompositionMob 上可以添加
各种跟时间有关的元素,如素材,特技、字幕、声音等,从而达到编辑节目的
效果。当用户完成编辑后,AAF 把时间线上的元素按其层次结构存储到 AAF 文
件中,当用户再次打开时,AAF 依次读出时间线上的元素,并显示给用户,这
时便可以向时间线上增加和删除特定的元素以达到用户修改节目的目的。
在 AAF 里素材被存放在 SourceMob 里, MasterMob 是被用于
CompositionMob 间接访问素材的对象,CompositionMob 不必知道素材是具体的
什么类型,就像时间线引用的是一个虚拟的素材,不必关心具体的物理素材。
##逻辑素材
AAF 组织为了能够更好的编辑 AAF 文件,引入了一个中间层,也就是时间
不再指向具体的素材,而是指向一个逻辑的素材(SourceMob) ,再由它指向具
体的素材(EssenceData)。这样做的好处是当物理素材发生改变是,只需修改物
理素材的引用,而不必修改时间线信息,从而减少了修改工量。并且,逻辑素材
还可以被多次引用,包含更多的素材类型,如:视频、音频、用户数据信息等,
但一个物理素材可能只有视频或音频。
##物理素材
物理素材(EssenceData)用于描述具体的物理实体,以及实体数据的引用。
物理素材包含的描述信息有视频的幅面大小,帧率(PAL/NTSC) 、编码方式
(MPEG2,MPEG4),音频的采样率,采样大小,声道数量等数据引用,如果是
内置数据,那么必定要包含数据的 ID,如果是外置数据,还要包括引用的数据
路径。
#pyaaf文件读写
pyaaf通过aaf_file = aaf.open(output_aaf, 'r')
进行读取
通过aaf_file.save("resources/change_onlyone_timeline_name.aaf")
进行保存文件
#pyaaf的header、storage、dictionary的读取,与dump对比 pyaaf读取header、storage、dictionary通过如下代码
class_iid = aaf_file.class_iid
header = aaf_file.header
storage = aaf_file.storage
dictionary = aaf_file.dictionary
print "[aaf_file.class_iid]:" + str(class_iid)
print "[aaf_file.header]:" + str(header)
print "[aaf_file.storage]:" + str(storage)
print "[aaf_file.dictionary]:" + str(dictionary)
针对相同文件打印输出与dump打印对比
[aaf_file.class_iid]:urn:uuid:9346acd3-2713-11d2-8035-006008143e6f
[aaf_file.header]:<aaf.storage.Header at 0x2baa170>
[aaf_file.storage]:<aaf.storage.ContentStorage at 0x2baa210>
[aaf_file.dictionary]:<aaf.dictionary.Dictionary at 0x2baf030>
dump打印
Content <aaf.storage.ContentStorage at 0x2bd7300>
Dictionary <aaf.dictionary.Dictionary at 0x2bbd660>
注意:这里描述的内存地址有时候一样,有时候不一样,是由于C++内存地址分配问题,并非指相对内存地址。
#尝试对header、storage、dictionary实例化
##尝试header实例化
代码self_header = aaf.storage.Header()
,报异常TypeError: Header cannot be instantiated from Python
。该异常为Header不能使用python进行实例化
##尝试storage(ContentStorage)实例化
代码self_storage = aaf.storage.ContentStorage()
,报异常TypeError: ContentStorage cannot be instantiated from Python
。该异常为ContentStorage不能使用python进行实例化
##尝试storage(ContentStorage)实例化
代码self_storage = aaf.storage.ContentStorage()
,报异常TypeError: ContentStorage cannot be instantiated from Python
。该异常为ContentStorage不能使用python进行实例化
##尝试dictionary实例化
代码self_dict = aaf.dictionary.Dictionary()
,报异常TypeError: Dictionary cannot be instantiated from Python
。该异常为Dictionary不能使用python进行实例化
#获取storage当中的mobs,并添加mob
aaf_mobs = storage.mobs()
for aaf_mob in aaf_mobs:
print aaf_mob
把创建的mob,存储到storage中
new_timeline = CompositionMob(aaf_file,"AAF Test TimeLine")
storage.add_mob(new_timeline)
#AAF对象类方法
##Mob Mob作为一系列的Mob的父类,具有许多方法。
append_comment(name, value) #追加评论
append_attribute(name, value) #追加属性(修改mob的name不能通过这种方式)
来源:oschina
链接:https://my.oschina.net/u/52678/blog/732732