Воспроизведение SimpleCaptcha и wav

Наш клиент использует SimpleCaptcha. Насколько я понимаю, SimpleCaptcha может создавать звуковые капчи в формате WAVE (.wav). Позже эти CAPTCHA воспроизводятся с использованием аудио-тега HTML5, примерно так:

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

Конечно, это несовместимо с кроссбраузерностью, и одна из причин - формат WAVE. Эта ссылка предполагает, что IE9 поддерживает только MP3, в то время как большинство других браузеров нормально работают с OGG и WAVE. Далее MP3 запатентован ... Фраунгофера?

Примечание: наша серверная часть основана на Java.

У меня вопрос: какой лучший вариант мы можем предложить клиентам, которые вообще не поддерживают формат WAVE (например, IE9) или аудиотег HTML5? Из-за проблем с патентами я предполагаю, что динамическое преобразование в mp3 на стороне сервера невозможно. Кроме того, я не знаю какой-либо библиотеки java, которая могла бы это сделать ... Я видел хорошие решения, такие как jPlayer, но они скажите, что «Для поддержки кроссбраузерности должен быть предоставлен формат, который работает как в HTML5, так и в Flash.», то есть mp3, mp4. Я также не нашел надежных WAVE-плееров на базе флеш-памяти.


person Lachezar Balev    schedule 01.08.2012    source источник
comment
Вы решили эту проблему? я тоже сталкиваюсь с той же проблемой   -  person AnujKu    schedule 20.03.2013
comment
Да - в конце дня было поставлено довольно глупое решение :-( Несчастному пользователю предлагается ссылка для скачивания, если не обнаружено никакой поддержки воспроизведения. Клиент предпочел это вместо каких-либо флеш-гаджетов.   -  person Lachezar Balev    schedule 26.03.2013
comment
Ого ... мы планируем использовать вспышку ...   -  person AnujKu    schedule 26.03.2013


Ответы (3)


С помощью других участников сообщества я создал кнопку Flash, которая может передавать файлы WAV с сервера на клиент. Он распространяется с Securimage PHP Captcha для потоковой передачи аудио CAPTCHA клиенту.

Вы можете просто воспользоваться этой кнопкой Flash или загрузить и изменить исходный код Flash, чтобы создать свой собственный индивидуальный, основанный на том же коде.

Вы можете использовать его как запасной вариант, когда аудио в формате 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: URL-адрес изображения в формате PNG для отображения в виде значка на кнопке Flash.

Кстати, я нахожу решение Microsoft не поддерживать звук WAV в теге <audio> странным, особенно с учетом того, что они первыми разработали формат WAV вместе с IBM. Да, файлы WAV больше, чем другие поддерживаемые ими сжатые аудиоформаты, но пропускная способность также увеличивается до такой степени, что это не имеет значения.

Надеюсь, это поможет. Дайте мне знать, если вы попытаетесь его реализовать и у вас возникнут вопросы. Вы можете увидеть демонстрацию потокового аудио здесь.

person drew010    schedule 01.08.2012
comment
Отличная работа, спасибо. Подскажите, пожалуйста, почему не поддерживается частота дискретизации 16000 Гц? Получается, что SimpleCaptcha именно с такой скоростью генерирует wav? - person Lachezar Balev; 02.08.2012
comment
Ах, это очень плохо, я не знал, что он этого не поддерживает. Я просмотрел код сторонней библиотеки, которую мы использовали для того, чтобы Flash воспроизводил файлы WAV, и оказалось, что он поддерживает только 5512 Гц, 11025 Гц, 22050 Гц и 44100 Гц. Я вижу, что нет возможности изменить SimpleCaptcha для создания WAV с другой частотой дискретизации. Код для частот дискретизации во Flash: здесь, я посмотрю, что нужно исправить, но у меня сейчас нет копии Flash. На данный момент это очень плохо - person drew010; 02.08.2012
comment
Возможно, SimpleCaptcha можно легко изменить для работы на частоте 11025 Гц, но мне придется ее перекомпилировать :-). Я попробую сегодня. Я понятия не имею, что это займет на стороне Flash. - person Lachezar Balev; 02.08.2012
comment
Да, это может быть простое деление на правильное значение на стороне Flash, а может быть и сложнее. Я видел в коде Java, что он жестко запрограммирован на 16 Гц и говорит, что это единственный битрейт, который он поддерживает, но, возможно, изменение этого значения и перекомпиляция - все, что нужно. - person drew010; 02.08.2012
comment
Ха, это не так просто, если вы сделаете так, чтобы полученный звук был очень медленным :-) В любом случае, это не невозможно. Думаю, что ваша кнопка - это решение проблемы SimpleCaptcha. - person Lachezar Balev; 03.08.2012
comment
Облом не думал, что это будет так просто. Я думаю, что у кого-то на работе есть Flash, если у меня будет возможность сегодня, я запрыгну на его машину, попробую пару вещей с версией Flash и посмотрю, что нужно, чтобы заставить его декодировать 16 Гц. - person drew010; 03.08.2012

Я думаю, что помощь @ drew010 с их кнопкой была потрясающей !! Спасибо.

Чтобы решить ту же проблему с поддержкой частотной скорости между SimpleCaptcha (16000 Гц) и поддерживаемым звуком для флэш-плеера (11025 Гц), я использовал альтернативное решение, вместо того, чтобы изменить источник simplecaptcha или попытаться решить его во флэш-программировании.

В моей реализации капчи есть настраиваемый сервлет звуковой капчи (поддерживаемый 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());

Мой код сервлета капчи ниже:

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);
    }
}
person blueskypoa    schedule 14.03.2013
comment
В моем случае это не работает ... Я получаю исключение java.io.IOException: длина потока не указана в 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) - person Amit; 17.03.2015

Если кто-то все еще ищет Это. Вот мой код. У меня он работал во всех браузерах.

<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>
person user2290137    schedule 18.02.2016