在动作脚本中切割声音
问题描述:
我知道如何在动作脚本3中录制音频。但是是否可以从动作脚本中的最终声音文件中删除某些内容?我使用的情况是,用户可以跳到声音文件中的特定点(我可以管理它)并从那里开始记录(基本上覆盖文件的其余部分)。在动作脚本中切割声音
这是可能的动作3.如果是,如何?
谢谢。
UPDATE:
这是我所使用的代码,和它的作品,但旧的记录被一头栽倒。我不知道为什么。 “selectedTime”是用户在波形的图形表示中选择的时间的毫秒值; 44100是我的采样率。
existingByte = new ByteArray();
var extract:Number = Math.floor ((selectedTime)*44.1);
sound.extract(existingByte, extract);
mic.recordData(existingByte);
// in the mic class:
public function recordData(existingByteArray:ByteArray=null):void {
if(existingByteArray == null) {
raw = new ByteArray();
} else {
raw = existingByteArray;
raw.position = raw.length;
}
mic.addEventListener(SampleDataEvent.SAMPLE_DATA, dataHandler);
}
private function dataHandler(event:SampleDataEvent):void {
try {
raw.writeBytes(event.data);
} catch(e) {
this.stopRecording();
}
}
答
是的。当你从音频流接收字节时,你将它们附加到主缓冲区中。如果你想做一个像录音一样的插入。你需要知道你想冲入的主缓冲区的偏移量。因此,不要从头开始写入缓冲区,而是从用户单击的偏移量写入缓冲区。您必须将鼠标指针与主缓冲区中的偏移量相关联。然后,当您收到新的音频时,只需覆盖该缓冲区中的值即可。如果你想打孔,所以它只覆盖音频的一小部分。您还需要在主缓冲区中有一个终点,以停止写入新数据。用户可以突出显示音频的一部分,以便进/出点。
您将不得不使用ByteArrays作为两个缓冲区。您可以使用Sound.extract()从声音中提取原始字节。原始音频的其他来源也可以应用于此处:
var master : ByteArray; // assume this is loaded with some audio
public function punchIn(startLocation : index, sound : Sound) : void {
sound.extract(master, sound.bytesTotal, startLocation);
}
通过改变长度参数,您可以执行打孔和打孔功能。
好的,谢谢。我会尝试,一定会回来一些示例代码:) – shredding 2012-01-17 16:39:35
这很酷,但我有一个剩余的问题。它的工作原理非常完美,我设法完成了这一切。我使用主人并将其传回我的麦克风课程,并在最后添加新的录音。 请再次检查我的问题,我已经添加了代码。 虽然这可行,但初始录音的音高明显较低。 我计算的长度是这样的:sound.length * 44.1(44.1是我的比率)。 你知道为什么会发生这种情况。 非常感谢你到目前为止! – shredding 2012-01-17 20:59:59
您在麦克风输入和您加载到缓冲区中的示例文件之间的采样率不匹配。如果你的声音是44.1khz,那么你的麦克风必须是44.1khz。我很确定麦克风没有在44.1khz采样。因此,您需要将44.1khz缓冲区下采样到麦克风的相同采样频率。这是遍历声音原始字节,并提取每个N字节到主。 indexStep = 44.1khz/16khz。您可能需要累积四舍五入的错误并每隔X秒多读一个字节。如果(acc> 1.0){acc - = 1.0; sampleExtraByte()} – chubbsondubs 2012-01-18 03:33:41