【问题标题】:SimpleCaptcha and wav playbackSimpleCaptcha 和 wav 播放
【发布时间】:2012-08-01 11:42:18
【问题描述】:

我们的客户正在使用SimpleCaptcha。我的理解是 SimpleCaptcha 能够生成 WAVE 格式 (.wav) 的音频验证码。稍后这些 CAPTCHA-s 使用 HTML5 音频标签播放,如下所示:

<audio controls="controls" autoplay>
    <source src="captcha.wav" />
</audio>

当然,这不是跨浏览器兼容的,原因之一是 WAVE 格式。 link 表明 IE9 仅支持 MP3,而大多数其他浏览器都可以使用 OGG 和 WAVE。进一步的 MP3 是专利给...弗劳恩霍夫?

注意:我们的后端是基于 Java 的。

我的问题是,对于根本不支持 WAVE 格式(例如 IE9)或 HTML5 音频标签的客户,我们可能提供的最佳后备方案是什么?由于专利问题,我想在服务器端动态转换为 mp3 不是一种选择。此外,我不知道任何可以执行此操作的 java 库...我见过像 jPlayer 这样的不错的解决方案,但他们说“为了支持跨浏览器,必须提供一种在 HTML5 和 Flash 中都可以使用的格式。”,即mp3、mp4。我也没有找到任何可靠的基于 Flash 的 WAVE 播放器。

【问题讨论】:

  • 你解决了这个问题吗?我也面临同样的问题
  • 是的 - 一天结束时提供了一个非常愚蠢的解决方案 :-( 如果没有检测到播放支持,则为不幸的用户提供下载链接。客户更喜欢这个而不是任何闪存小工具.
  • 哦哇..我们打算使用闪存而不是..

标签: java flash captcha html5-audio jplayer


【解决方案1】:

在社区其他人的帮助下,我创建了一个 Flash 按钮,可以将 WAV 文件从服务器流式传输到客户端。它与 Securimage PHP Captcha 一起分发,用于将音频验证码流式传输到客户端。

您可以简单地点击这个 Flash 按钮,或者下载并修改 Flash source code,以基于相同的代码创建您自己的自定义。

当 HTML5 音频不可用时,您可以将其用作备用。

示例用法如下:

<object type="application/x-shockwave-flash"
        data="securimage_play.swf?audio_file=/PATH/TO/AUDIO.wav"
        width="32" height="32">
    <param name="movie" value="securimage_play.swf?audio_file=/PATH/TO/AUDIO.wav" />
</object>

您可以将这些附加选项传递给securimage_play.swf:

  • bgcol: Flash 按钮的背景颜色
  • icon_file:要在 Flash 按钮上显示为图标的 png 图像的 URL

在旁注中,我确实发现 Microsoft 决定在 &lt;audio&gt; 标签中不支持 WAV 音频的决定很奇怪,特别是因为他们与 IBM 一起开创了 WAV 格式。是的,WAV 文件比它们支持的其他压缩音频格式要大,但带宽也在增加,已经到了无关紧要的程度。

希望对您有所帮助。如果您尝试实施它并有任何问题,请告诉我。您可以看到音频流的演示here。

【讨论】:

  • 非常棒的作品,谢谢。能否请您提示为什么不支持 16000Hz 采样率?事实证明,SimpleCaptcha 以这样的速度生成 wav?
  • 啊,太糟糕了,我不知道它不支持它。我查看了用于让 Flash 播放 WAV 文件的 3rd 方库的代码,它似乎只支持 5512Hz、11025Hz、22050Hz 和 44100Hz。我看到也没有办法改变 SimpleCaptcha 以产生具有不同采样率的 WAV。 Flash 中的采样率代码是here,我会看看修复它需要什么,但我目前没有 Flash 的副本。这暂时太糟糕了
  • 也许 SimpleCaptcha 可以很容易地修改为在 11025Hz 下工作,但我必须重新编译它:-)。我今天会试试。我不知道 Flash 方面会采取什么措施。
  • 是的,可能是在Flash端被正确的值简单除法,也可能更复杂。我在 Java 代码中看到它具有 16Hz 硬编码,并说这是它支持的唯一比特率,但可能只需要更改该值并重新编译即可。
  • 哈,事情没那么简单,如果你这样做的话,所产生的音频就会变得非常缓慢 :-) 无论如何,这并非不可能。我认为您的按钮可以解决 SimpleCaptcha 问题。
【解决方案2】:

我认为@drew010 对他们的按钮的帮助很棒!谢谢。

为了解决 SimpleCaptcha (16000Hz) 和 Flash 播放器支持的音频 (11025Hz) 之间的速率频率支持的相同问题,我使用了另一种解决方案,而不是更改 simplecaptcha 源或尝试在 Flash 编程中解决它。

我的验证码实现有一个自定义音频验证码 servlet(由 simplecaptcha 支持),所以我使用 @Claude 在 this post 中提供的提示,使用 tritonus lib 转换音频采样率。这段代码如下所示:

    AudioFormat outDataFormat = new AudioFormat((float) 11025.0, (int) 16, (int) 1, true, false);
    AudioInputStream lowResAIS = AudioSystem.getAudioInputStream(outDataFormat, audioCapthca.getChallenge().getAudioInputStream());

下面是我的验证码 servlet 代码:

public class AudioCaptchaServlet extends HttpServlet {

    @Override protected void doGet(HttpServletRequest req,
            HttpServletResponse resp) throws ServletException, IOException {

        Map<Integer, String[]> voicesMap = new HashMap<Integer, String[]>();
        String[] fileLocs0 = {"/captcha/pt_BR/0.wav"};
        String[] fileLocs9 = {"/captcha/pt_BR/1.wav"};
        (...)

        voicesMap.put(0, fileLocs0);
        voicesMap.put(1, fileLocs1);
        (...)

        VoiceProducer voiceProducer = new RandomNumberVoiceProducer(voicesMap);

        AudioCaptcha ac = new AudioCaptcha.Builder()
            .addAnswer()
            .addNoise()
            .addVoice(voiceProducer)
            .build();

        req.getSession().setAttribute(AudioCaptcha.NAME, ac.getAnswer());

        //Converte Sons com bitrate de 16000Hz (simplecaptcha) para 11025Hz (suportada pelo flash player)
        AudioFormat outDataFormat = new AudioFormat((float) 11025.0, (int) 16, (int) 1, true, false);
        AudioInputStream lowResAIS = AudioSystem.getAudioInputStream(outDataFormat, ac.getChallenge().getAudioInputStream());

        CaptchaServletUtil.writeAudio(resp, new Sample(lowResAIS));
    }

    @Override protected void doPost(HttpServletRequest req,
            HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

【讨论】:

  • 在我的情况下不起作用...我得到以下异常 java.io.IOException: stream length not specified at com.sun.media.sound.WaveFileWriter.write(WaveFileWriter.java:121 ) 在 javax.sound.sampled.AudioSystem.write(AudioSystem.java:1314) 在 uadmin.captcha.CaptchaServletUtil.writeAudio(CaptchaServletUtil.java:23) 在 demo.captcha.AudioCaptchaServlet.doGet(AudioCaptchaServlet.java:27)跨度>
【解决方案3】:

如果有人还在寻找它。这是我的代码。它适用于我的所有浏览器。

<audio controls id="audioCaptcha">
    <source src="audio.wav" type='audio/wav' height="50px" width="100px"/>
    <embed src="audio.wav" type='audio/wav' autoplay="false" height="50px" width="100px"/>
</audio>

【讨论】:

    猜你喜欢
    • 2011-08-28
    • 1970-01-01
    • 2013-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多