2012-03-01 64 views
2

我使用HTML5画布制作视频截图,视频托管在其他地方,除了toDataURL()以外,所有内容都可以使用,因为画布很脏。所以,我想知道,有什么方法可以将此画布图像保存在计算机上吗?有什么办法可以保存脏帆布吗?

我认为答案是否定的,但希望一些黑客得到这个工作,以及任何想法除了将影片下载到我的服务器,并从那里为它服务...

回答

0

简短的回答是“否“

较长的答案可能是肯定的。

也许你的服务器可以下载视频并托管它,然后从你的相同域中播放它?

如果您控制托管视频的服务器,您可以enable cors

(或者你也可以将二者结合起来,并上传到启用CORS站点,是不是你自己的视频。)

否则,你的运气了。

+0

感谢,太糟糕了,但它是有道理的。 – iwek 2012-03-05 17:29:41

0

怎么样,我还没有尝试过,如果你重绘原画布在另一个画布上,然后保存到图像。 (并使用CSS或将画布放在彼此之上以“隐藏”第二个画布)。

第二个画布会变脏吗?

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 2014-02-24 02:47:47

相关问题