动作脚本实时修改声音数据

时间:2009-12-24 17:45:39

标签: flash actionscript-3 actionscript

var sound:Sound = new Sound();
var req:URLRequest = new URLRequest(url);
sound.load(url)

我想修改声音数据(一个mp3)。具体来说,mp3将使用流密码加密,我想在数据进入时解密数据。这是否可能使用某种类型的事件?

2 个答案:

答案 0 :(得分:3)

要处理现有音频流,您必须设置输出Sound对象,而不会将声音加载到其中。然后监听SampleDataEvent.SAMPLE_DATA的声音对象,只要缓冲区为空的Sound对象开始播放,就会触发该对象。您需要使用立体声PCM数据(浮点数对)填充缓冲区。

要获取这些数字,请在输入的Sound对象(您在上面的代码中简称为 sound )中使用Sound.extract()方法将PCM数据读取到ByteArray。然后根据需要处理ByteArray的数据,并将其放在输出缓冲区中。

var input : Sound;
var output : Sound;

// ... set up your input sound source ... //

output = new Sound();
output.addEventListener(SampleDataEvent.SAMPLE_DATA, handleSampleData);
output.play();

// The SAMPLE_DATA event is dispatched whenever the output Sound object
// buffer is empty. Fill the buffer to keep playing sound.
function handleSampleData(ev : SampleDataEvent) : void
{
  var buffer : ByteArray = new ByteArray;

  input.extract(buffer, 2048);

  // PCM data from input is now in the buffer ByteArray. Filter the sound
  // data according to your requirements here.

  ev.data.writeBytes(buffer);
}

extract()方法的参考文档中还有一些关于该主题的示例代码。

答案 1 :(得分:0)

在Flash 10中,你可以做到这一点。我不确定以前的版本是否可行。在flash 10声音类中有一种新类型的事件SampleDataEvent,它实际上会在声音对象上调用播放时被触发,并且如果没有可供Sound对象播放的数据,即它请求数据。然后捕捉事件写一些mp3数据和Sound对象可以播放。这link可能会有所帮助。