1

私たちのクライアントはSimpleCaptchaを使用しています。私の理解では、SimpleCaptchaはWAVE形式(.wav)でオーディオキャプチャを生成できます。後で、これらのCAPTCHAは、次のようなHTML5オーディオタグを使用して再生されます。

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

もちろん、これはクロスブラウザ互換ではなく、その理由の1つはWAVE形式です。このリンクは、IE9がMP3のみをサポートしているのに対し、他のほとんどのブラウザーはOGGとWAVEで問題がないことを示しています。さらにMP3はフラウンホーファーに特許を取得していますか?

注:バックエンドはJavaベースです。

私の質問は、WAVE形式(IE9など)またはHTML5オーディオタグのいずれもサポートしていないクライアントに提供できる最善のフォールバックは何ですか?特許の問題のため、サーバー側でのmp3への動的変換はオプションではないと思います。さらに、これを行う可能性のあるJavaライブラリはわかりません... jPlayerのような優れたソリューションを見たことがありますが、「クロスブラウザをサポートするには、HTML5とFlashの両方で機能する形式を提供する必要があります」と言われています。 、mp4。信頼できるフラッシュベースのWAVEプレーヤーも見つかりませんでした。

4

3 に答える 3

2

@drew010のボタンの助けは素晴らしかったと思います!! ありがとうございました。

SimpleCaptcha(16000Hz)とフラッシュプレーヤー(11025Hz)でサポートされているオーディオ間のレート周波数サポートに関する同じ問題を解決するために、代わりにsimplecaptchaソースを変更するか、フラッシュプログラミングで解決してみました。

私のキャプチャ実装にはカスタムオーディオキャプチャサーブレット(simplecaptchaでサポートされている)があるため、この投稿で@Claudeが提供するヒントを使用して、 tritonuslibを使用してオーディオサンプルレートを変換しました。コードの一部は次のようになります。

    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);
    }
}
于 2013-03-14T17:50:02.127 に答える
2

コミュニティの他の人の助けを借りて、サーバーからクライアントにWAVファイルをストリーミングできるFlashボタンを作成しました。これは、オーディオCAPTCHAをクライアントにストリーミングするためにSecurimagePHPCaptchaとともに配布されます。

この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:Flashボタンのアイコンとして表示するpng画像へのURL

<audio>ちなみに、特にIBMでWAV形式を開拓したため、タグでWAVオーディオをサポートしないというMicrosoftの決定は奇妙だと思います。はい、WAVファイルはサポートされている他の圧縮オーディオ形式よりも大きいですが、帯域幅も問題にならない程度まで増加しています。

お役に立てば幸いです。あなたがそれを実装しようとし、質問があれば私に知らせてください。ここでオーディオストリーミングのデモを見ることができます。

于 2012-08-01T19:28:08.957 に答える
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>
于 2016-02-18T10:16:55.993 に答える