この記事はZOZO Advent Calendar 2023 #1 21日目の記事になります。
TL;DR
HLSなどの動画ストリーミングをnode.jsで読み込む際には、fluent-ffmpegが便利です。
結論
これだけです。
import ffmpeg from 'fluent-ffmpeg'
import fs from 'fs'
...
const url = 'https://example.com/video.m3u8'
const stream = fs.createWriteStream('filename.mp4')
ffmpeg(url, { logger: console })
.addOutputOptions(
'-movflags +frag_keyframe+separate_moof+omit_tfhd_offset+empty_moov'
)
.format('mp4')
.on('error', (error) => {
console.error(error)
})
.pipe(stream)
...
ポイント
- システムにffmpegがインストールされている必要があります。
- 例として、HLSのm3u8ファイルを読み込んでいます。
- mp4で保存する部分まで書いています。
- fluent-ffmpegというNPMパッケージを使っていますが、直接execコマンドなどで実行するのでもいいかもしれません。(オプションの付け方がややこしい部分もあるため、このパッケージ内のexamplesを確認すると効率的に開発が進められると思います。)
ffmpegコマンド関連
背景 (ポエム)
ある日動画ストリーミングをnode.jsで処理したくなりました。詳しいわけではないため、最初はHLS ダウンロード node
などのワードで検索していました。他にもNPM内でHLS
と検索してみたりしました。しかしどのパッケージもそんなに利用者がおらず説明が少ないため、エラーになってもソースを直接読んだり型ファイルから考えたりする必要がありました。そしてようやくたどり着いたのが、上記のfluent-ffmpeg
パッケージだったというわけです。
この話には続きがありまして、前後の処理も含めたTypeScriptのコードをGPT-4で生成すると、ほぼ完璧なものが出来上がりました。それまでの数時間がたったの数十秒に置き換えられてしまいました笑(当然そこまでの過程がコードの理解につながっているのですが) 今回のように初めての分野では、まずは生成AIに頼るようにしようと心に誓いました。
(今回の場合はffmpegというキーワードに辿り着くのがポイントだったと思います。GPT-4の出力にはそれが含まれています。)