首先让我确定一下我想做的事情:
我的用户可以在我的网站上录制voicenotes,为所述笔记添加标签以进行索引以及标题。保存笔记后,我将笔记的路径与我的数据库中的其他信息一起保存。
现在,我有2个选择进行录制,都涉及嵌入我网站的.swf:
1)我可以使用Red5服务器将音频流式传输到我的服务器并保存文件并将所述文件的路径返回到我的应用程序以进行数据库保存,看起来相当复杂,因为我必须转换音频并移动它到服务器端Red5应用程序中属于用户的相应文件夹,我不太了解如何构建。
2)我可以简单地记录音频并获取其字节数组,对其执行Base64编码并将其与必要的其余数据(通过简单的POST或AJAX调用)一起发送给PHP ,在服务器上解码并使用适当的扩展名制作文件,这里也会使用ffmpeg进行音频转换,这个选项似乎更简单,但我不知道它有多可行。
您认为哪种选择更可行,更容易开发?提前致谢
答案 0 :(得分:4)
根据计划的录制时间,您可以使用第二个选项。我最近成功地为一个项目使用了类似的方法,但录音只有30秒左右。这就是我所做的与你所建议的不同,以及为什么我认为它更好:
要从麦克风捕获声音并将其存储到ByteArray,请使用SAMPLE_DATA事件,只要有更多声音数据从麦克风输入,就会调度该事件。文档中有一个例子可以解释得这么好。
由于大多数用户在没有任何特殊录音设备的普通家用电脑上,因此可以安全地假设录音的完全保真度是不必要的。我每个样本只使用2个字节,而且只使用单声道,而不是使用从Number
事件上的麦克风获得的完整64位浮点数(AS3 SAMPLE_DATA
)。只需阅读Number
并执行myFloatSample * 0x7fff
即可转换为16位有符号整数。
如果您只是在该频率范围内录制语音或其他内容,请不要使用原生44.1kHz采样率。你很可能会以22.05kHz的速度逃脱,这将直接减少一半的数据量。只需相应地设置Microphone.rate
属性。
请勿使用Base64对数据进行编码。将其作为二进制数据发送,这将显着缩小。您可以将其作为原始POST数据发送,或使用AMF之类的东西发送。此外,在发送之前,请使用ByteArray上的本机compress()
或deflate()
方法对其进行压缩。在服务器上,分别使用ZLIB或原始DEFLATE(inflate)算法进行解压缩,PHP supports。
一旦在服务器上解压缩,你所拥有的就是所谓的原始16位单声道PCM流。顺便说一句,这应该是ffmpeg(或lame)支持的输入格式之一,因此您应该能够将其编码为mp3而无需先进行任何手动解码。
显然,Red5解决方案可能会更好,因为它更适合任务。但是,如果您没有资源来设置Red5服务器,或者不想使用Java,那么只要您远离长时间录制,上述解决方案就可以正常运行。
举一个简单的例子,每秒22,050个样本进行30秒记录,每个样本2个字节将是~1.3MB。即使一旦放气,对于30秒的音频,向服务器的传输可能仍然几乎是一兆字节。这可能适用于您的申请,也可能不适用。