見出し画像

OPENREC.tv における動画配信品質の計測について

OPENREC.tv で動画配信基盤の開発・運用を行っている野見山です。普段はOPENREC.tvのバックエンドや動画配信にかかわる部分の機能開発を行っております。
本記事では、OPENREC.tvにおける動画配信品質の計測について紹介しようと思います。

動画配信基盤について

OPENREC.tvでは独自に動画配信基盤(※1)を持っており、外部の動画配信のSaaSサービスを利用する点と比較すると以下の点が可能になります。

・サービスに合わせた独自のカスタマイズが可能
・サービス提供元のSaaS事業者のメンテナンス状態に左右されない運用が可能

独自のカスタマイズが可能になったことにより、ワンステップ配信機能や動画のダウンロード機能といったサービスの特性に併せて多くの機能の提供が可能になります。

動画配信品質の計測

動画配信品質の計測は主に以下のデータを配信基盤から Prometheus を用いて取得を行い、時系列で計測されたデータを追えるようにしています。

・配信メタデータ情報
・ある地点でのビットレート値
・ある地点でのフレームスキップ数

以前は、以下のような形で、配信基盤のログからビットレート値を取得し手作業でグラフ化して確認しており、データの加工やメトリクスの作成に時間や対応できる人も限られており、映像調査系が属人化しているような状態になっていました。

そこで、Prometheus と配信基盤を連携することで、データの加工や取得といった属人化している箇所を軽減し、誰でもビットレート値を確認できる状態を目指していきました。

Prometheus からどのようにして配信基盤の計測値を取得しているかについては、別途記事を寄稿していますのでそちらをご参照ください(※2)。本記事では、アプリケーションとして、どのように情報を取得し、Prometheus で取得可能にするかについて紹介します。
アプリケーション側では、OBSなどの配信ツールで設定するストリームキーをキーとして、配信メタデータとモニタリングに2つに分けてデータを保持しています。

配信メタデータ

配信ツールから配信サーバーへ接続を行った際に、下で示したような形で、映像・音声データのビットレート、fps値、解像度などのメタデータを送信しています。メタデータが送られてきたタイミングで、ストリームキーと送られて来たメタデータを紐づけし切断を行うまで保持し続けるようにしています。 OPENREC.tv では、解像度(width, height)、音声・映像ビットレート(audiodatarate, videodatarate)、fps値(framerate)、音声チャンネル(audiochannels)のデータを取得し、配信基盤内で動画の変換作業(トランスコード)の制御処理の判定などに利用しています。

{
  Obj[]: {
    duration: 0.0, 
    fileSize: 0.0, 
    width: 1280.0, 
    height: 720.0, 
    videocodecid: 7.0, 
    videodatarate: 2500.0, 
    framerate: 30.0, 
    audiocodecid: 10.0, 
    audiodatarate: 160.0, 
    audiosamplerate: 48000.0, 
    audiosamplesize: 16.0, 
    audiochannels: 2.0, 
    stereo: true, 
    2.1: false, 
    3.1: false, 
    4.0: false, 
    4.1: false, 
    5.1: false, 
    7.1: false, 
    encoder: "obs-output module (libobs version 29.0.0)"
  }
}

モニタリング

OPENREC.tv で利用している配信基盤では、システム内で定期的にビットレートを計測するモニタリング機構が存在しています。配信ツールから送信されたバイト値を用いてビットレートを算出しており、その値を利用してビットレート上限を超えたライブ配信の切断を行っています。
このビットレートの値をストリームキーを紐付けることで現在のビットレートの値を保持しています。
合わせて、動画のトランスコードを行う際にCPU負荷の急騰や異常なデータなどで実際の映像が数フレーム欠落した状態で出力された状態を検知するため、映像のフレームドロップが発生した場合にどれくらいのフレームが欠落したかにより以下でカテゴリ分けし保持しています。

  • 1フレームドロップ

  • 2フレームドロップ

  • 4フレームドロップ

  • キーフレーム間隔で設定した値のフレーム数のみ出力

  • 全フレーム出力なし

このカテゴリ分けは下に行くほど映像のフレームドロップが顕著になり、出力された映像がカクついたりするなどといった映像の劣化に繋がります。

Prometheus との連携

アプリケーションと Prometheus との連携を行うに当たり、メトリクスとして取得可能になるようにデータの加工をする必要が出てきます。
そこで各動画配信サーバーにAPIを定義し、 Prometheus で取得できる形式にデータを加工した上で提供しています。
下記で示したデータが一例になりますが、 ストリームキー毎に videoInfo (配信メタデータ)と monitoring (モニタリング)の2種類の値を提供しています。

$ curl localhost/metrics
WowzaStreamingEngine_Streams_videoInfo_framerate{streamName="streamKey"} 30.0
WowzaStreamingEngine_Streams_videoInfo_width{streamName="streamKey"} 1920.0
WowzaStreamingEngine_Streams_videoInfo_height{streamName="streamKey"} 1080.0
WowzaStreamingEngine_Streams_videoInfo_videodatarate{streamName="streamKey"} 8000000.0
WowzaStreamingEngine_Streams_videoInfo_audiodataratee{streamName="streamKey"} 160000.0
WowzaStreamingEngine_Streams_videoInfo_audiochannels{streamName="streamKey"} 2.0
WowzaStreamingEngine_Streams_videoInfo_skipKeyframeCount{streamName="streamKey"} 0.0
WowzaStreamingEngine_Streams_monitoringBitrate{streamName="streamKey"} 8076.904
WowzaStreamingEngine_Streams_monitoringBehindVideoFrame_skip1Frame{streamName="streamKey"} 0.0
WowzaStreamingEngine_Streams_monitoringBehindVideoFrame_skip2Frames{streamName="streamKey"} 0.0
WowzaStreamingEngine_Streams_monitoringBehindVideoFrame_skip4Frames{streamName="streamKey"} 0.0
WowzaStreamingEngine_Streams_monitoringBehindVideoFrame_keyFrameOnly{streamName="streamKey"} 0.0
WowzaStreamingEngine_Streams_monitoringBehindVideoFrame_allFramesOff{streamName="streamKey"} 0.0
$

取得されたモニタリングデータの可視化

Prometheus で取得したモニタリングデータに関しては Grafana 上でダッシュボードを作成し、視覚的に確認できるようにしています。
作成したダッシュボード上では、配信が行われた配信サーバーのホスト名、配信メタデータの情報とビットレートの変化・フレームドロップを検知した時間帯の増加数をメトリクスとして表示しています。

異常な状態の場合になった場合は以下のようなメトリクスとなり配信映像の劣化が発生しているという点が一目でわかるようになります。

このダッシュボードの実装により、今までと比較し、調査スピードの改善と問題発生時の一次調査を配信基盤を運用しているメンバー以外が行えるようになり、調査の効率化や属人化の軽減につなげられています。

まとめ

本記事では、動画配信における配信品質計測に関して、OPENREC.tv ではどのように実現させているかについて紹介しました。
ビットレートや映像のフレームドロップの可視化を行うことで、映像品質の劣化の把握が容易となり、今後の品質改善につなげていく動きを行えるようになりました。
今後も、配信映像における品質計測と向上を繰り返していき、映像の視聴体験の向上に繋げられればと思います。

※1: https://speakerdeck.com/uorat/20170601-aws-devday-tokyo-openrec
※2: https://note.com/cyberz_cto/n/n63279e48602f


この記事が気に入ったらサポートをしてみませんか?