php - 在网站 : Red5 stream or posting the audio data? 上录制音频

标签 php flash audio ffmpeg red5

让我首先确定我想做什么:

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

现在,我有 2 个选择来进行录制,都涉及嵌入在我的站点中的 .swf:

1)我可以使用 Red5 服务器将音频流式传输到我的服务器并保存文件并将所述文件的路径返回到我的应用程序以进行数据库保存,这似乎相当复杂,因为我必须转换音频并将其移动到服务器端 Red5 应用程序中属于用户的适当文件夹,我不太清楚如何构建。

2)我可以简单地记录音频并获取它的字节数组,对其进行 Base64 编码并将其与其他必要的数据(无论是通过简单的 POST 还是 AJAX 调用)一起发送到 PHP,解码它在服务器上并使用适当的扩展名制作文件,使用ffmpeg也会在这里进行音频转换,这个选项看起来更简单但我不知道它有多可行。

您认为哪个选项更可行且更易于开发?提前致谢

最佳答案

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

  • 要从麦克风捕获声音并将其存储到 ByteArray,请使用 SAMPLE_DATA每当有更多声音数据从麦克风传来时调度的事件。文档中有一个示例应该可以很好地解释这一点。
  • 因为大多数用户会使用普通的家用电脑,没有任何特殊的录音设备,所以可以肯定地假设录音的完全保真度是没有必要的。我每个样本只使用了 2 个字节,并且只使用了单声道,而不是使用从 Number 上的麦克风获得的完整 64 位浮点数 (AS3 SAMPLE_DATA )事件。只需阅读 NumbermyFloatSample * 0x7fff转换为 16 位有符号整数。
  • 如果您只是在该频率范围内录制语音或其他内容,请不要使用原生 44.1kHz 采样率。使用 22.05kHz 可能会很好,这将直接将数据量减少一半。只需设置 Microphone.rate相应的属性(property)。
  • 不要使用 Base64 对数据进行编码。将其作为二进制数据发送,这将明显更小。您可以将其作为原始 POST 数据发送,或使用 AMF 之类的东西发送。另外,在发送之前,请使用 native compress()deflate() ByteArray 上的方法来压缩它。在服务器上,分别使用 ZLIB 或原始 DEFLATE(膨胀)算法解压缩,PHP supports .
  • 在服务器上解压缩后,您所拥有的基本上就是所谓的原始 16 位单声道 PCM 流。顺便说一句,这应该是 ffmpeg(或 lame)支持的输入格式之一,因此您应该能够将其编码为 mp3,而无需先进行任何手动解码。

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

    举个简单的例子,以每秒 22,050 个样本进行 30 秒的记录,每个样本 2 字节约为 1.3MB。即使放气后,传输到服务器的 30 秒音频仍可能接近 1 兆字节。这可能会或可能不会被您的应用程序接受。

    关于php - 在网站 : Red5 stream or posting the audio data? 上录制音频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7326039/

    相关文章:

    php - 从地址字段中拆分门牌号

    php - 不阻塞发送邮件 'execution'

    python - pygame `.mid` 音频文件在其他平台上听起来不同

    apache-flex - 是否可以创建 'command line' swf?

    java - 如何在服务器端动态创建 Flash 图像?

    javascript - jQuery 自动播放 HTML5 音频

    python - 在python中记录输出声音

    php - 更改悬停时的背景颜色,jquery

    php - 我如何为 imagemagick 提供图像库路径

    flash - 安全错误: Error #2122: Security sandbox violation