2012-03-01 5 views
2

ビデオのスクリーンショットをHTML5キャンバスで作成しています。動画は他の場所でホストされています。キャンバスが汚れているため、toDataURL()以外のすべてが機能します。だから、私はこのキャンバスのイメージをコンピュータに保存する方法はありますか?汚れたキャンバスを保存する方法はありますか?

私は

答えて

0

短い答えはいいえ」である...答えは何が、これは私のサーバーにビデオをダウンロードして、そこから提供から離れて、うまく任意のアイデアを成し遂げるために、いくつかのハックを望んでいないと仮定します"

長い答えは「はい」です。

あなたのサーバーはビデオをダウンロードしてホストし、それからあなたの同じドメインから再生できますか?

ビデオをホストしているサーバーを制御する場合は、enable corsです。

(または、2を組み合わせて、あなた自身ではありませんCORS対応のサイトにアップロードされたビデオを持っている可能性があります。)

そうでない場合、あなたは運の出ています。

+0

/リモート、それは理にかなって?。 – iwek

0

元のキャンバスを別のキャンバスに再描画してイメージに保存すると、まだ試していません。 (そして、cssを使うか、キャンバス同士を重ねて配置して、2番目のキャンバスを「隠す」)。

2番目のキャンバスは汚れていませんか?

thinking about a technique like thisone

0

私はキャンバスのコピーを試みたが、これはちょうど同じ汚れたキャンバスエラーを返しました。

最後に、私は、リモートソース(ビデオ)を抽出して、ローカルサーバーであるかのように見せる小さなサービスを実装しました。つまり、ソースサーバー側を読み、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) 
+0

コードを投稿する手助けはできますか? – Will

関連する問題