Cloudflare Streamでストリーミング用動画をMP4ファイルでダウンロードしてみた
はじめに
清水です。Cloudflareの動画配信プラットフォームのサービスCloudflare Streamでは、ストリーミング用にアップロードもしくはライブ入力した動画コンテンツをMP4ファイルとしてダウンロードすることが可能です。本エントリではこの機能について確認してみたのでまとめてみたいと思います。
便利に利用できる機能ですが、ダウンロードしたMP4ファイルの解像度やビットレート等がオリジナルとは異なる点、また動画ファイルの尺で費用が発生する点などに注意しておきましょう。
オンデマンド動画をMP4ファイルでダウンロード
ダッシュボードからのダウンロードを有効化する
まずはアップロード済みのオンデマンド動画をダウンロードしてみましょう。ダッシュボードからビデオの詳細ページに進み、「設定」タブで「MP4ダウンロードを有効にする」のチェックを有効にし[保存]します。
「ダウンロードを作成しています」というメッセージが進捗パーセンテージとともに表示されます。
しばらくすると「ダウンロードを作成しています]の文字列部分がダウンロードURLに変わります。
このURLをブラウザのアドレスバーに入力してダウンロードします。実際にダウンロードした動画が以下になります。
API経由でダウンロードを有効化する
他のCloudflare Streamの機能と同様、API経由でダウンロードを有効にすることも可能です。/downloads
エンドポイントにPOSTを行います。
curl -X POST \ -H "Authorization: Bearer ${TOKEN}" \ "https://api.cloudflare.com/client/v4/accounts/${ACCOUNT}/stream/${VIDEO_UID}/downloads"
以下が実際の実行結果です。
% curl -X POST \ -H "Authorization: Bearer ${TOKEN}" \ "https://api.cloudflare.com/client/v4/accounts/${ACCOUNT}/stream/${VIDEO_UID}/downloads" { "result": { "default": { "status": "inprogress", "url": "https://videodelivery.net/64e6xxxxxxxxxxxxxxxxxxxxxxxxxxxx/downloads/default.mp4", "percentComplete": 0 } }, "success": true, "errors": [], "messages": [] }
同じ/downloads
エンドポイントにGETリクエストを贈り、percentCompete
が100
になっていたらurl
からダウンロードしましょう。
% curl -X GET \ -H "Authorization: Bearer ${TOKEN}" \ "https://api.cloudflare.com/client/v4/accounts/${ACCOUNT}/stream/${VIDEO_UID}/downloads" { "result": { "default": { "status": "ready", "url": "https://videodelivery.net/64e6xxxxxxxxxxxxxxxxxxxxxxxxxxxx/downloads/default.mp4", "percentComplete": 100 } }, "success": true, "errors": [], "messages": [] }
動画のフォーマット、解像度、ビットレートについて
さて、先ほどダッシュボードからダウンロードしたデータのMediaInfoによるメタデータをもう一度見てみましょう。以下に再掲します。
MPEG-4、AVC、ビットレートは約7Mbps、1920x1080、60fpsといった具合です。さて、このアップロードした際の動画情報を振り返ってみます。こちらのエントリでアップロードした動画のですが、JSONデータを確認すると以下の箇所があります。
% curl -X GET \ -H "Authorization: Bearer ${TOKEN}" \ "https://api.cloudflare.com/client/v4/accounts/${ACCOUNT}/stream/${VIDEO_UID}" { "result": { "uid": "c409xxxxxxxxxxxxxxxxxxxxxxxxxxxx", ~~~ 略 ~~~ "meta": { "filename": "IMG_5908.MOV", "filetype": "video/quicktime", "name": "小田原の海", "relativePath": "null", "type": "video/quicktime" }, ~~~ 略 ~~~ "input": { "width": 3840, "height": 2160 }, ~~~ 略 ~~~ }
元のデータは4K解像度(3840x2160)、ファイル名からもなんとなく察することができるようにiPhoneで撮影した動画で、QuickTime形式のものです。アップロードしたもとの動画のメタ情報は下記になります。
MPEG-4ですがQuickTime形式、HEVC、ビットレートは50Mbps強で解像度が3840x2160(4K)でした。これがCloudflare Streamにアップロードの段階でストリーミングに最適になるように変換され、ダウンロード可能なMP4ファイルはこの変換後の動画ファイルとなるわけです。アップロード時とまったく同じ解像度、ビットレート、フォーマット等ではない点は念のため留意しておきましょう。
ライブストリーミングした動画のダウンロード
ライブストリームを行った動画についてもMP4ファイルでのダウンロードが可能です。(Download live stream videos · Cloudflare Stream docs) ビデオの項目からライブストリームで作成されたビデオの詳細ページをたどるか、ライブ入力の詳細ページの「ライブ入力で作成されたビデオ」の項目からビデオの詳細ページに進みます。
あとはオンデマンド動画のときと同様、「MP4ダウンロードを有効にする」のチェックをonにして設定を保存し、ダウンロードできるようになるまで待ちましょう。ライブ配信したものがその後、単一のファイル形式でダウンロードできるのは便利ですね!
ダウンロードファイル名のカスタマイズ
さて、ダウンロードしたファイルはデフォルトだとdefault.mp4
で保存されます。ダウンロードの際のURLにクエリ文字列を付与することでこのダウンロードファイル名をカスタマイズすることが可能です。クエリ文字列はfilename=MY_VIDEO.mp4
という具合ですね。この場合MY_VIDEO.mp4
がダウンロードされるファイル名となります。ダウンロードURLとあわせると以下の形式です。
https://videodelivery.net/$VIDEOID/downloads/default.mp4?filename=MY_VIDEO.mp4
ダウンロード時の署名付きURLの利用
単一のファイルとしてダウンロードできるのは便利なのですが、URLが公開されてしまい無制限にダウンロードされてしまう、という心配もありますよね。(ストリーミング形式でも同様の問題ははらんでいるとは思いますが。) ダウンロード用のURLも署名付きURLに対応しているので、これでアクセスを制御することができます。
対象のビデオコンテンツに対し、あらかじめ「署名付きURLが必要」のチェックを有効にしておきます。
この段階でダウンロードURLにアクセスしても「401 unauthorized」が返り、ダウンロードはできなくなっています。
署名付きURLへのアクセスに利用するトークンの作成はStream Playerの利用時と基本的には同様です。
今回はapi.cloudflare.com
の/token
エンドポイントにリクエストするかたちでトークンを作成しました。ダウンロードを有効にするため、/token
エンドポイントへのリクエストの際に"downloadable": true
のデータを含めます。
curl -X POST \ -H "Authorization: Bearer $TOKEN" \ --data '{"downloadable": true}' \ "https://api.cloudflare.com/client/v4/accounts/${ACCOUNT}/stream/${VIDEO_UID}/token"
以下が実際の実行結果です。
% curl -X POST \ -H "Authorization: Bearer $TOKEN" \ --data '{"downloadable": true}' \ "https://api.cloudflare.com/client/v4/accounts/${ACCOUNT}/stream/${VIDEO_UID}/token" { "result": { "token": "eyJhxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" }, "success": true, "errors": [], "messages": [] }
レスポンスのtoken
の値を使い、以下URLでダウンロードを行います。(ビデオIDの部分がトークンに置き換わります。)
https://videodelivery.net/eyJhxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/downloads/default.mp4
ダウンロード機能の料金
mp4ダウンロード機能について一通り確認してきました。最後にmp4ダウンロードの料金について確認しておきましょう。
料金としては、通常のストリーミング視聴と同様の計算で発生します。例えば10分の動画を1回ダウンロードすれば、ストリーミング10分の視聴と同様にカウントされます。10分の動画を100回ダウンロードすれば1,000分、$1の課金となります。
またMP4ダウンロードの有効化自体は、特に料金は発生しないとのことです。追加のストレージコストなどが発生しないのは嬉しいポイントですね。
まとめ
Cloudflare Streamの動画ダウンロード機能について確認してみました。視聴するだけの目的であればストリーミング形式ですみますが、何らかの事情で単一のファイルとしてダウンロードしたい、という要求は多々あるかと思います。アップロード時とまったく同じ動画ファイル(解像度、ビットレート等)ではありませんが、Cloudflare Streamにアップロードしておけば容易に単一ファイルとしてダウンロードできるのは便利だと思います。アップロード時にWatermarkを付与した場合はWatermark挿入済みの動画がダウンロードできますし、またライブストリーミングを単一のファイルとしてダウンロードできる点も嬉しですね。費用の面に注意しつつ上手に利用していきたいと思いました。