1.9K Views
June 14, 23
スライド概要
動画配信を1フレーム単位の高精度で切替える技術について。既存の方法であれば1,000万円超というコスト感な内容に対して、OSSを用いることにより大幅にコストをダウンさせ、かつ高精度な切替えを実現させる技術について解説します。
※2023年5月14日(日)に開催された会津大学公認の技術系サークルZli(ジライ)主催の「大LT 2023 春 in Aizu」でのLT資料です。
1997年の設立以来、動画配信を主軸に事業展開。コーポレートメッセージ「もっと素敵な伝え方を。」を掲げ、テクノロジーを通じて世の中のコミュニケーションをよりよくすることを目指しています。 自社で保有・運営する独自のコンテンツ配信ネットワーク(CDN=Content Delivery Network)を活用した動画配信に加え、長年のノウハウを活かした動画の企画・制作・運用やWebサイト制作、システム開発、動画広告による収益化支援まで総合的なサービスとソリューションを提供。取引実績はメディア、大手企業をはじめ年間1,200社・10,000案件以上です。手がける技術領域は、ネットワークの物理層からアプリケーション層にわたり、日本屈指の大規模配信や最先端案件の実績も多数あります。 エンジニア向けオウンドサイト「Voice」公開中! https://voice.stream.co.jp/
Zli 大LT 2023 春 in Aizu OSSを駆使した1フレーム単位の 精度での動画の差し替え Y. N. プラットフォーム本部 技術開発部 プラットフォーム開発課 テックリード 2023/05/14
突然ですが 動画、見ていますか? Copyright © 2023 J-Stream Inc.
突然ですが 動画ってどんな仕組みで 配信されているか知っていますか? Copyright © 2023 J-Stream Inc.
ストリーミング配信 断片化した動画の情報や 配信についての情報が 記述されている。 (HLSのm3u8の例) 1つの動画を数秒ごとに 細かく分割する (セグメント) Copyright © 2023 J-Stream Inc. 動画の断片を順番に ダウンロードし、再生する
編成配信 • 事前に設定した時間、順番で、事前に用意した動画や、 ライブ映像を切り替えて配信する • テレビのように番組表を組んで配信する • 例えば… • • • 13:00~13:30は動画A 13:30~14:00はライブ配信A 14:00~15:00は動画B Copyright © 2023 J-Stream Inc.
1フレーム単位での差し替え • 編成配信では途中で動画の差し替えを行う必要がある • HLSの場合、セグメントが最小単位 →差し替えに数秒のタイムラグが発生! • • 事故映像が入った場合には瞬時に切り替える必要がある テレビのCMでは1フレームのずれでも事故になる 本編(5秒) • 本編(3秒)+事故(2秒) 安全な映像 1フレーム単位で差し替えたい! →本日のお話 • ちなみに国内特許取得済み Jストリーム、ネット動画の配信におけるリアルタイム映像コンテンツ挿入・切替技術に かかる国内特許を取得 Copyright © 2023 J-Stream Inc.
そんなに難しいの? • フレーム単位での制御は簡単 →ただし高価な機材が必要 • • • • エンコーダー(SCTE35対応)は1台300~500万円! SCTE104 VANCインサータも200万円!! そして、メインとバックアップでそれぞれ2台必要!!! なんと総額1000万円越え!!!!! • 動画を差し替えるだけなんだからもうちょっと安くできない? • HLSをちょちょいといじるだけで済ませたい! Copyright © 2023 J-Stream Inc.
セグメントを切って繋ぎかえれば? • • 違うファイルになるためDISCONTINUITYが必要 • • • DISCONTINUITYはm3u8のタグ 動画の種類を変えるときに使用 https://datatracker.ietf.org/doc/html/rfc8216#section-4.3.2.3 DISCONTINUITYはプレイヤーのリセットを引き起こす • • リセットは負荷が高い 環境によっては連続して使うと映像が固まることがある 本編(3秒)+事故(2秒) ライブA 本編(5秒) ライブB 安全な映像 本編-改(3秒) 事故映像(5秒) 安全-改 安全な映像 Copyright © 2023 J-Stream Inc. 安全な映像
セグメントの加工は難しい ● そもそも動画のフレームって順番通りに並んでいない ○ 圧縮の都合上、デコード順と再生順は一致しないことも(DTS/PTS) 再生順 I B B P B B P データ I P B B P B B ● フレームレートによってはドロップフレームがある ○ 閏年のようにフレームをスキップして調整する必要があるため ■ 29.97fpsの場合は10分で18フレームスキップされる ● 加工に時間をかけられない ○ ライブ映像の場合、セグメントの生成→加工→配信を すぐにしないといけない! Copyright © 2023 J-Stream Inc.
どうやって解決したの? Copyright © 2023 J-Stream Inc.
差し替え部分のつなげ方 • まずは動画を切り出す • フレームレートを調べて切り出すフレームの場所を計算する • • スキップするフレームも考慮 動画はフレーム単位で、音声は時間単位で指定して切り出し ライブA 本編(3秒)+事故(2秒) 本編-改(3秒) ライブB 安全な映像 安全-改 ffprobe -print_format json -show-streams -i org.ts (フレームレートを確認する) ffmpeg -i org.ts -an -vf trim=end_frame=切るフレーム,setpts=PTS-STARTPTS -c:v h264 -profile:v main -b:v ビットレート edit.h264 ffmpeg -i org.ts -c:a copy -t 切る時間 edit.aac Copyright © 2023 J-Stream Inc.
差し替え部分のつなげ方 • 切り出した動画はPTSがリセットされているので設定しなおす ※PTS(Presentation Time Stamp):どのタイミングで再生するべきかを示すマーク • • • 元のファイルに設定されているPTSを取得する 取得したPTSを元に切り出した動画にPTSを設定する これにより切り出した動画でも連続した動画として再生できる • 1度だけのDISCONTINUITYで済む 本編(3秒)+事故(2秒) ライブA 本編(5秒) ライブB 安全な映像 本編-改(3秒) 事故映像(5秒) 安全-改 安全な映像 ffprobe -print_format json -show-streams -i org.ts (videoとaudioのpkt_ptsを確認する) MP4Box -add edit.h264:timescale=90000 -add edit.aac:timescale=90000 ¥ -delay 1=$((映像のpkt_pts * 1000 / 90000)) -delay 2=$((音声のpkt_pts * 1000 / 90000)) edit.mp4 Copyright © 2023 J-Stream Inc. 安全な映像
より高速にするために… • 一連の処理を複数コンテナに分けて行う • • • セグメントをダウンロードするコンテナ 動画を加工するコンテナ メタデータを書き換えるコンテナ →同時並行で素早く処理が行えるように!スケールも可能!! Copyright © 2023 J-Stream Inc.
まとめ • • • • HLSの動画の差し替えは • • セグメント単位だと数秒の遅延が発生 フレーム単位だと高価な機材が必要になる OSSを組み合わせて使うことで実現可能! 1000万円超えのシステムが不要に! クラウド化も可能! より詳しい話はこちら:特許を取得したプロジェクト関係者に聞く開発の舞台裏 Copyright © 2023 J-Stream Inc.