2011-09-06 112 views
0

让我先确定我想要做什么:在网站上录制音频:Red5流或发布音频数据?

我的用户能够在我的网站上录制voicenotes,为索引添加标签以索引标题以及标题。保存笔记后,我将笔记的路径以及其他信息保存在我的数据库中。

现在,我有2个选择做记录,都涉及嵌在我的网站瑞士法郎:

1)我可以用Red5的流媒体服务器音频到我的服务器,并保存文件并返回路径到我的应用程序来做数据库保存,似乎相当复杂,因为我将不得不转换音频,并将其移动到属于服务器端Red5应用程序,我不是很知道如何构建。

2)我可以简单地记录音频并获取其字节数组,并对其执行Base64编码,并将其连同剩余数据一起发送到PHP(可通过简单的POST或AJAX调用),解码它在服务器上,并使用适当的扩展名的文件,音频转换也会发生在这里使用ffmpeg,这个选项似乎更简单,但我不知道它是多么可行。

,你会说什么的选择是更可行和更容易开发?在此先感谢

回答

4

根据记录的计划持续时间,你很可能能够使用选项第二把交椅。我最近在一个项目中成功地使用了类似的方法,但录制只有30秒左右。这是我做了不同于你所建议,虽然,所以我认为这是更好:

  • 从麦克风捕捉声音,并将其存储到一个ByteArray中,使用的是派出每当更多SAMPLE_DATA事件声音数据从麦克风进入。文档中有一个例子可以很好地解释这一点。

  • 因为大多数用户会在正常的家用电脑没有任何特殊的录音设备,它是安全的假设,记录的全保真是没有必要的。我仅使用每个采样2个字节,并且只使用单声道,而不是使用从SAMPLE_DATA事件的麦克风获得的完整64位浮点数(AS3 Number)。简单阅读Number并做myFloatSample * 0x7fff转换为16位有符号整数。

  • ,如果你只是在录音讲话或别的东西,在这个频率范围内,不要使用本地44.1kHz的采样率。在22.05kHz的情况下,你可能会得到很好的效果,这将会在半数的时间内减少数据量。只需相应地设置Microphone.rate属性。

  • 不要用的Base64编码数据。将它作为二进制数据发送,这将显着更小。您可以将它作为原始POST数据或使用AMF之类的东西发送。此外,在发送之前,请使用ByteArray上的本机compress()deflate()方法对其进行压缩。在服务器上,分别使用ZLIB或原始DEFLATE(充气)算法进行解压缩,即PHP supports

  • 一旦解压缩在服务器上,你有什么本质上是所谓的原始16位单声道PCM流。顺便说一句,这应该是ffmpeg(或lame)支持的输入格式之一,所以你应该能够将它编码为mp3,而不必先进行任何手动解码。

显然,Red5解决方案可能会更好,因为它更适合于该任务。但是,如果您没有资源来设置Red5服务器,或者不想使用Java,只要远离过长的录制,上述解决方案就可以很好地工作。

举一个简单的例子,以每秒22050个采样30秒记录,每个样品2个字节将是〜1.3MB。即使一旦放气,传输到服务器的音频数据仍可能在30秒内达到几兆字节。这可能会或可能不会被您的应用程序接受。

+0

感谢您的答复,似乎是一个非常完整的解决方案。虽然文件大小似乎有点大。这很奇怪,因为使用Red5录制音频和视频时,flv文件最终会在20秒钟的音频和视频中达到大约400K。现在的事情是,我怎样才能从闪存中获取音频流?看起来,除非你使用像FMS或Red5这样的服务器,否则这是不可能的,你是如何设法捕捉它的? – 8vius

+0

忘记提到我想允许的最多2分钟的录音,现在 – 8vius

+0

重新捕获声音,我编辑我的上述回应。由于音频在客户端被破坏性地编码(例如使用MP3),所以流传输时的文件大小非常小。您可能也想在AS3的客户端上考虑这样做,但我怀疑在如此慢的系统上编码所花的时间,净效应可能会比发送PCM需要更长的时间。 – richardolsson