luo*_*rad 6 audio bytearray mixing actionscript-3
我已经构建了一个混音器,并将所有序列保存在一个数组中然后再次播放,现在我想将混音保存为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);
}
Run Code Online (Sandbox Code Playgroud)
小智 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();
Run Code Online (Sandbox Code Playgroud)
要么等到两个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++;
}
}
Run Code Online (Sandbox Code Playgroud)
是的 - 您应该将可能的输出限制在-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.试试你的机器吧!
如果我正确理解您的问题,您需要读取每个样本的浮点数据,对它们求和,然后将结果值写入新的音频流。这将得到完全的 50/50 混合。
我现在无法访问带有编译器的机器,但它应该是这样的(假设 bytes1 和 bytes2 是两个长度相等的 ByteArray 对象):
for (int bcnt = bytes1.size(); bcnt; bcnt--)
bytes1.setByte(bcnt - 1, bytes2.getByte(bcnt - 1) + bytes1.getByte(bcnt - 1));
Run Code Online (Sandbox Code Playgroud)
当然,您可能想要进行某种溢出检查,但这应该足以让您走上正轨。