Есть ли способ сохранить грязный холст? - PullRequest
3 голосов
/ 01 марта 2012

Я делаю скриншоты видео с помощью HTML5 canvas, видео размещено в другом месте, все работает, кроме toDataURL (), потому что холст грязный.Итак, мне интересно, есть ли способ сохранить это изображение холста на компьютере?

Я полагаю, что ответ - нет, но надеюсь, что какой-то взломщик справится с этой задачей, и любая идея, кроме загрузки видео на мой сервер и его передачи оттуда ...

Ответы [ 3 ]

0 голосов
/ 03 мая 2012

Как насчет, я еще не пробовал, если вы перерисовываете оригинальный холст на другом холсте, который затем сохраняете в изображение. (и используйте css или расположите полотна друг над другом, чтобы «спрятать» второй холст).

Будет ли второй холст грязным?

( думает о технике, подобной этой )

0 голосов
/ 24 февраля 2014

Я попытался скопировать холст, но это только что вернуло ту же ошибку грязного холста.

В конце, чтобы получить эту работу, я реализовал небольшой сервис, который извлекал бы удаленные источники (видео) и заставлял их выглядетькак будто они были локальными, то есть, читая исходный сервер и записывая на мою страницу HTML / JS.Как только это было сделано, все работало нормально.

Я использовал Python / Flask, чтобы сделать это, вот фрагмент.Не идеально подходит для обработки частичных запросов контента, но должен заставить кого-то работать.

Чтобы использовать его, я получаю доступ к своим видео с помощью: / remote? 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 голосов
/ 02 марта 2012

Короткий ответ «Нет».

Более длинный ответ может быть «да».

Может быть, ваш сервер может загрузить видео и разместить его, а затем воспроизвести с вашего же домена?

Если вы управляете сервером, на котором размещено видео, вы можете включить Cors .

(Или вы можете объединить оба и загрузить видео на сайт с поддержкой Cors.это не ваше.)

В противном случае вам не повезет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...