🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Microsoft Edge

Microsoft Edgeは、マイクロソフト社が開発する新しいWebブラウザです。Windows 10から標準搭載されており、Internet Explorerとは違うレンダリングエンジンが採用されています。

uWSGI

uWSGIは、PythonでWebサービスを動かすアプリケーションサーバの一つです。WSGI(Web Server Gateway Interface)アプリケーションコンテナの一種で、WSGIに則ったDjangoやFlaskなどで動かすことができます。

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

1回答

11561閲覧

AndroidのMicrosoft EdgeでWeb上の動画ファイルが再生できない

hkcomori

総合スコア30

Microsoft Edge

Microsoft Edgeは、マイクロソフト社が開発する新しいWebブラウザです。Windows 10から標準搭載されており、Internet Explorerとは違うレンダリングエンジンが採用されています。

uWSGI

uWSGIは、PythonでWebサービスを動かすアプリケーションサーバの一つです。WSGI(Web Server Gateway Interface)アプリケーションコンテナの一種で、WSGIに則ったDjangoやFlaskなどで動かすことができます。

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/11/07 05:41

編集2019/11/07 09:45

nginx + uWSGI + Python(Flask)で、動画ファイルをログインした人だけに配信しようとしています。
認証はPython側で行い、動画ファイルの送信はファイルサイズが大きいため、nginxのX-Accel-Redirect機能を使用しています。
認証にはFlask-Loginを使用しています。

解決したいこと

Android上のMicrosoft Edgeで接続すると、動画を再生できません。
具体的には以下のような挙動となります。

  • 動画のURLに直接アクセス: 再生されず黒い画面のまま
  • videoタグで埋め込み: 再生されず、以下のようなエラーメッセージが表示される

The media playback was aborted due to a corruption problem or because the media used features your browser did not support.

なお、以下の環境では、当問題は発生せず、動画が再生できます。

  • Android上のGoogle Chrome
  • WindowsやiOS上のMicrosoft Edge
  • WindowsやiOS上のGoogle Chrome

Android上のMicrosoft Edgeでも再生できるようにするには、どうすればよいでしょうか?

コード

当該ファイルを送信する部分のコードを以下に示します。

python

1from mimetypes import guess_type 2from os.path import abspath、basename, getsize 3 4from flask import request, make_response 5 6@app.route('/auth_dist/<path:target_path>') 7@login_required 8def auth_dist(target_path: str): 9 print(request.headers) # クライアントのリクエストヘッダを確認(※) 10 return x_send_file(f'{LOCAL_ROOT}/{target_path}') 11 12def x_send_file(local_path): 13 response = make_response() 14 response.headers['Content-Description'] = 'File Transfer' 15 response.headers['Cache-Control'] = 'no-cache' 16 response.headers['Connection'] = 'keep-alive' 17 response.headers['Content-Disposition'] = f'inline; filename={basename(local_path)}' 18 response.headers['Content-Length'] = getsize(local_path) 19 response.headers['X-Accel-Redirect'] = get_url(local_path, prefix='/internal') 20 response.mimetype, _ = guess_type(local_path) 21 return response 22 23def get_url(path, *, prefix='', postfix=''): 24 replace_after = APP_ROOT_PATH + prefix 25 return re.sub('^'+LOCAL_ROOT, replace_after, abspath(path)) + postfix

調査してわかっていること

動画を上記コードの※部分で、動画ファイルをリクエストされた際のヘッダを確認したところ、
以下のような出力が得られました。
再生できないときは、この後、ログインページへリダイレクトするレスポンスが続きます。
(ページの取得に対するリダイレクトではないため、ブラウザでの見かけ上はログインページには遷移しません)

このことから、Microsoft Edgeでの動画リクエストの場合のみ、
ログイン状態が解除されてしまい、動画ファイルが配信されていないものと推測されます。
よく見ると、なぜかセッションIDが変わっていることがわかります。

