YuichirouSeitoku / mdd

0 stars 0 forks source link

ffmepgを叩いて動画に焼き込む #15

Open yumetodo opened 1 month ago

YuichirouSeitoku commented 1 month ago

手元にffmpegを落としてきて字幕を埋め込んでみた

サンプルのASS

[Script Info]
Title: Example Subtitle
Original Script: Your Name
ScriptType: v4.00
Collisions: Normal
PlayDepth: 0

[V4 Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, BackColour, Bold, Italic, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, AlphaLevel, AutoSize, ScaleX, ScaleY, Spacing, Angle, BorderColour, OutlineColour, ShadowColour
Style: Default,Arial,20,&H00FFFFFF,&H000000FF,&H00000000,-1,0,1,1,0,2,10,10,10,0,0,100,100,0,0,&H00FFFFFF,&H00000000,&H00000000

[Events]
Format: Marked, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
Dialogue: Marked=0,0:00:01.00,0:00:05.00,Default,,0,0,0,,Hello, this is an example subtitle!

実行したコマンド

ffmpeg -i input_video.mp4 -vf ass=subtitle.ass out.mp4

生成された動画 https://github.com/user-attachments/assets/6cd585d5-b79d-4f71-8b1d-6e527d8fffb5

YuichirouSeitoku commented 1 month ago

node generate-ass.js でassから字幕付き動画を生成できることを確認

generate-ass.js

const fs = require('fs');
const ffmpeg = require('fluent-ffmpeg');

// 字幕データ(例:テキストと表示時間)
const subtitles = [
  { start: '0:00:01.00', end: '0:00:05.00', text: 'Hello, this is the first subtitle!' },
  { start: '0:00:06.00', end: '0:00:10.00', text: 'And this is the second subtitle!' },
];

// ASSファイルのヘッダー情報
const assHeader = `
[Script Info]
Title: Node.js Generated Subtitle
ScriptType: v4.00

[V4 Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
Style: Default,Arial,20,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,-1,0,1,1.5,0,2,10,10,10,1

[Events]
Format: Marked, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
`;

// 字幕をASS形式にフォーマット
const assBody = subtitles.map((subtitle) => {
  return `Dialogue: Marked=0,${subtitle.start},${subtitle.end},Default,,0,0,0,,${subtitle.text}`;
}).join('\n');

// 完全なASSファイル内容
const assContent = assHeader + assBody;

// ASSファイルを保存
const assFilename = 'output.ass';
fs.writeFileSync(assFilename, assContent, 'utf8');

// 動画ファイルと出力ファイルの指定
const inputVideo = 'input_video.mp4';  // ここに元の動画ファイルのパスを指定
const outputVideo = 'hoge.mp4';

// fluent-ffmpegでASSファイルと動画を結合
ffmpeg(inputVideo)
  .outputOptions('-vf', `ass=${assFilename}`) // 字幕フィルターを使ってASS字幕を追加
  .save(outputVideo) // 出力する動画ファイル
  .on('end', () => {
    console.log('字幕付き動画が正常に生成されました');
  })
  .on('error', (err) => {
    console.error('エラーが発生しました: ', err);
  });
YuichirouSeitoku commented 1 month ago

字幕の合成: Done KeyboardShortcutの合成: Ready