【问题标题】:Capturing the user's sound card output in a Java Applet在 Java Applet 中捕获用户的声卡输出
【发布时间】:2014-08-05 00:48:25
【问题描述】:

我正在寻找一种方法来捕获用户的声卡输出并通过 RTMP 将其实时流式传输到 red5 服务器。

使用音频重定向,例如使用 Windows Stereo Mix 不是一个选项,因为它很难配置,并且在配置和 Windows 版本之间无法一致地工作。

我对这个方向的各种解决方案的可能性持开放态度——甚至可能使用 JNI/JNA?

感谢您的建议!

【问题讨论】:

  • 您在使用 Windows 混音时有什么配置困难?
  • 我同意@Neil Coffey - 立体声混音选项在 Windows 上的所有现代版本中都能始终如一地工作。自 Vista 以来,该设备通常默认禁用,但有很多教程可以纠正这一点 - howtogeek.com/howto/39532/…
  • 我觉得对用户来说太难了。甚至在我们自己的办公室中,我们也发现了立体声混音不起作用 (XP) 的配置。该功能对我们的应用至关重要。
  • 令我震惊的是,您要解决的问题是“用户可以修改他们机器的配置”,而这并没有真正的解决方案。在您看到 Windows Stereo Mix 似乎无法正常工作的机器上,我至少会花一点时间来找出实际的配置问题以及您的应用程序如何检测并提醒用户注意它,而不是跳到更激进(并且可能不起作用)的解决方案,例如编写声音驱动程序......!
  • 立体声混音不会出现在 Windows 7 或 Vista 上,即使在传统支持的声卡(如创意卡)上也是如此。

标签: java applet audio-streaming java-web-start javasound


【解决方案1】:

如果您愿意使用 JNI/JNA,为什么不通过 C++ 或 C 访问声音驱动程序,那会容易得多,因为无论如何您都将使用 Java 编写接口,但它们的实现将使用 C++ 或 C。

【讨论】:

  • 我不是 100% 确定,但我认为这不会有帮助。据我所知,没有声音驱动程序可以通过捕获 Windows 立体声混音获得 Java 无法获得的“秘密”输出。换句话说,如果用户设法配置他们的机器,使 Windows 立体声混音中没有任何内容,那么多路复用声音驱动程序也不会捕获任何内容。不过,我想海报对此进行更多研究并没有什么坏处。
【解决方案2】:

请参阅 Java 教程中的 Capturing Audio

小程序需要经过数字签名以及最终用户的信任,才能截取声音线路中的数据。

如果没有启用软件或硬件“音频环回”,它可能会完全失败(即使在完全受信任的小程序中)。

【讨论】:

  • 正如我在问题中所说,我不想捕获声卡输入信号(或环回设备),而是声卡的输出
  • 是的,我从您的原始问题中了解到。你想说啥?顺便说一句 - 小程序在沙盒中可以发出声音,但要截取声音线中的数据(例如读取输出),您需要一个签名的小程序。
  • @Andrew——你真的试过这个吗?我有一种感觉,这不是真的。 (文档说您需要一个签名的 Applet,但至少在 Java 插件的某些版本中,这似乎不是真的。)
  • @Neil 插件的哪个版本?鉴于沙盒小程序可以将数据发送回其主服务器,这意味着小程序可以“监听”最终用户并将声音数据转发给站点/小程序的供应商,而无需用户的具体知识。对我来说,这似乎是一个巨大的安全漏洞。
  • @Neil:回答你的具体问题,不,我实际上并没有尝试在小程序中录制,只有 JWS 应用程序。
【解决方案3】:

好的 - Java 中绝对没有本地方法可以从浏览器中捕获声卡输出。可以使用Java Native Interface编写特定平台的代码来截取线路并将原始音频数据传递给小程序进一步处理。

【讨论】:

    【解决方案4】:

    这并不像看起来那么简单。

    你需要做什么 [第 1 部分 - 创建一个存储信息的地方]:

    • 描述存储文件的服务器。 (例如:Google App Engine)
    • 描述您希望如何存储文件。 (例如:数据存储)
    • 描述数据完整性的重要性。 (例如:使用现有的上传 api 上传文件,然后流式传输数据更容易。示例 Apache FileUpload)

    假设您要上传到服务器数据库的最大大小为 1 mb 的文件(例如 .ogg)音频文件。如果您要创建一个自动上传器,您还可以创建一个网页前端,您可以手动使用它。

    如果您想回答您的问题,请形成清晰的问题,人们可以回答。如果您不指定限制,那么它是 IMO 非专业的,至少我永远不会写一个复杂的解决方案。


    对不起,我最初的回答对你没有用。我试图简化问题,但我过度简化了。 "Everything should be made as simple as possible, but not simpler." A. Einstein.

    作为您问题的潜在解决方案,我可以推荐:

    • Screener - 一个 Java 程序,不仅可以流式传输音频,还包括截屏视频。

    如果它不能解决你的问题,那么我希望它至少对你有用。

    【讨论】:

    • 我认为很明显我想捕获用户的声卡输出并将其实时流式传输到服务器。通常的解决方案使用类似于 Windows 立体声混音功能的东西,将声卡输出路由到虚拟输入。这是我不想要的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2011-10-02
    • 2015-10-22
    • 1970-01-01
    • 2010-11-20
    • 2018-01-30
    • 2011-06-09
    • 2011-10-06
    相关资源
    最近更新 更多