5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ZOZOAdvent Calendar 2023

Day 21

動画ストリーミングをnode.jsで読み込む方法

Last updated at Posted at 2023-12-21

この記事は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コマンド関連

  • ストリーミングに必要なオプションを付加しています
  • errorハンドラーは必須です。もし無いとerror時にnode.jsが落ちてしまいます。

背景 (ポエム)

ある日動画ストリーミングをnode.jsで処理したくなりました。詳しいわけではないため、最初はHLS ダウンロード nodeなどのワードで検索していました。他にもNPM内でHLSと検索してみたりしました。しかしどのパッケージもそんなに利用者がおらず説明が少ないため、エラーになってもソースを直接読んだり型ファイルから考えたりする必要がありました。そしてようやくたどり着いたのが、上記のfluent-ffmpegパッケージだったというわけです。

この話には続きがありまして、前後の処理も含めたTypeScriptのコードをGPT-4で生成すると、ほぼ完璧なものが出来上がりました。それまでの数時間がたったの数十秒に置き換えられてしまいました笑(当然そこまでの過程がコードの理解につながっているのですが) 今回のように初めての分野では、まずは生成AIに頼るようにしようと心に誓いました。

(今回の場合はffmpegというキーワードに辿り着くのがポイントだったと思います。GPT-4の出力にはそれが含まれています。)

5
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?