示例#1
0
    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)
示例#2
0
    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")
示例#3
0
文件: test_mxf.py 项目: yazici/pyaaf2
    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
示例#4
0
    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
示例#5
0
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)
示例#6
0
    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