20

だから私は自分のウェブサイトで H.264 .mp4 ビデオを提供しています。オープン ソースの HTML5 ビデオ プレーヤーhttp://mediaelementjs.com/を使用しています。一部の訪問者は、iPhone の Safari から閲覧しています。iPhone 4 は最大 720p までのビデオ再生しかサポートしていないため、ビデオをそれよりも小さくすると、iPhone 4 と 4S で動作します。ただし、4S は最大 1080p のビデオをサポートします。では、大きなビデオを 4S に配信し、小さなビデオを 4 に配信するにはどうすればよいでしょうか? 私はこれを試しました:

<video width="640" height="400" id="player" controls="controls" preload="auto">
    <source src="https://s3.amazonaws.com/my-big-1080p-video.mp4" type="video/mp4">
    <source src="https://s3.amazonaws.com/my-small-720p-video.mp4" type="video/mp4">
</video>

しかし、うまくいきませんでした。iPhone 4 は、2 番目のソースを試すほどスマートではありません。Web サイトでさまざまなデバイスに正しい動画を提供するにはどうすればよいですか?

4

11 に答える 11

9

iPhone 4 で 720p ビデオを再生 — iPhone 4S で 1080p ビデオを再生

これを iPhone 4 と 4S ( jsfiddle ) で試してください。

<video src="http://file.brow.sr/1080p.mp4" onerror="this.src='http://file.brow.sr/720p.mp4';" controls loop width="320" height="180">
</video>

説明

1080p ビデオを読み込み、Javascript を使用onErrorして 720p にフォールバックします。

Safari は 1080p ファイルのヘッダーをスニッフィングして再生可能かどうかを判断し、大きすぎてデコードできない場合はエラーをスローします。次に、そのエラーをキャッチして 720p ビデオを提供します。

この種の機能検出を使用することにより、フォールバックは 1 つのデバイス (iPhone 4) だけでなく、おそらく多くの異なる対応ブラウザーで機能します。

<source>複数の が機能しない理由

同じ MIME タイプの複数の<source>タグを使用する場合、ブラウザは互換性のある MIME タイプを持つ最初のソースを読み込み、その動画が再生できない場合でも他のソースを破棄します。これは、要素が代替のフレーム サイズやファイル サイズではなく、代替のビデオ コーデック (例: ogg、webm、mp4) を提供することが期待されているためです。source

于 2014-02-11T10:55:31.027 に答える
1

親愛なる@Duvraiが言及した理由により、ソリューションは機能しません。私はあなたの目的を満たす正しい方法を達成するために検索しましたが、どのソースを配信するかを決定するためにいくつかの JavaScript コード (ここではサーバー側のプログラミングを考慮していません) を使用しない限り、選択の余地がないように思われました. 次のスニペットは、ブラウザーのTypeとそのVersionを検出します。

navigator.sayswho= (function(){
    var ua= navigator.userAgent, tem, 
    M= ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || [];
    if(/trident/i.test(M[1])){
        tem=  /\brv[ :]+(\d+)/g.exec(ua) || [];
        alert('IE '+(tem[1] || ''));
    }
    if(M[1]=== 'Chrome'){
        tem= ua.match(/\bOPR\/(\d+)/)
        if(tem!= null) alert('Opera '+tem[1]);
    }
    M= M[2]? [M[1], M[2]]: [navigator.appName, navigator.appVersion, '-?'];
    if((tem= ua.match(/version\/(\d+)/i))!= null) M.splice(1, 1, tem[1]);
    alert( M.join(' '));
})();

これで、javascript で数行のコードを記述し、ブラウザの TypeVersionに基づいてビデオ ソースを変更することができます。

于 2015-01-20T09:19:17.980 に答える
1

これを行うphpスクリプトがあります。ここで入手しました-http://detectmobilebrowsers.com/-はい、javascript、JQueryなどのバージョンがあります。それは私たちにとって非常にうまく機能しており、かなり更新されているように見えるという利点があります. 私たちが遭遇した唯一の問題は、それ自体をモバイル デバイスとして識別しないように意図的に設定されていた iPad でした。

于 2012-09-24T19:17:09.283 に答える
0

MEJS プレーヤーはエラーを正しく処理しません。実際に何が起こったのかを検出できるように、さらにサポートを追加したいと思います。iPhone ではエラー イベントがスローされることもありますが、実際にはエラーはなく、ビデオを正しく再生できます。

mediaelement-and-player.js を開いて探します

        // error handling
        media.addEventListener('error',function() {
            loading.hide();
            controls.find('.mejs-time-buffering').hide();
            error.show();
            error.find('mejs-overlay-error').html("Error loading this resource");
        }, false);

