actionscript - 同步2个声道?

时间:2011-09-09 02:09:16

标签: flash actionscript-3 actionscript

我正在使用2个声道同时播放2个独立的,外部加载的mp3文件。现在我把播放按钮绑定到一个启动第一个mp3,然后是第二个mp3的功能。问题是 - 第二个mp3在第一个mp3之后几毫秒开始。有没有办法可以确保这两个人在同一时间开始玩?

function playMusic(evt:MouseEvent):void
{

    channel = myMusic.play(songPosition);
    channel2 = myMusic2.play(songPosition);
    myTimer.start();
    btnPlay.mouseEnabled = false;
}

编辑:我发现了一个与2个音频源的TIMER相匹配的笨拙的解决方法。它有效,但是现在我在尝试匹配时开始打嗝:

    function updateTime(evt:TimerEvent):void
    {
        lblSongTime.text = convertTime(channel.position);
        if(channel.position!=channel2.position){   
 trace("out of sync")                
 SoundMixer.stopAll()
    channel = myMusic.play();
    channel2 = myMusic2.play(channel.position);

        }
    }

1 个答案:

答案 0 :(得分:2)

如果你的目标是Flash Player 10+,那么你可以使用声音类的sampleData eventextract method来组合这两种声音。

基本上,您需要创建一个处理sampleData事件的Sound子类,方法是将位置传递给您想要播放的两个声音中的每一个的extract方法。然后,您将合并两个ByteArrays并将其插入到事件的data成员中。

要注意的主要事项是,您一次只能向sampleData事件提供最多8k的数据(如果我没记错的话)。你也可能想要平均两种声音,或者至少在组合声音时减小音量。

自从我写了动作脚本以来已经有一段时间了,所以我花了一点时间为你写了一些代码,但如果你还需要帮助,请告诉我,我会尽力给你更多信息或一些代码。

修改

这是一个最小的课程,可以做你想要的。您应该添加错误检查,您可能需要添加处理声音变换的内容(例如音量调整),因为使用示例数据事件可能会忽略您在播放时应用的声音变换(我不记得,但它不应该太多很难你弄清楚^ _ ^)......

import flash.events.SampleDataEvent;
import flash.media.Sound;
import flash.utils.ByteArray;

public class DualSound extends Sound {
    private var sa:Sound;
    private var sb:Sound;

    public function DualSound(a:Sound, b:Sound) {
        super();

        sa = a;
        sb = b;

        addEventListener(SampleDataEvent.SAMPLE_DATA, handleSampleData);
    }

    private function handleSampleData(e:SampleDataEvent):void {
        var ba:ByteArray, bb:ByteArray;

        ba = new ByteArray();
        bb = new ByteArray();

        sa.extract(ba, 8 << 10, e.position);
        sb.extract(bb, 8 << 10, e.position);
        ba.position = 0;
        bb.position = 0;

        while(ba.bytesAvailable > 0 && bb.bytesAvailable > 0) {
            e.data.writeFloat((ba.readFloat() + bb.readFloat()) / 2);
        }
        if(ba.bytesAvailable > 0) {
            e.data.writeBytes(ba, ba.position, ba.bytesAvailable);
        } else if(bb.bytesAvailable > 0) {
            e.data.writeBytes(bb, bb.position, bb.bytesAvailable);
        }
    }
}