HTML5 캔버스로 동영상의 스크린 샷을 만들 때 동영상이 다른 곳에서 호스팅되며 캔버스가 더럽기 때문에 toDataURL()을 제외한 모든 기능이 작동합니다. 그래서 저는이 캔버스 이미지를 컴퓨터에 저장할 수있는 방법이 있는지 궁금합니다.더러운 캔버스를 저장할 방법이 있습니까?
나는
HTML5 캔버스로 동영상의 스크린 샷을 만들 때 동영상이 다른 곳에서 호스팅되며 캔버스가 더럽기 때문에 toDataURL()을 제외한 모든 기능이 작동합니다. 그래서 저는이 캔버스 이미지를 컴퓨터에 저장할 수있는 방법이 있는지 궁금합니다.더러운 캔버스를 저장할 방법이 있습니까?
나는
짧은 대답은 아니오 "입니다 ... 대답은 더하지만 내 서버에 비디오를 다운로드하고 거기에서 봉사에서 떨어져 잘 어떤 생각을 완수하기 위해 몇 가지 해킹을 기대하지 않습니다 가정 "
답이 길수록 '예'일 수 있습니다.
서버가 비디오를 다운로드하여 호스트 한 다음 동일한 도메인에서 재생할 수 있습니까?
비디오를 호스팅하는 서버를 제어하는 경우 enable cors 수 있습니다.
(또는이 두 가지를 결합하여 자신이 아닌 고르 지원 사이트에 업로드 비디오를 가질 수 있습니다.)
그렇지 않으면, 당신은 운입니다.
원본 캔버스를 다른 캔버스에 다시 그려 이미지에 저장하면 어떻게 되나요? 아직 시도하지 않았습니다. (그리고 css를 사용하거나 두 번째 캔버스를 "숨기기"위해 캔버스를 서로 배치하십시오.)
두 번째 캔버스가 더러워 지나요?
나는 캔버스의 복사를 시도했지만 이것은 단지 같은 더러운 캔버스 오류를 반환했습니다.
마지막으로이 작업을 수행하기 위해 원격 소스 (비디오)를 추출하여 소스 서버 측을 읽고 내 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)
코드 게시를 도와 드릴까요? – Will
덕분에, 너무 나쁜,하지만 의미가 있습니다 :?를
내가 사용하여 내 동영상에 액세스를 사용합니다. – iwek