首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >混合来自ByteArray的2种声音

混合来自ByteArray的2种声音
EN

Stack Overflow用户
提问于 2011-03-28 08:12:39
回答 3查看 8K关注 0票数 6
代码语言:javascript
复制
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); 
} 
EN

回答 3

Stack Overflow用户

发布于 2011-03-30 00:43:30

我在一个类似的系统上工作了一段时间,我会尽我最大的努力给你一些指导:

你的示例代码并不是真的混合了mp3--它只是创建了2个声音来通过SampleDataEvent播放加载的mp3。你需要做的就是创建一个“输出”sound文件,它将保存/回放产生的混合声音。您可以轻松地保存该数据,然后将该文件保存为新的WAV/MP3/what-have-you。

real/psuedo-code (读取:lazy):

代码语言:javascript
复制
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都完全加载,要么运行enter-frame以确定何时两个声音都不再缓冲(Sound.isBuffering )

当mp3准备好时:

代码语言:javascript
复制
// 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。音频以PCM/未压缩数据的形式存在于闪存中,MP3显然是一种压缩格式。这个“答案”已经太长了,我从几个非常聪明的人那里收集到了所有这些信息。

你可以很容易地把'MicRecorder‘改编成一个通用的声音数据记录器:http://www.bytearray.org/?p=1858

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

在Google code上查找Andre Michelle的开源项目'Tonfall‘。

希望这能有所帮助!

在你的机器上试试吧!

票数 7
EN

Stack Overflow用户

发布于 2011-03-28 08:18:20

如果我正确理解您的问题,您需要读取每个样本的浮点数据,对它们求和,然后将结果值写入新的音频流。这将会给出一个50/50的比例。

我现在还不能使用带有编译器的机器,但应该是这样的(假设bytes1和bytes2是两个长度相等的ByteArray对象):

代码语言:javascript
复制
for (int bcnt = bytes1.size(); bcnt; bcnt--)
    bytes1.setByte(bcnt - 1, bytes2.getByte(bcnt - 1) + bytes1.getByte(bcnt - 1));

当然,您可能希望进行某种溢出检查,但这应该足以将您带到正确的轨道上。

票数 2
EN

Stack Overflow用户

发布于 2011-03-28 08:22:26

如果你有未压缩的音频,你可以在你的ByteArray中添加单个数组元素的值,但你也必须处理最大/最小值的上限(没有溢出)。我很确定没有任何等同于混合MP3s的东西-所以你可能不得不再次解码,混合,并编码到MP3。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5453438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档