IPFSを動画ファイルの保存と再生に使うこともできます。
mp4の保存と再生
いつも通りipfs add
コマンドでmp4の動画ファイルを追加します。
$ ipfs add -q <<path_to_movie_file>> | tail -n1
※ -q
オプションを使用することでハッシュのみの出力にできます
※ tail -n1
により、最上位フォルダーのハッシュのみが出力されるようにします
ローカルゲートウェイから動画ファイルにアクセスするURLは、
http://localhost:8080/ipfs/<<最上位フォルダーのハッシュ>>
となります。
ブラウザからアクセスした時は、
このようにブラウザに組み込まれているプレイヤーで再生できました。
$ curl -I http://localhost:8080/ipfs/QmQkL8yboMWQVtGt56a2gKc4NaUiSTH2hxAkz3RxuEbt3F
HTTP/1.1 301 Moved Permanently
Accept-Ranges: bytes
Access-Control-Allow-Headers: Content-Type
Access-Control-Allow-Headers: Range
Access-Control-Allow-Headers: User-Agent
Access-Control-Allow-Headers: X-Requested-With
Access-Control-Allow-Methods: GET
Access-Control-Allow-Origin: *
Access-Control-Expose-Headers: Content-Length
Access-Control-Expose-Headers: Content-Range
Access-Control-Expose-Headers: X-Chunked-Output
Access-Control-Expose-Headers: X-Ipfs-Path
Access-Control-Expose-Headers: X-Ipfs-Roots
Access-Control-Expose-Headers: X-Stream-Output
Cache-Control: public, max-age=29030400, immutable
Content-Length: 11916526
Content-Type: video/mp4
Etag: "QmQkL8yboMWQVtGt56a2gKc4NaUiSTH2hxAkz3RxuEbt3F"
Location: http://bafybeibdzbijfwavnorsaoe26w3m6w44mlavrhwpmtg5xzywymt667wkby.ipfs.localhost:8080/
X-Ipfs-Path: /ipfs/QmQkL8yboMWQVtGt56a2gKc4NaUiSTH2hxAkz3RxuEbt3F
X-Ipfs-Roots: QmQkL8yboMWQVtGt56a2gKc4NaUiSTH2hxAkz3RxuEbt3F
Date: Mon, 11 Jul 2022 08:14:45 GMT
curlでレスポンスヘッダーを除いてみると、
Content-Type
はきちんとvideo/mp4
になっていますね。
hlsでも同じようにアクセスできる?
mp4のファイルをhlsに変換してからipfsに追加してみます。
hlsにするコマンド例)
ffmepgを使って変換します。オプションは特に指定しませんでした。
$ ffmpeg -i sample-15s.mp4 ./hls/sample-15s.m3u8
$ ls -la hls
sample-15s.m3u8
sample-15s0.ts
sample-15s1.ts
このようにm3u8とtsファイルが生成されます。
ではこのhlsフォルダをipfsに追加してみます。
$ ipfs add -r hls
added QmVw9q9TUdPPFqkg7yESpJn9yi7vRGbbQgb7TUSX8J3bp5 hls/sample-15s.m3u8
added QmUexgWEcJUrHMNVNPRUJ3sNsYjqgdv79u3P1jEPyudEr3 hls/sample-15s0.ts
added QmRniMzFBHj9tC11Yu9kdrRrpqy6efkTFmmEgQySYj987P hls/sample-15s1.ts
added QmZ1CUAFpWPRaSYmbrAMM8nT74MyHeP9LZr5cesmab4NfE hls
動画プレイヤーでm3u8のインデックスファイルを指定するとhlsの再生ができるようになるので、ipfsでも同じように
http://localhost:8080/ipfs/m3u8のハッシュ>>
でローカルゲートウェイ経由でアクセスしてみましょう。
hls再生プレイヤー
hlsはchromeでは再生できないので、hls.jsを使います。
basic-usage.html をダウンロードし、hlsファイルのパスをipfsのurlに変更します。
20行目のhls.loadSource
の箇所です。
例)
hls.loadSource('http://localhost:8080/ipfs/QmVw9q9TUdPPFqkg7yESpJn9yi7vRGbbQgb7TUSX8J3bp5');
ブラウザでhtmlファイルを表示してみたら、
クルクルがずっと続いて再生はされませんでした。
m3u8のインデックスファイルの読み込みはOKでしたが、tsファイルの読み込みができていないようです。
インデックスはこのようになっていて、
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:8
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:8.341667,
sample-15s0.ts
#EXTINF:7.140467,
sample-15s1.ts
#EXT-X-ENDLIST
プレイヤー側は http://bafybeidq3b547z7mnohv4ytpz7jk2zzllslnkduv4en2zzhbkqutsdfmgi.ipfs.localhost:8080/sample-15s0.ts
といった感じでアクセスしようとしていますが、これはもちろん404となってしまいます。
実際はipfsのゲートウェイを介したurlにならないといけない。
hls.jsだけでは再生は難しそうです。
色々とドキュメントを漁っていたところ、
IPFSをJavascriptで操作できるライブラリであるJS-IPFSというもので IPFSによるビデオストリーミングする例がありました。
go-ipfsを使用してコマンドライン上からIPFSにアクセスしていましたが、次回からはjs-ipfsを使ってプログラムからでもIPFSに対する操作ができることを学んでいきたいと思います