首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SimpleCaptcha和wav播放

SimpleCaptcha和wav播放
EN

Stack Overflow用户
提问于 2012-08-01 19:42:19
回答 3查看 4.5K关注 0票数 1

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

代码语言:javascript
复制
<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播放器。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-08-02 03:28:09

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

您可以简单地使用此闪存按钮,或者下载并修改闪存source code,以基于相同的代码创建您自己的自定义and。

当HTML5音频不可用时,您可以使用它作为后备。

示例用法如下:

代码语言:javascript
复制
<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按钮

上显示为图标的button

  • icon_file:图像的Flash的颜色

顺便说一句,我确实发现微软在<audio>标签中不支持WAV音频的决定很奇怪,特别是自从他们与IBM一起开创了WAV格式之后。是的,WAV文件比他们支持的其他压缩音频格式更大,但带宽也在增加到无关紧要的地步。

希望这能有所帮助。如果您尝试实现它,并有任何问题,请让我知道。您可以看到音频流here的演示。

票数 2
EN

Stack Overflow用户

发布于 2013-03-15 01:50:02

我认为@drew010的按钮帮助太棒了!谢谢。

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

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

代码语言:javascript
复制
    AudioFormat outDataFormat = new AudioFormat((float) 11025.0, (int) 16, (int) 1, true, false);
    AudioInputStream lowResAIS = AudioSystem.getAudioInputStream(outDataFormat, audioCapthca.getChallenge().getAudioInputStream());

我的captcha servlet代码如下:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2016-02-18 18:16:56

如果有人还在找的话。这是我的代码。对我来说,它在所有浏览器中都能工作。

代码语言:javascript
复制
<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>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11758462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档