混合来自ByteArray的2个声音

时间:2011-03-28 00:12:39

标签: actionscript-3 audio bytearray mixing

我已经构建了一个混音器并将所有序列保存在一个数组中,然后再次播放,现在我想将混音保存为MP3,我已经找了任何方法来保存混音,答案是加载听起来像byteArrays(sound.extract)我已经完成了但是我真的不知道如何将所有声音存储在一个ByteArray中以便将其保存为MP3,我得到的代码只是例如,加载2个音频文件和将它们存储在单独的ByteArrays中,并播放每个声音,是否有人知道如何将2个byteArrays存储在一个中?

var mySound:Sound = new Sound(); 
var sourceSnd:Sound = new Sound(); 
var urlReq:URLRequest = new URLRequest("Track1.mp3"); 
sourceSnd.load(urlReq); 
sourceSnd.addEventListener(Event.COMPLETE, loaded); 
function loaded(event:Event):void 
{ 
    mySound.addEventListener(SampleDataEvent.SAMPLE_DATA, processSound); 
    //mySound.play(); 
} 

var mySound2:Sound = new Sound(); 
var sourceSnd2:Sound = new Sound(); 
var urlReq2:URLRequest = new URLRequest("Track2.mp3"); 
sourceSnd2.load(urlReq2); 
sourceSnd2.addEventListener(Event.COMPLETE, loaded2); 
function loaded2(event:Event):void 
{ 
    mySound2.addEventListener(SampleDataEvent.SAMPLE_DATA, processSound2); 
    mySound2.play(); 
    mySound.play(); 
} 



function processSound(event:SampleDataEvent):void 
{ 
        var bytes:ByteArray = new ByteArray(); 
        sourceSnd.extract(bytes, 8192); 
    event.data.writeBytes(bytes); 
} 

function processSound2(event:SampleDataEvent):void 
{ 
        var bytes:ByteArray = new ByteArray(); 
        sourceSnd2.extract(bytes, 8192); 
    event.data.writeBytes(bytes); 
} 

3 个答案:

答案 0 :(得分:7)

一直在研究类似的系统,我会尽力给你一些方向:

你的示例代码并没有真正混合MP3 - 它通过SampleDataEvent再创建2个声音来播放加载的MP3。你需要做的是只创建一个“输出”声音文件,它将保持/播放产生的混合声音。您可以轻松保存该数据,然后将该文件另存为新的WAV / MP3 /有什么。

real / psuedo-code(读取:懒惰):

output = new Sound();

output.addEventListener( SampleDataEvent.SAMPLE_DATA , mixAudio );

song1 = new Sound / load the first mp3

song2 = new Sound / load the second mp3

// a byteArray for "recording" the output and subsequent file creation
recordedBytes = new ByteArray();

要么等到两个mp3完全加载,要么运行一个输入框来确定两个声音何时不再缓冲(Sound.isBuffering)

当mp3准备就绪时:

// numbers to store some values

var left1:Number;
var right1:Number;

var left2:Number;
var right2:Number;

// bytearrays for extracting and mixing
var bytes1:ByteArray = new ByteArray( );
var bytes2:ByteArray = new ByteArray( );

// start the show
output.play();


function mixAudio( e:SampleDataEvent ):void{
  //set bytearray positions to 0

  bytes1.position = 0;
  bytes2.position = 0;

  //extract

  song1.extract( bytes1, 8192 );
  song2.extract( bytes2, 8192 );

  // reset bytearray positions to 0 for reading the floats

  bytes1.position = 0;
  bytes2.position = 0;

  // run through all the bytes/floats

  var b:int = 0;

  while( b < 8192 ){

     left1 = bytes1.readFloat();  // gets "left" signal
     right1 = bytes1.readFloat(); // gets "right" signal

     left2 = bytes2.readFloat();
     right2 = bytes2.readFloat();


     // mix!

     var newLeft:Number = ( left1 + left2 ) * .5; 
     var newRight:Number = ( right1 + right2 ) * .5;

     // write the new stuff to the output sound's

     e.data.writeFloat( newLeft );
     e.data.writeFloat( newRight );

     // write numbers to the "recording" byteArray
     recordedBytes.writeFloat( newLeft );
     recordedBytes.writeFloat( newRight );

     b++;

  }
}

是的 - 您应该将可能的输出限制在-1/1。做吧。这是非常不优化的!

确定。所以这很容易!困难的部分是将最终的byteArray转换为MP3。 Flash中的音频作为PCM /未压缩数据存在,MP3显然是压缩格式。这个“答案”已经太长了,我从几个非常聪明的人那里收集了所有这些信息。

您可以轻松地将“MicRecorder”改为通用声音数据记录器: http://www.bytearray.org/?p=1858

转换为MP3将是一个婊子:Thibault在ByteArray.org上发布了另一篇文章 - 搜索LAME MP3。

优秀示例/资源: http://www.anttikupila.com/flash/soundfx-out-of-the-box-audio-filters-with-actionscript-3/

在Google代码中查找Andre Michelle的开源“Tonfall”项目。

查看Kevin Goldsmith的博客和实验室 - 他有很好的例子来利用Pixel Bender这么疯狂。

希望这有帮助!

PS - 从安德烈那里得到提示,音频缓冲区的最佳长度应该是3072.试试你的机器吧!

答案 1 :(得分:2)

如果我理解你的问题,你需要读取每个样本的浮点数据,求它们,并将结果值写入新的音频流。这样可以实现50/50的混合。

我现在无权访问带有编译器的计算机,但它应该是这样的(假设bytes1和bytes2是两个相等长度的ByteArray对象):

for (int bcnt = bytes1.size(); bcnt; bcnt--)
    bytes1.setByte(bcnt - 1, bytes2.getByte(bcnt - 1) + bytes1.getByte(bcnt - 1));

当然,您可能希望进行某种溢出检查,但这足以让您走上正确的轨道。

答案 2 :(得分:0)

如果你有未压缩的音频,你可以在ByteArray中添加各个数组元素的值。但是你还必须处理最大/最小值的上限(没有溢出)。很确定没有任何东西可以混合MP3 - 所以你可能需要再次解码,混合和编码到MP3。