Flask

【Python】FFMPEGを使って動画を加工するFlask Webアプリを作る

FlaskはPythonのWebフレームワークです。今回は動画をサーバにアップして、FFMPEGで加工してクライアントに返すアプリを作ってみます

【開発環境】Windows10 / VS Code / Python3.9.13

FFMPEGのインストール

FFMPEGについてはインストール済みの前提です

こちらの記事にWindowsのインストール方法をまとめています

Flaskアプリの作成

任意のフォルダを作成し、VS Code上で開きます

仮想環境の作成

cd 【APP DIRECTORY】
pip install virtualenv
virtualenv env

仮想環境のアクティベート

.\env\Scripts\activate

ターミナルに仮想環境名が表示されるようになります

※エラーが出たらこちらを試してみてください

Flaskのインストール

pip install flask

app.pyファイルを作成します

メモ

1.ffmpegコマンドのオプションで -y を付けると動画上書きのy/nを省略できる

2.subprocessでWindows/Linuxコマンドを実行できる
  同期処理はrun 非同期処理はPopen

import subprocess
from fileinput import filename
from flask import Flask, request, render_template, redirect, make_response

app = Flask(__name__)

@app.route('/', methods=['GET', 'POST'])
def index():
    if request.method == 'GET':
        return render_template('index.html')
    else:
        # ファイル確認
        if "file" not in request.files:
            return redirect('/')
        # ファイル取り出し
        file = request.files["file"]
        # 拡張子確認
        ALLOWED_EXTENSIONS = ['mp4', 'wmv', 'avi', 'gif']
        isMovieFile = '.'in filename and filename.rsplit('.', 1).lower() in ALLOWED_EXTENSIONS
        if not (file and isMovieFile(file.filename)):
            return redirect('/')
        # ファイル保存
        savePath = './movie/input/' + file.filename
        file.save(savePath)
        
        # 切り取り秒数
        duration = 5
        # 出力パス
        outputPath = './movie/output/' + file.filename 
        # 処理の終了を待つ必要があるため、同期処理(run)で実行
        subprocess.run(f"ffmpeg -y -i {savePath} -t {duration} -c copy {outputPath}", shell=True)
        
        # ダウンロード処理
        res = make_response()
        res.data  = open(outputPath, "rb").read()
        res.headers['Content-Type'] = 'video/mp4'
        res.headers['Content-Disposition'] = 'attachment; filename=test.mp4'
        return res
        
if __name__ == "__main__":
    app.run(debug=True)

templatesフォルダを作成し、index.htmlを作成します

<!DOCTYPE html>
<html lang="ja">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>flask-ffmpeg-app</title>
    </head>
    <body>
        <form method="post" enctype="multipart/form-data">
            <input type="file" name="file">
            <button type="submit">upload</button>
        </form>
    </body>
</html>

動画の格納用にmovieフォルダを作成し、inputとoutputフォルダを作成します

最終的に画像の様なフォルダ構成になります

動作確認

実行して、http://127.0.0.1:5000/を開き動作確認します

動画ファイルをアップロードすると、開始から5秒間を切り取った動画がダウンロードされました

元動画
加工後

動画はこちらのフリー動画サイトからダウンロードしました

参考サイト

Flaskアプリの作り方 https://tech-diary.net/flask-introduction/

subprocessの使い方 https://dev.classmethod.jp/articles/python-subprocess-shell-command/

FFMPEGの使い方 https://nico-lab.net/cutting_ffmpeg/ https://qiita.com/okamos/items/684c59928dbe9bf9bbcd

Flaskでファイルのダウンロード https://qiita.com/5zm/items/760000cf63b176be544c https://remix-yh.net/1398/

エンジニアの転職ならこれ!

【第二新卒向け】マイナビジョブ20's

マイナビジョブ20'sは、20代・第二新卒・既卒向けの転職エージェントです。

▼こんな方におすすめ
・はじめて転職しようと思っている
・転職できるだけのスキルが自分にあるか不安
・手厚いサポートを受けたい

【フリーランス向け】 Midworks

Midworksは豊富な案件と「フリーランス」と「正社員」の良いとこ取りをした働き方を実現する手厚い保障が特徴です。

▼こんな方におすすめ
・現在正社員でフリーランスになろうか悩んでいる
・フリーランスとして働いているが、先行きが不安がある  (安定的な案件確保や保障など)
・自分の市場価値を知りたい、見合った案件で参画したい
・今後のキャリアビジョンを踏まえて案件を選びたい