Actionscript - синхронизация 2 звуковых каналов? - PullRequest
0 голосов
/ 09 сентября 2011

Я использую 2 звуковых канала для одновременного воспроизведения 2 отдельных загруженных извне mp3-файлов.Прямо сейчас у меня есть кнопка воспроизведения, связанная с функцией, которая запускает первый mp3, а затем второй.Проблема в том, что второй mp3 начинается через несколько миллисекунд после первого.Есть ли способ, которым я могу убедиться, что эти 2 начинают воспроизводиться в одно и то же время?

function playMusic(evt:MouseEvent):void
{

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

Редактировать: я нашел неуклюжий обходной путь, который соответствует таймеру для 2 источников звука.Это работает, но теперь у меня есть сбой в начале, в то время как я пытаюсь соответствовать:

    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 Ответ

2 голосов
/ 09 сентября 2011

Если вы нацелены на flash player 10+, вы можете использовать sampleData событие и extract метод класса звука, чтобы объединить два звука.

По сути, вам нужно создать подкласс Sound, который обрабатывает событие sampleData, передавая позицию методу extract каждого из двух звуков, которые вы хотите воспроизвести.Затем вы скомбинируете два ByteArray s и вставите их в data элемент события.

Главное, на что следует обратить внимание, это то, что вы можете дать только максимум8k данных (если я правильно помню) на событие sampleData одновременно.Вы также, вероятно, захотите усреднить два звука или, по крайней мере, уменьшить громкость при объединении звуков.

Прошло немного времени с тех пор, как я написал ActionScript, поэтому мне потребовалось немного временинаписать код для вас, но если вам все еще нужна помощь, дайте мне знать, и я постараюсь дать вам больше информации или код.

EDIT

Вот минимальный класс, который будет делать то, что вы хотите.Вы должны добавить проверку ошибок, и вам может понадобиться добавить материал для обработки звуковых преобразований (например, регулировки громкости), так как при использовании события сэмплов данных может игнорироваться звуковое преобразование, которое вы применяете во время воспроизведения (я не помню, но это не должно быть слишкомвам трудно понять это ^ _ ^) ...

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);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...