FlaskはPythonのWebフレームワークです。今回は動画をサーバにアップして、FFMPEGで加工してクライアントに返すアプリを作ってみます
【開発環境】Windows10 / VS Code / Python3.9.13
FFMPEGのインストール
FFMPEGについてはインストール済みの前提です
こちらの記事にWindowsのインストール方法をまとめています
Flaskアプリの作成
任意のフォルダを作成し、VS Code上で開きます
仮想環境の作成
cd 【APP DIRECTORY】
pip install virtualenv
virtualenv env
仮想環境のアクティベート
.envScriptsactivate
ターミナルに仮想環境名が表示されるようになります
※エラーが出たらこちらを試してみてください
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/