【JavaScript】ブラウザ上のみで完結して ffprobe を動かす ffprobe-wasm の紹介

 ffprobe は ffmpeg と同系列のツールで動画ファイルの情報を探れます。
ffprobe Documentation
 例えば、次の様に実行できます。

>ffprobe -select_streams v:0 -count_packets -show_entries stream=nb_read_packets  "test video 20fps total frame count is 383.mp4"
ffprobe version N-104544-gbfbd5954e5-20211114 Copyright (c) 2007-2021 the FFmpeg developers
  built with gcc 10-win32 (GCC) 20210610
  configuration: --prefix=/ffbuild/prefix --pkg-config-flags=--static --pkg-config=pkg-config --cross-prefix=x86_64-w64-mingw32- --arch=x86_64 --target-os=mingw32 --enable-gpl --enable-version3 --disable-debug --disable-w32threads --enable-pthreads --enable-iconv --enable-libxml2 --enable-zlib --enable-libfreetype --enable-libfribidi --enable-gmp --enable-lzma --enable-fontconfig --enable-libvorbis --enable-opencl --enable-libvmaf --disable-libxcb --disable-xlib --enable-amf --enable-libaom --enable-avisynth --enable-libdav1d --enable-libdavs2 --disable-libfdk-aac --enable-ffnvcodec --enable-cuda-llvm --enable-frei0r --enable-libgme --enable-libass --enable-libbluray --enable-libmp3lame --enable-libopus --enable-libtheora --enable-libvpx --enable-libwebp --enable-lv2 --enable-libmfx --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenh264 --enable-libopenjpeg --enable-librav1e --enable-librubberband --enable-schannel --enable-sdl2 --enable-libsoxr --enable-libsrt --enable-libsvtav1 --enable-libtwolame --enable-libuavs3d --disable-libdrm --disable-vaapi --enable-libvidstab --enable-vulkan --enable-libglslang --enable-libplacebo --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxvid --enable-libzimg --enable-libzvbi --extra-cflags=-DLIBTWOLAME_STATIC --extra-cxxflags= --extra-ldflags=-pthread --extra-ldexeflags= --extra-libs=-lgomp --extra-version=20211114
  libavutil      57.  8.100 / 57.  8.100
  libavcodec     59. 12.100 / 59. 12.100
  libavformat    59.  8.100 / 59.  8.100
  libavdevice    59.  0.101 / 59.  0.101
  libavfilter     8. 16.101 /  8. 16.101
  libswscale      6.  1.100 /  6.  1.100
  libswresample   4.  0.100 /  4.  0.100
  libpostproc    56.  0.100 / 56.  0.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'test video 20fps total frame count is 383.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf59.8.100
  Duration: 00:00:19.28, start: 0.000000, bitrate: 71 kb/s
  Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 1348x482 [SAR 1349:1348 DAR 1349:482], 68 kb/s, 19.87 fps, 25 tbr, 12800 tbn (default)
    Metadata:
      handler_name    : VideoHandler
      vendor_id       : [0][0][0][0]
[STREAM]
nb_read_packets=383
[/STREAM]

 上の様に動画の長さ、FPSなどの情報が取得できます。

 この ffprobe をブラウザ上で動かすサイトが次の FFProbe です。
FFProbe
alfg/ffprobe-wasm: A Web-based FFProbe. Powered by FFmpeg, Vue and Web Assembly!
 このサイトは ffprobe をブラウザ上で完結させて動作させ、結果 Vue.js を介して表示しています。C製のコマンドラインツールである ffmpeg 中の ffprobe をブラウザ上で動作させている仕組みが wasm というファイル形式です。

 wasm は WebAssembly の略称でブラウザ上で動くバイナリコードです。WebAssembly を生成する機能はいくつかの言語が持っており、C++、Go、Rust などがそれにあたります。wasm を用いることで既存の C++ などのコードをベースにしたプログラムを比較的用意にブラウザ上で動作させられます(最終出力とコンパイルに関して変更が必要です。wasm-pack 等、各言語で wasm 用の色々が作られているので、そのあたり使うと楽です)。
WebAssembly | MDN
 ffprobe は通常ブラウザ上で動作させられませんが、この wasm を介することでブラウザ上で動作でき、JavaScript ともやり取りできるようになります。wasm では従来のブラウザの機能や JavaScript では困難だったことがいくらか可能になる他、計算処理が JavaScript よりも高速です。

 余談ですが wasm はブラウザ以外でも動作させられます。Wasmer というプロジェクトがこれを行っており PHP でもできます。wasm を介していくつかの言語にまたがったプログラムを書けるわけです。Rust で書かれた wasm で配布される様々な言語で使えるライブラリとかそんな具合です。
Wasmer – The Universal WebAssembly Runtime

 alfg/ffprobe-wasm では ffmpeg のソースコード中の ffprobe 部分を include して wasm 形式にしてビルド、JavaScript から wasm を呼ぶ、という一連の流れが素で書かれており、大いに参考になります(コード量も少なくて楽)。このあたりを参考にして ffprobe を単体でブラウザ上で動作させられるようになるとローカルの動画ファイルのブラウザ状におけるコマ送りやら何やらが大したブラウザ依存もなく完璧に実装できます。

>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG