2012-05-04 122 views
1

所以我正在做一个简单的Flash游戏。基本上我有一个转盘,持续30秒钟,并附上几个样本音乐,这些音乐汇集在一起​​形成最后一首歌曲。游戏会话声音播放/录制

现在我希望能够在游戏结束时录制和播放声音。

我创建了一个SoundFx类,它将mp3音频转换为byteArrays,希望将音频混合到同一个声道。

现在我已经达到了一定的障碍,因为我无法正确混合字节码。在开始添加通道时,我开始认为不可能对字节数组进行编码。

我很乐意接受正确的方向。我不确定从这里开始的最佳方式,即使只是播放也不错。创建一个按钮日志可能会修复播放,并在第二次运行时混合音频直接进入文件。但它确实似乎是一条很长的路要实现这一目标。

非常感谢和道歉对我蹩脚的英语提前

大卫R.

对此事的一些代码:

private var srcSound:Sound; 
    private var sound1:Sound; 
    private var sound2:Sound; 
    private var soundChannel:SoundChannel; 
    private var bytes:ByteArray; 
    private var incbytes:ByteArray; 
    private var mixedBytes:ByteArray; 

    public var pitchShiftFactor:Number;  
    public var position:Number; 
    public var AddSound:Boolean = false; 
    public var incremental:Number; 
    public var left1:Number; 
    public var left2:Number; 
    public var right1:Number; 
    public var right2:Number; 
    public var mixedBytes1:Number; 
    public var mixedBytes2:Number; 


    public function SoundFx() {   

    } 

    public function playFx(srcSound:Sound):void{ 

    this.srcSound = srcSound; 
     position = 0; 

    var morphedSound:Sound = new Sound(); 
     morphedSound.addEventListener(SampleDataEvent.SAMPLE_DATA, sampleDataHandler); 

     soundChannel = morphedSound.play(); 

    } 

    public function addSound(sound1:Sound , sound2:Sound):void{ 

    this.sound1 = sound1; 
    this.sound2 = sound2; 


     sound1.addEventListener(SampleDataEvent.SAMPLE_DATA, addSampleData); 
     position = 0; 

     soundChannel = sound1.play(); 
     soundChannel = sound2.play(); 

     AddSound = true; 

     } 

    private function addSampleData(event:SampleDataEvent):void{ 

     position = 0; 

    var incbytes:ByteArray = new ByteArray(); 
     position += sound1.extract(incbytes, 4096, position); 

    var bytes:ByteArray = new ByteArray(); 
     position += sound2.extract(bytes, 4096, position); 

     event.data.writeBytes(mixBytes(bytes, incbytes)); 


    } 

    private function sampleDataHandler(event:SampleDataEvent):void 
    {   

    var bytes:ByteArray = new ByteArray(); 
     position += srcSound.extract(bytes, 4096, position); 

     event.data.writeBytes(editBytes(bytes)); 

    } 

    private function mixBytes(bytes1:ByteArray , bytes2:ByteArray):ByteArray{ 

     bytes.position = 0; 
     incbytes.position = 0; 

     var returnBytes:ByteArray = new ByteArray(); 


     while(bytes1.bytesAvailable > 0) 
     { 

     left1 = bytes1.readFloat(); 
     left2 = bytes2.readFloat(); 

     right1 = bytes1.readFloat(); 
     right2 = bytes2.readFloat(); 

     mixedBytes1 = left1 + left2; 
     mixedBytes2 = right1 + right1; 

     mixedBytes.writeFloat(mixedBytes1); 
     mixedBytes.writeFloat(mixedBytes2); 

     } 

     return mixedBytes; 

     } 

    private function editBytes(bytes:ByteArray):ByteArray{ 

     //var skipCount:Number = 0; 
     var returnBytes:ByteArray = new ByteArray(); 
     bytes.position = 0; 


     while(bytes.bytesAvailable > 0) 
     { 
      //skipCount++; 


       returnBytes.writeFloat(bytes.readFloat()); 
       returnBytes.writeFloat(bytes.readFloat()); 

      } 

     return returnBytes; 
    } 



} 

回答

2

我想我明白你的想法,希望我做到了。

您应该尝试将所有SoundChannel类(正在添加的声音图层)传递给SoundMixer类(在adobe站点中有大量​​关于此的信息),如漏斗,然后添加一个SAMPLEDATA事件侦听器soundmixer,并捕获该混音器的字节数组,就像获取最终混音的字节数组...然后将这些字节编码为wav or mp3。 对不起,我不能为你编写代码,我还没有很好的代码,但我很擅长混合声音。

这里是形式的Adobe网站本身就是一个例子:

function loaded(event:Event):void 
{ 
    outputSnd.addEventListener(SampleDataEvent.SAMPLE_DATA, processSound); 
    outputSnd.play(); 
} 

有用的链接: http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/media/Sound.html

SoundMixer类链接: http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/media/SoundMixer.html

0

与层云(卷云)互联网广播尝试我所用SoundMixer.computeSpectrum()服务器端并将这些数据传递给客户端,用NetStream.send()进行绘制和回放。
它的工作,但非常公羊饿了客户机和服务器一台计算机上(与几首歌曲加载并转换成原始音频数据:)

所以,尝试computeSpectrum(),似乎非常适合用于制作“音频日志”

+0

的感谢!我会检查出来,并在完成后发布结果:) – user1375895