SimpleCaptcha和wav播放

时间:2012-08-01 11:42:19

标签: java flash captcha html5-audio jplayer

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

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

当然这不是跨浏览器兼容的,其中一个原因是WAVE格式。这个link表明IE9仅支持MP3,而大多数其他浏览器都支持OGG和WAVE。进一步的MP3是给Fraunhofer的专利吗?

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

我的问题是,对于不支持WAVE格式(例如IE9)或HTML5音频标签的客户,我们可以提供的最佳后备是什么?由于专利问题,我想在服务器端动态转换为mp3不是一种选择。此外,我不知道任何可以执行此操作的Java库...我已经看到了很好的解决方案,例如jPlayer,但他们说“对于跨浏览器支持,必须提供一种既适用于HTML5又适用于Flash的格式。 “,即mp3,mp4。我也没有找到任何可靠的闪存WAVE播放器。

3 个答案:

答案 0 :(得分:2)

在社区其他人的帮助下,我创建了一个Flash按钮,可以将WAV文件从服务器传输到客户端。它与Securimage PHP Captcha一起发布,用于将音频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图像的网址

另一方面,我确实发现微软决定不支持奇怪的<audio>标签中的WAV音频,特别是因为他们开创了与IBM的WAV格式。是的WAV文件比它们支持的其他压缩音频格式更大,但带宽也增加到无关紧要的程度。

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

答案 1 :(得分:2)

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

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

我的验证码实现有一个自定义音频验证码servlet(由simplecaptcha支持),因此我使用this post中@Claude提供的提示,使用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);
    }
}

答案 2 :(得分:0)

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

<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>