次に、次のコードを使用します。

        // error handling
        media.addEventListener('error',function() {
            var
                videoError = error.closest('.mejs-inner').find('video,audio')[0].error,
                msg = 'Error loading this resource.';

            if (!videoError) { //webkit sometimes throws error event but video has no actual error and can play the video correctly - ignore the event
                console.log('MEJS event: error throws but no error found - ignored');
                return;
            }

            //hide elements visible while loading and playing - cannot play after error
            loading.hide();
            controls.addClass('hidden'); //controls are automatically displayed when mouse hover is detected - must hide it permanently using class with !important
            error.closest('.mejs-inner').find('.mejs-overlay-play').hide(); //also hide overlay with play button
            error.show();

            //get relevant error message
            switch(videoError.code) { //see http://www.w3.org/TR/html5/embedded-content-0.html#error-codes
                case videoError.MEDIA_ERR_ABORTED: //loading stopped (by user, e.g. by pressing ESC or Back)
                    msg = 'Video loading aborted';
                    break;
                case videoError.MEDIA_ERR_DECODE: //invalid format (actually presumed format is OK, but the data does not correspond with the defined format - probably corrupted file of data transfer)
                    msg = 'Video file is broken';
                    break;
                case videoError.MEDIA_ERR_NETWORK: //network problem (was able to connect to the provided URL but could not get the video data)
                    msg = 'Network connection lost';
                    break;
                case videoError.MEDIA_ERR_SRC_NOT_SUPPORTED: //invalid source URL (url provided does not lead to a supported video file)
                    msg = 'Video not supported';
                    break;
            }

            //display error
            console.log('Video error: ' + msg + ', code: ' + videoError.code);
            error.find('.mejs-overlay-error').html(msg);
        }, false);

必要に応じて、サポートされていないビデオの場合に 720p に切り替える独自の処理を追加できます。

そして、mediaelementplayer.cssにこれを追加します(実際に必要なのか、それとも私のテーマの改善なのかはわかりません):

/* Display errors */
.mejs-overlay-error {
    color: white;
    background: black;
    text-align: center;
    font-size: 1.2EM;
}
.mejs-controls.hidden {
    display: none !important;
}
/* End: Display errors */

これはバージョン 2.13.1 用です。新しいバージョンの方が優れているかどうかはわかりません。

更新: 最新バージョン 2.16.3 には、まったく同じ役に立たないエラー ハンドラが含まれています。

于 2015-01-20T14:56:35.057 に答える
0

私は Apple オタクではないので、サンプル コードを提供することはできませんが、XHTML と HTML5 の間で互換性のあるサイトを作成しようとした私の経験に基づいて、ブラウザーのバージョンよりもブラウザーの機能を確認する方が良いと言えます。

その理由は、ブラウザのバージョンが多すぎて維持を正当化できないためです。また、ユーザー エージェント文字列が変更される可能性もあります。簡単な if ステートメントを使用して HTML5 ビデオ機能をチェックするスクリプトを作成し、結果に応じていずれかのビデオをレンダリングすることをお勧めします。

于 2012-09-10T05:46:54.490 に答える
0

このリンクを試してくださいライブラリはユーザーエージェントを検出できるはずであり、それに応じて適切なファイルを提供できます。

于 2012-06-07T12:49:43.127 に答える
0

WURFL (Wireless Universal Resource File - http://wurfl.sourceforge.net/ ) や DeviceAtlas などのモバイル デバイス検出データベースは、チェックしている機能がビデオだけである場合は過剰かもしれません。しかし、これ、チェックを実行可能にコンパイルできるよりもはるかに広い範囲のデバイスに対して堅牢な機能検出を取得するための迅速な方法であり、サイトでビデオ サポート以外の他の機能を検証する必要がある場合に便利です。

于 2013-02-14T06:16:39.230 に答える
-1

これにより、iOS のバージョンが検出されます。多分それは役に立つかもしれません:

if (navigator.userAgent.indexOf('5_0') != -1) {
    alert('IOS 5');
} else {
    alert('Other');
}

編集:スクリプトを調整してテストしました。

于 2012-11-09T16:07:44.863 に答える
-1

これをタグに入れます:

<meta name="viewport" content="initial-scale=1.0">
<meta name="viewport" content="width=320.1">    
<script>
if (window.screen.height==568) { // iPhone 5
                    document.querySelector("meta[name=viewport]").content="width=320.1";
                  // your code here
                }
</script>
于 2013-02-17T05:26:03.087 に答える