我正在使用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);
}
}
答案 0 :(得分:2)
如果你的目标是Flash Player 10+,那么你可以使用声音类的sampleData
event和extract
method来组合这两种声音。
基本上,您需要创建一个处理sampleData
事件的Sound子类,方法是将位置传递给您想要播放的两个声音中的每一个的extract
方法。然后,您将合并两个ByteArray
s并将其插入到事件的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);
}
}
}