2012-03-01 6 views
2

HTML5 캔버스로 동영상의 스크린 샷을 만들 때 동영상이 다른 곳에서 호스팅되며 캔버스가 더럽기 때문에 toDataURL()을 제외한 모든 기능이 작동합니다. 그래서 저는이 캔버스 이미지를 컴퓨터에 저장할 수있는 방법이 있는지 궁금합니다.더러운 캔버스를 저장할 방법이 있습니까?

나는

답변

0

짧은 대답은 아니오 "입니다 ... 대답은 더하지만 내 서버에 비디오를 다운로드하고 거기에서 봉사에서 떨어져 잘 어떤 생각을 완수하기 위해 몇 가지 해킹을 기대하지 않습니다 가정 "

답이 길수록 '예'일 수 있습니다.

서버가 비디오를 다운로드하여 호스트 한 다음 동일한 도메인에서 재생할 수 있습니까?

비디오를 호스팅하는 서버를 제어하는 ​​경우 enable cors 수 있습니다.

(또는이 두 가지를 결합하여 자신이 아닌 고르 지원 사이트에 업로드 비디오를 가질 수 있습니다.)

그렇지 않으면, 당신은 운입니다.

+0

덕분에, 너무 나쁜,하지만 의미가 있습니다 :?를

내가 사용하여 내 동영상에 액세스를 사용합니다. – iwek

0

원본 캔버스를 다른 캔버스에 다시 그려 이미지에 저장하면 어떻게 되나요? 아직 시도하지 않았습니다. (그리고 css를 사용하거나 두 번째 캔버스를 "숨기기"위해 캔버스를 서로 배치하십시오.)

두 번째 캔버스가 더러워 지나요?

(thinking about a technique like thisone)

0

나는 캔버스의 복사를 시도했지만 이것은 단지 같은 더러운 캔버스 오류를 반환했습니다.

마지막으로이 작업을 수행하기 위해 원격 소스 (비디오)를 추출하여 소스 서버 측을 읽고 내 HTML/JS 페이지에 작성하여 로컬 인 것처럼 보이게 만드는 작은 서비스를 구현했습니다. 이 작업이 완료되면 모두 정상적으로 작동합니다.

파이썬/플라스크를 사용하여이를 수행했습니다. 여기에 스 니펫이 있습니다. 부분 콘텐츠 요청을 처리하는 데 완벽한 것은 아니지만 누군가 가야합니다. =/원격 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

관련 문제