def test_wav_link(self): test_outfile = os.path.join(common.sandbox(), 'wav_link.aaf') test_link_targets = [ common.generate_pcm_audio_mono('testmono', sample_rate=48000, duration=10, sample_format='pcm_s16le', fmt='wav'), common.generate_pcm_audio_mono('testmono24', sample_rate=48000, duration=10, sample_format='pcm_s24le', fmt='wav'), common.generate_pcm_audio_stereo('testmono', sample_rate=48000, duration=10, sample_format='pcm_s24le', fmt='wav') ] with aaf2.open(test_outfile, 'w') as f: for target in test_link_targets: meta = common.probe(target) mobs = f.content.link_external_wav(meta)
def test_monoaural_aiff(self): new_file = os.path.join(common.sandbox(), 'ama_aiff.aaf') with aaf2.open(new_file, 'w') as f: aiff_file = common.generate_pcm_audio_mono('test_ama_aiff', fmt='aiff') meta = common.probe(aiff_file) mobs = ama.create_media_link(f, aiff_file, meta) self.assertTrue(len(mobs), 3) with aaf2.open(new_file, 'r') as f: common.walk_aaf(f.root) self.assertTrue(len(f.content.mobs) == 3) self.assertTrue(len(list(f.content.mastermobs())) == 1) master_mob = next(f.content.mastermobs()) self.assert_mastermob_valid_edit_spec(master_mob=master_mob, expected_sound_slots=1, expected_picture_slots=0) self.assertEqual(len(master_mob.slots), 1, "MasterMob should only have one slot") self.assertEqual(master_mob.slots[0].media_kind, 'Sound', "MasterMob slot has incorrect media_kind") source_clip = master_mob.slots[0].segment.components[0] descriptor = source_clip.mob.descriptor self.assertIsNotNone(descriptor, "File SourceMob has no WAVEDescriptor") self.assertIsInstance(descriptor, aaf2.essence.AIFCDescriptor, "File SourceMob has no AIFCDescriptor") self.assertIsNotNone( descriptor['Summary'].value, "AIFCDescriptor missing required 'Summary' property")
def test_basic_audio_link(self): audio_profile_name = 'pcm_48000_s24le' sample_format = audio.pcm_profiles[audio_profile_name]['sample_format'] sample_rate = audio.pcm_profiles[audio_profile_name]['sample_rate'] audio_duration = 1 audio_sample = common.generate_pcm_audio_mono( audio_profile_name, sample_format=sample_format, sample_rate=sample_rate, duration=audio_duration, fmt='mxf_opatom') meta = common.probe(audio_sample) audio_mob_id = mobid.MobID( meta['format']['tags']['material_package_umid']) audio_source_mob_id = mobid.MobID( meta['streams'][0]['tags']['file_package_umid']) new_file = os.path.join(common.sandbox(), 'mxf_link_audio.aaf') with aaf2.open(new_file, 'w') as f: f.content.link_external_mxf(audio_sample) with aaf2.open(new_file, 'r') as f: assert len(f.content.mobs) == 2 for mob in f.content.mobs: if isinstance(mob, mobs.MasterMob): assert mob.mob_id == audio_mob_id elif isinstance(mob, mobs.SourceMob): if isinstance(mob.descriptor, essence.PCMDescriptor): assert mob.mob_id == audio_source_mob_id
def test_wav(self): # name, sample_rate = 48000, duration = 2, sample_fmt='s16le', format='wav'): # profile_name = 'pcm_48000_s24le' frame_rate = 30 timecode_fps = 30 start_time = int(timecode_fps * 60 * 60) * 2 duration = 1.5 for profile_name in sorted(audio.pcm_profiles): sample_format = audio.pcm_profiles[profile_name]['sample_format'] sample_rate = audio.pcm_profiles[profile_name]['sample_rate'] sample = common.generate_pcm_audio_mono( profile_name, sample_format=sample_format, sample_rate=sample_rate, duration=duration) new_file = os.path.join(common.sandbox(), '%s_import_essence.aaf' % profile_name) with aaf2.open(new_file, 'w') as f: tape_mob = f.create.SourceMob() f.content.mobs.append(tape_mob) tape_mob.create_tape_slots(profile_name, frame_rate, timecode_fps, media_kind='sound') tape = tape_mob.create_source_clip(1, start_time) mob = f.create.MasterMob(profile_name) f.content.mobs.append(mob) mob.import_audio_essence(sample, frame_rate, tape) with aaf2.open(new_file, 'r') as f: source_mobs = [] tape_mobs = [] for mob in f.content.sourcemobs(): if isinstance(mob.descriptor, aaf2.essence.TapeDescriptor): tape_mobs.append(mob) else: source_mobs.append(mob) mob = source_mobs[0] tape_mob = tape_mobs[0] stream = mob.essence.open('r') dump_path = os.path.join(common.sample_dir(), '%s-import-dump.wav' % profile_name) mob.export_audio(dump_path) assert common.compare_files(dump_path, sample) audio_samples = mob.descriptor['Length'].value assert audio_samples == sample_rate * duration edit_length = duration * frame_rate assert mob.slots[0].segment.length == edit_length assert mob.slots[0].segment.start == start_time assert mob.slots[0].segment.mob_id == tape_mob.mob_id
def create_audio_clip_import(f): audio_profile_name = 'pcm_48000_s24le' frame_rate = 25 frames = 200 audio_duration = frames / frame_rate sample_format = audio.pcm_profiles[audio_profile_name]['sample_format'] sample_rate = audio.pcm_profiles[audio_profile_name]['sample_rate'] audio_sample = common.generate_pcm_audio_mono(audio_profile_name, sample_format=sample_format, sample_rate=sample_rate, duration=audio_duration) master_mob = f.create.MasterMob("MasterMob") f.content.mobs.append(master_mob) slot = master_mob.import_audio_essence(audio_sample, frame_rate) return master_mob.create_source_clip(slot.slot_id, start=50)
def test_multi(self): frame_rate = 30.0 frames = 4 audio_duration = frames / frame_rate uhd2160 = (960, 540) new_file = os.path.join(common.sandbox(), 'multi_import_essence.aaf') audio_profile_name = 'pcm_48000_s24le' sample_format = audio.pcm_profiles[audio_profile_name]['sample_format'] sample_rate = audio.pcm_profiles[audio_profile_name]['sample_rate'] audio_sample = common.generate_pcm_audio_mono( audio_profile_name, sample_format=sample_format, sample_rate=sample_rate, duration=audio_duration) samples = {} mastermobs = {} timecode_fps = 30 start_time = int(timecode_fps * 60 * 60) tape_id = None with aaf2.open(new_file, 'w') as f: # create a tape tape_mob = f.create.SourceMob() tape_mob.create_tape_slots("mulit-import", frame_rate, timecode_fps) tape_id = tape_mob.mob_id f.content.mobs.append(tape_mob) for i, profile_name in enumerate( ['dnxhr_lb', 'dnxhr_sq', 'dnxhr_hq'], 1): profile = video.dnx_profiles.get(profile_name) sample = common.generate_dnxhd(profile_name, "%s-mulit-import.dnxhd" % profile_name, frames=frames, size=uhd2160, frame_rate=frame_rate) mob = f.create.MasterMob(profile_name) f.content.mobs.append(mob) tape = tape_mob.create_source_clip(1, start=start_time) vs_slot = mob.import_dnxhd_essence(sample, frame_rate, tape=tape) as_slot = mob.import_audio_essence(audio_sample, frame_rate) vs_mob = vs_slot.segment.mob as_mob = as_slot.segment.mob mob.comments['profile'] = profile_name mob.comments['integer'] = 100 mob.comments['integer'] = i mastermobs[mob.mob_id] = (profile_name, i) v_dump_path = os.path.join( common.sample_dir(), '%s-multi-import-dump.wav' % profile_name) a_dump_path = os.path.join( common.sample_dir(), '%s-multi-import-dump.dnxhd' % profile_name) samples[vs_mob.mob_id] = (sample, v_dump_path, start_time) samples[as_mob.mob_id] = (audio_sample, a_dump_path, start_time) start_time += 100 with aaf2.open(new_file, 'r') as f: tape_mob = f.content.mobs.get(tape_id) for mob_id, (profile_name, v) in mastermobs.items(): mob = f.content.mobs.get(mob_id) assert mob.comments['profile'] == profile_name assert mob.comments['integer'] == v for mob_id, (original_path, dump_path, start_time) in samples.items(): mob = f.content.mobs.get(mob_id) if isinstance(mob.descriptor, aaf2.essence.PCMDescriptor): mob.export_audio(dump_path) assert common.compare_files(dump_path, original_path) assert mob.slots[0].segment.length == frames if isinstance(mob.descriptor, aaf2.essence.CDCIDescriptor): stream = mob.essence.open('r') with io.open(dump_path, 'wb') as out: out.write(stream.read()) assert common.compare_files(dump_path, original_path) assert mob.slots[0].segment.length == frames assert mob.slots[0].segment.start == start_time assert mob.slots[0].segment.mob_id == tape_id