概要
会議録画動画を圧縮するための、FFMpegコマンドを紹介します。ファイルサイズが少なくなること優先で、画質もギリギリ妥協できるよねという設定です。
動作環境
- Arch Linux
- ffmpeg version n9.0.1
- GPU NVIDIA GeForce RTX 3060
- Driver Version: 580.178.04
- CUDA Version: 13.0
- uv 0.9.28
- Python 3.14.7
エンコード設定集
(1) 高圧縮
- 画面の画質は最低限でよい
- 画面共有なし、カメラOFF、発言者のアイコンが光るだけなど、動画にほとんど変化がない
- 音声は人の声のみ
以下の設定にします。
ffmpeg -i "$input_file" \
-c:v hevc_nvenc -b:v 200k -vf "scale=1:720,mpdecimate" -fps_mode vfr \
-c:a libopus -b:a 12k -vbr on -ac 1 -af "loudnorm=I=-16:TP=-1.5:LRA=11" \
"$output"
-
ffmpeg -i "$input_file"- エンコード対象の動画を指定する
-
-c:v hevc_nvenc -b:v 200k
動画のエンコード設定。hevc (H265) で適当なビットレート(200kbps)を指定する -
-vf "scale=1:720,mpdecimate" -fps_mode vfr-
解像度720p相当(1280×720pixel)で、可変フレームレートを指定する。画面に変化がない場合は可変にしたほうが有利
-
前コマ画像とほとんど差分がないコマを自動的に削除するフィルター
mpdecimateを使用する
-
-
-c:a libopus -b:a 12k -vbr on- 音声のエンコード設定。opus、可変ビットレートで12kbpsを目標値とする。人の声のみで1chならこれで十分。
-
-ac 1- 音声をモノラルにする設定(1チャンネルのみにする)
-
-af "loudnorm=I=-16:TP=-1.5:LRA=11"- 音量を正規化して聞こえやすくしておく
-
"$output"
出力ファイル名と拡張子(.mp4や.mkv)を指定する
(2) 画面共有やカメラ映像あり
フレームレートを24fps固定にする。他は(1)の設定と同じです。
ffmpeg -i "$input_file" \
-c:v hevc_nvenc -b:v 200k -r 24 \
-c:a libopus -b:a 12k -vbr on -ac 1 -af "loudnorm=I=-16:TP=-1.5:LRA=11" \
"$output"
以下は参考リンク。
その他おまけ
文字起こし
whisperを使った文字起こしを行う方法を示します。 NVIDIA GPUを使って、ローカル完結で解析します。Pythonパッケージはuvを使ってインストールします。なお、メモリ12GB程度のGPUを使用しているのですが、普通のwhisper(openai/whisper: Robust Speech Recognition via Large-Scale Weak Supervision)ではメモリ不足となってしまいました。省メモリ版であるfast-whisper(SYSTRAN/faster-whisper: Faster Whisper transcription with CTranslate2)を使用します。
mkdir whisper
cd whisper
uv init
uv add nvidia-cublas-cu12 nvidia-cudnn-cu12
uv add faster-whisper
uv run faster-whisper "$input_file" --model large-v3 --language ja --device cuda --task transcribe --output output.srt
# 動画ファイルをそのまま指定してOK(自動的に音声ストリームが読み込まれる)
# `output.srt`ファイルが出力されます
文字起こし結果を字幕ファイルとして動画ファイルに埋め込む
srtファイルを動画ファイルに埋め込みます。埋め込んだ字幕ファイルは、Windows標準のメディアプレイヤーで表示されなかったです。VLCメディアプレイヤーなど、対応するものを使う必要があります。
ffmpeg -i "$input_file" -i new_subtitles.srt \
-c:v copy -c:a copy -c:s copy \
new_video.mkv
字幕ファイルだけ別のsrtファイルに差し替えるコマンド例です。
ffmpeg -i "$input_file" -i new_subtitles.srt \
-map 0:v -map 0:a -map 1:s \
-c:v copy -c:a copy -c:s copy \
new_video.mkv