# Androidでページを取得した場合のリクエストヘッダ(表示できる) Host: xxxxxxxxxxxxxxx Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Linux; Android 6.0; BG2-W09) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.90 Mobile Safari/537.36 EdgA/42.0.2.3985 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/a png,*/*;q=0.8 Accept-Encoding: gzip, deflate, br Accept-Language: ja-JP,ja;q=0.9,en-US;q=0.8,en;q=0.7 Cookie: /session=.eJwdj0FqA... # Androidでvideoタグを読み込んだ場合のリクエストヘッダ(再生できない) Host: xxxxxxxxxxxxxxx Accept-Encoding: identity;q=1, *;q=0 User-Agent: Mozilla/5.0 (Linux; Android 6.0; BG2-W09) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.90 Mobile Safari/537.36 EdgA/42.0.2.3985 Chrome-Proxy: frfr Accept: */* Referer: xxxxxxxxxxxxxxx Accept-Language: ja-JP,ja;q=0.9,en-US;q=0.8,en;q=0.7 Range: bytes=0- Cookie: /session=.eJwdj0FqA... User-Agent: Mozilla/5.0 (Linux; Android 6.0; BG2-W09) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.90 Mobile Safari/537.36 EdgA/42.0.2.3985 Cookie: /session=eyJfZnJlc2... Allow-Cross-Domain-Redirect: false Host: xxxxxxxxxxxxxxx Connection: Keep-Alive Accept-Encoding: gzip # Androidで動画ファイルのURLにアクセスした場合のリクエストヘッダ(再生できない) Host: xxxxxxxxxxxxxxx Accept-Encoding: identity;q=1, *;q=0 User-Agent: Mozilla/5.0 (Linux; Android 6.0; BG2-W09) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.90 Mobile Safari/537.36 EdgA/42.0.2.3985 Chrome-Proxy: frfr Accept: */* Referer: xxxxxxxxxxxxxxx 175901.mp4 Accept-Language: ja-JP,ja;q=0.9,en-US;q=0.8,en;q=0.7 Range: bytes=0-925456 If-None-Match: "5dbaa25b-e1f11" If-Modified-Since: Thu, 31 Oct 2019 08:59:07 GMT Cookie: /session=.eJwdj0FqA... User-Agent: Mozilla/5.0 (Linux; Android 6.0; BG2-W09) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.90 Mobile Safari/537.36 EdgA/42.0.2.3985 Allow-Cross-Domain-Redirect: false Host: xxxxxxxxxxxxxxx Connection: Keep-Alive Accept-Encoding: gzip Cookie: /session=eyJfZnJlc2...

一方、以下のダウンロードリンク経由で動画ファイルにアクセスした場合は、正しくダウンロードでき、ローカルに保存されたファイルは再生できます。

html

1<a role="button" name="dlVideoBtn" class="btn btn-primary float-right" href="/auth_dist/xxxx.mp4" download="xxxx.mp4">ダウンロード</a>
# Androidで動画ファイルのダウンロードリンクをクリックした場合のリクエストヘッダ(ダウンロードできる) Host: xxxxxxxxxxxxxxx User-Agent: Mozilla/5.0 (Linux; Android 6.0; BG2-W09) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.90 Mobile Safari/537.36 EdgA/42.0.2.3985 Accept-Encoding: gzip, deflate, br Accept-Language: ja-JP,ja;q=0.9,en-US;q=0.8,en;q=0.7 Cookie: /session=.eJwdj0FqA...

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ブラウザで対応しているcodecの種類が異なったりします。再生しようとしている動画のvideoエンコード方式は何でしょうか?
android版Edgeがどのような種類のcodecに対応しているのか、パッと見つからなかったのですが、再生できるビデオコーデックで動画をエンコードし直すのが一番手っ取り早いかもしれません。

投稿2019/11/22 10:23

t_obara

総合スコア5488

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hkcomori

2019/11/22 11:56

ご回答ありがとうございます。 動画は、H.264でエンコードしたmp4ファイルになります。 調査してわかっていることにありますとおり、どうにも認証まわりの問題のようなのです。 後出しで恐縮なのですが、試しに認証なしでも配信を拒否しないようにしたところ、Edgeでも再生できるようでした。 なので、コーデックが原因で再生できないわけではないと考えております。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問