name: video-subtitle
Pillow + FFmpeg overlayフィルターで動画にテロップ(字幕)を追加するスキル。drawtextフィルターが使えない環境向け。
from PIL import Image, ImageDraw, ImageFont
def create_subtitle(text, filename, font_size=48, width=1024, height=100):
img = Image.new('RGBA', (width, height), (0, 0, 0, 0))
draw = ImageDraw.Draw(img)
# macOSの日本語フォント
font = ImageFont.truetype("/System/Library/Fonts/ヒラギノ角ゴシック W6.ttc", font_size)
# テキストサイズ取得
bbox = draw.textbbox((0, 0), text, font=font)
text_width = bbox[2] - bbox[0]
text_height = bbox[3] - bbox[1]
# 中央配置
x = (width - text_width) // 2
y = (height - text_height) // 2
# 縁取り(黒)
for dx in [-3, -2, -1, 0, 1, 2, 3]:
for dy in [-3, -2, -1, 0, 1, 2, 3]:
draw.text((x + dx, y + dy), text, font=font, fill=(0, 0, 0, 255))
# 本文(白)
draw.text((x, y), text, font=font, fill=(255, 255, 255, 255))
img.save(filename, 'PNG')
# 使用例
create_subtitle("本能寺の変", "subtitle.png", font_size=56)
ffmpeg -y \
-i video.mp4 \
-i subtitle1.png \
-i subtitle2.png \
-filter_complex "\
[0:v][1:v]overlay=0:H-100:enable='between(t,0,52)'[v1];\
[v1][2:v]overlay=0:50:enable='between(t,0,10)'[vout]" \
-map "[vout]" \
-c:v libx264 -preset fast -crf 23 \
output.mp4
| パラメータ | 説明 |
|---|---|
overlay=0:H-100 | 下から100pxの位置に配置 |
overlay=0:50 | 上から50pxの位置に配置 |
enable='between(t,0,10)' | 0〜10秒間だけ表示 |
| フォント名 | パス |
|---|---|
| ヒラギノ角ゴシック W6 | /System/Library/Fonts/ヒラギノ角ゴシック W6.ttc |
| ヒラギノ角ゴシック W3 | /System/Library/Fonts/ヒラギノ角ゴシック W3.ttc |
| ヒラギノ明朝 | /System/Library/Fonts/ヒラギノ明朝 ProN.ttc |
FFmpegの drawtext フィルターは --enable-libfreetype 付きでビルドされていないと使えない。
Homebrew版FFmpegでは未対応の場合があるため、Pillow + overlay の代替方式を使用。
pip install pillow)drawtext フィルターが使えず原因不明のエラーになる: Homebrew版FFmpegは --enable-libfreetype なしでビルドされていることがある。その場合 drawtext は使えないため、本スキルの Pillow + overlay 方式を使うwidth が動画の幅と異なると、overlay時に位置ずれや切れが発生する。動画の解像度に合わせてテロップ画像を生成することenable='between(t,0,10)' の時間指定ミス: 複数テロップを重ねる際、表示時間の指定を間違えるとテロップが表示されない・重なるなどの問題が起きる。各overlayの enable 範囲を事前に書き出して確認する