ビデオのスクリーンショットをHTML5キャンバスで作成しています。動画は他の場所でホストされています。キャンバスが汚れているため、toDataURL()以外のすべてが機能します。だから、私はこのキャンバスのイメージをコンピュータに保存する方法はありますか?汚れたキャンバスを保存する方法はありますか?
私は
ビデオのスクリーンショットをHTML5キャンバスで作成しています。動画は他の場所でホストされています。キャンバスが汚れているため、toDataURL()以外のすべてが機能します。だから、私はこのキャンバスのイメージをコンピュータに保存する方法はありますか?汚れたキャンバスを保存する方法はありますか?
私は
短い答えはいいえ」である...答えは何が、これは私のサーバーにビデオをダウンロードして、そこから提供から離れて、うまく任意のアイデアを成し遂げるために、いくつかのハックを望んでいないと仮定します"
長い答えは「はい」です。
あなたのサーバーはビデオをダウンロードしてホストし、それからあなたの同じドメインから再生できますか?
ビデオをホストしているサーバーを制御する場合は、enable corsです。
(または、2を組み合わせて、あなた自身ではありませんCORS対応のサイトにアップロードされたビデオを持っている可能性があります。)
そうでない場合、あなたは運の出ています。
元のキャンバスを別のキャンバスに再描画してイメージに保存すると、まだ試していません。 (そして、cssを使うか、キャンバス同士を重ねて配置して、2番目のキャンバスを「隠す」)。
2番目のキャンバスは汚れていませんか?
私はキャンバスのコピーを試みたが、これはちょうど同じ汚れたキャンバスエラーを返しました。
最後に、私は、リモートソース(ビデオ)を抽出して、ローカルサーバーであるかのように見せる小さなサービスを実装しました。つまり、ソースサーバー側を読み、HTML/JSページに書き出します。これが完了すると、すべて正常に機能しました。
これを行うにはPython/Flaskを使用しましたが、ここではスニペットです。部分的なコンテンツリクエストを処理するには完璧ではありませんが、誰かに行かせるべきです。それを使用するに
私が使用して自分の動画にアクセスします。おかげで、あまりにも悪いのurl =
from datetime import timedelta
from flask import make_response, request, current_app, Flask, url_for, render_template, Response
from functools import update_wrapper
import requests
import logging
import json
from werkzeug.datastructures import Headers
import httplib
import os
import subprocess
import base64
httplib.HTTPConnection.debuglevel = 1
app = Flask(__name__)
logging.basicConfig()
logging.getLogger().setLevel(logging.DEBUG)
requests_log = logging.getLogger("requests.packages.urllib3")
requests_log.setLevel(logging.DEBUG)
requests_log.propagate = True
def crossdomain(origin=None, methods=None, headers=None,
max_age=21600, attach_to_all=True,
automatic_options=True):
if methods is not None:
methods = ', '.join(sorted(x.upper() for x in methods))
if headers is not None and not isinstance(headers, basestring):
headers = ', '.join(x.upper() for x in headers)
if not isinstance(origin, basestring):
origin = ', '.join(origin)
if isinstance(max_age, timedelta):
max_age = max_age.total_seconds()
def get_methods():
if methods is not None:
return methods
options_resp = current_app.make_default_options_response()
return options_resp.headers['allow']
def decorator(f):
def wrapped_function(*args, **kwargs):
if automatic_options and request.method == 'OPTIONS':
resp = current_app.make_default_options_response()
else:
resp = make_response(f(*args, **kwargs))
if not attach_to_all and request.method != 'OPTIONS':
return resp
h = resp.headers
h['Access-Control-Allow-Origin'] = origin
h['Access-Control-Allow-Methods'] = get_methods()
h['Access-Control-Max-Age'] = str(max_age)
if headers is not None:
h['Access-Control-Allow-Headers'] = headers
return resp
f.provide_automatic_options = False
return update_wrapper(wrapped_function, f)
return decorator
def stream_remote(url, headers=None):
logging.debug(headers)
range = headers["Range"]
logging.debug(range)
r = requests.get(url, stream=True, headers={"range":range})
logging.debug(r.headers)
for block in r.iter_content(1024):
if not block:
break
yield block
@app.route('/remote/')
def get_remote():
# Gets a remote file to make it look like it is local for CORS purposes
url = request.args.get("url", None)
resp_headers = Headers()
resp_headers.add('Accept-Ranges','bytes')
if url is None:
return "Error. No URL provided"
else:
headers = request.headers
logging.debug(headers)
return Response(stream_remote(url, headers),mimetype='video/mp4',headers=resp_headers)
if __name__ == '__main__':
app.debug = True
app.run(host="127.0.0.1", port=9001)
コードを投稿する手助けはできますか? – Will
/リモート、それは理にかなって?。 – iwek