如何将修整后的视频以mp4格式保存到烧瓶中

时间:2019-06-02 06:24:19

标签: python flask moviepy video-upload

我正在开发烧瓶中的Web应用程序。这是一个比赛重点网络应用。它以全长比赛视频作为输入,并提供其修剪后的版本作为比赛重点。我可以轻松上传完整长度的视频并将其存储在系统中,但是无法将修剪后的视频保存在系统中。我的代码如下。如果有任何解决方案,请告诉。提前致谢。

app.py

        import os
    from flask import Flask, flash, request, redirect, url_for, send_from_directory
    from werkzeug.utils import secure_filename
    from werkzeug import SharedDataMiddleware
    from moviepy.editor import VideoFileClip, concatenate
    import numpy as np

    UPLOAD_FOLDER = 'E:/projects/match highlight/uploads'
    SAVE_FOLDER = 'E:/projects/match highlight/saved'
    ALLOWED_EXTENSIONS = set(['txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif', 'mp4'])

    app = Flask(__name__)
    app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
    app.config['SAVE_FOLDER'] = SAVE_FOLDER
    app.add_url_rule('/uploads/<filename>', 'uploaded_file',
                     build_only=True)
    app.wsgi_app = SharedDataMiddleware(app.wsgi_app, {
        '/uploads':  app.config['UPLOAD_FOLDER']
    })

    def allowed_file(filename):
        return '.' in filename and \
               filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS

    @app.route('/', methods=['GET', 'POST'])
    def upload_file():
        if request.method == 'POST':
            # check if the post request has the file part
            if 'file' not in request.files:
                flash('No file part')
                return redirect(request.url)
            file = request.files['file']
            # if user does not select file, browser also
            # submit an empty part without filename
            if file.filename == '':
                flash('No selected file')
                return redirect(request.url)
            if file and allowed_file(file.filename):
                filename = secure_filename(file.filename)
                file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
                clip = VideoFileClip("E:/projects/match highlight/uploads/"+filename)
                cut = lambda i: clip.audio.subclip(i,i+1).to_soundarray(fps=22000)
                volume = lambda array: np.sqrt(((1.0*array)**2).mean())
                volumes = [volume(cut(i)) for i in range(0,int(clip.duration-1))]
                averaged_volumes = np.array([sum(volumes[i:i+10])/10 for i in range(len(volumes)-10)])
                increases = np.diff(averaged_volumes)[:-1]>=0
                decreases = np.diff(averaged_volumes)[1:]<=0
                peaks_times = (increases * decreases).nonzero()[0]
                peaks_vols = averaged_volumes[peaks_times]
                peaks_times = peaks_times[peaks_vols>np.percentile(peaks_vols,90)]
                final_times=[peaks_times[0]]
                for t in peaks_times:
                    if (t - final_times[-1]) < 60:
                        if averaged_volumes[t] > averaged_volumes[final_times[-1]]:
                            final_times[-1] = t
                    else:
                        final_times.append(t)
                final = concatenate([clip.subclip(max(t-5,0),min(t+5, clip.duration))for t in final_times])
                final_video=final.to_videofile('soccer_cuts.mp4')
                file.save(os.path.join(app.config['SAVE_FOLDER'], final_video))
                return redirect(url_for('upload_file'))
        return '''
        <!doctype html>
        <title>Upload new File</title>
        <h1>Upload new File</h1>
        <form method=post enctype=multipart/form-data>
          <input type=file name=file>
          <input type=submit value=Upload>
        </form>
        '''

    @app.route('/uploads/<filename>')
    def uploaded_file(filename):
        return send_from_directory(app.config['UPLOAD_FOLDER'],
                                   filename)

    if __name__ == '__main__':
        app.run(debug=True)

0 个答案:

没有答案