我可以将录制的前端视频发送到后端并将其存储在我想要的特定文件夹中吗?

问题描述 投票:0回答:1

我正在使用Flask,我在其中的templates文件夹下编写了html文件。其中我有一个 html 文件,我在其中实现了屏幕录制。 问题是我可以在录制视频后直接下载视频。但实际上我希望它保存在我的 Flask 项目下一个名为 Recordings 的文件夹中...... 任何帮助将不胜感激

startRecording function--
function startRecording() {
navigator.mediaDevices.getDisplayMedia({ video: true }).then(stream => {
mediaRecorder = new MediaRecorder(stream);
mediaRecorder.ondataavailable = event => recordedChunks.push(event.data);
mediaRecorder.start();
startRecordingButton.disabled = true;
stopRecordingButton.disabled = false;
}).catch(error => {
console.error('Error starting recording:', error);
});
}
stopRecording function--
function stopRecording() {
if (mediaRecorder && mediaRecorder.state !== 'inactive') {
mediaRecorder.stop();
startRecordingButton.disabled = false;
stopRecordingButton.disabled = true;
if (confirm('Do you want to save the recording?')) {
saveRecording();
}
}
}
flask backend screen-recording
1个回答
0
投票

如果您想将视频录制上传到服务器并将其保存在文件夹中,您可以使用 Fetch API 来完成。为此,请将视频数据转换为 Blob 并将其添加到 FormData 对象。然后通过 POST 请求将其上传到后台服务器。

在端点内,您可以使用用于将其添加到表单的密钥从 dict

request.files
请求文件。您将收到一个类型为
FileStorage
的对象,您可以将其保存在合适的位置。在以下示例中,实例文件夹中的子目录用于此目的。

from flask import (
    Flask, 
    abort, 
    render_template, 
    request
)
from mimetypes import guess_extension
from werkzeug.utils import secure_filename
import os

app = Flask(__name__)
app.config.from_mapping(
    UPLOAD_FOLDER = os.path.join(app.instance_path, 'recordings')
)
os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True)

@app.route('/')
def index():
    return render_template('index.html')

@app.post('/upload')
def upload():
    if file := request.files.get('video'):
        extname = guess_extension(file.mimetype)
        if not extname:
            abort(400)

        # Check for allowed file extensions.

        i = 1
        while True:
            dst = os.path.join(
                app.config['UPLOAD_FOLDER'],
                secure_filename(f'video_{i}{extname}')
            )
            if not os.path.exists(dst): break
            i += 1

        file.save(dst)

        return ''
    abort(400)
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Index</title>
</head>
<body>
    <main>
        <button id="rec-btn">Start / Stop</button>
    </main>

    <script>
        (function() {
            const recBtn = document.getElementById('rec-btn');

            const startRecording = () => {
                let recorder; 

                const stopRecording = () => {
                    recorder && recorder.stop();
                };

                const constraints = { video: true };
                navigator.mediaDevices.getDisplayMedia(constraints)
                    .then(function(stream) {
                        let chunks = []
                        recorder = new MediaRecorder(stream);
                        recorder.ondataavailable = event => {
                            chunks.push(event.data);
                        };
                        recorder.onstart = event => {
                            console.log('Recording started.');
                        };
                        recorder.onstop = event => {
                            console.log('Recording stopped.')

                            let blob = new Blob(chunks, { type: recorder.mimeType }); 
                            chunks = [];

                            if (confirm('Do you want to save the recording?')) {
                                const formData = new FormData();
                                formData.append('video', blob);

                                fetch('/upload', {
                                    method: 'POST',
                                    cache: 'no-cache',
                                    body: formData
                                }).then(resp => {
                                    if (!resp.ok) {
                                        throw new Error('Upload failed.');
                                    }
                                }).catch(console.error);
                            }

                            recBtn.removeEventListener('click', stopRecording);
                            recBtn.addEventListener('click', startRecording);
                        };

                        recBtn.removeEventListener('click', startRecording);
                        recBtn.addEventListener('click', stopRecording);
                        recorder.start();
                    })
                    .catch(console.error);
            };

            if (!navigator.mediaDevices) {
                console.error('MediaDevices not supported.')
                recBtn.remove();
                return;
            }

            recBtn.addEventListener('click', startRecording);
        })();
    </script>
</body>
</html>
© www.soinside.com 2019 - 2024. All rights reserved.