Upgrade to Pro — share decks privately, control downloads, hide ads and more …

SwiftでゼロからRTMPライブラリを実装してみた

Avatar for huiping192 huiping192
September 03, 2023

 SwiftでゼロからRTMPライブラリを実装してみた

Real Time Messaging Protocol (RTMP) とは、Adobe が開発している、Adobe Flash プレーヤーとサーバーの間で、音声・動画・データをやりとりするストリーミングのプロトコル。
YouTube LiveやTwitchなどのライブストリーミングサービスで広く使用されています。

AppleのプラットフォームではRTMPプロトコルがネイティブにサポートされていないため、librtmpライブラリの使用が一般的ですが、私はSwiftでの実装に挑戦しました。
このトークでは、Swiftを用いてRTMPライブラリをゼロから設計し、実装した経験を共有します。
特に難しかった挑戦、それにどう対処したか、そしてプロジェクト全体を通じての学びを詳しく紹介します。

Avatar for huiping192

huiping192

September 03, 2023
Tweet

Other Decks in Technology

Transcript

  1. Real-Time Messaging Protocol ◎ Stream ◦ 動画や音声の連続的なデータの流れ ◎ Message ◦

    クライアントとサーバ側やりたりの基本単位 ◎ Chunk ◦ ネットワーク送信の基本単位 8
  2. ビット演算 ◎ 1byte中にできるかぎりのデータを格納する ◎ 使ってるところ ◦ Chunk basic header ◦

    Set Chunk Size Message ◦ Video h.264 sps pps処理 ◦ Audio aac header data処理 ◦ ほか 12
  3. 非同期処理とThread safe Grand Central Dispatch 古いOSに交換性がある 非同期タスクのプライオリティ 制御ができる iOS、MacOSのみサポート Swift

    Concurrency Swift5.5 非同期処理が直感的にかける iOS、MacOS、linuxサポート 18 未来を見据えてSwift Concurrency使うことにしました
  4. ネットワーク通信 NSStream ObjcとSwift両方使える  Objc時代のAPI設計で Swiftyではない iOS、MacOSのみ対応 Network iOS12から出たフレーム ワーク TCP、UDP、Websocekt

    などの処理がラップさ れて実装が楽 iOS、MacOSのみ対応 SwiftNIO iOS、MacOS、Linuxサ ポート パフォーマンスが一番 いい APIが複雑 19 実装しやすさからNetworkフレームワーク使うことにしました
  5. 21

  6. Handshake ◎ Client -> Server: C0+C1 ◎ Server -> Client:

    S0+S1+S2 ◎ Client -> Server: C2 通信回数減らすためこの流れで処理されてる事が多い 22
  7. 23

  8. Message ◎ Command Message ◦ Connect ◦ Publish ◦ Play

    ◎ Data Message ◎ Shared Object Message ◎ Audio MessageとVideo Message ◎ Protocol Control Message ◎ ほか 25
  9. Chunk ◎ Messageから分割 ◎ Set Chunk Size Messageで最大payload size調整 ◎

    Chunk サイズを圧縮するため4つのheader typeがある 27
  10. 31

  11. 参考 ◎ Rtmp_specification_1.0.pdf ◦ rtmp仕様書 ◎ Amf0-file-format-spec.pdf ◦ amf0仕様書 ◎

    Amf3-file-format-spec.pdf ◦ amf3仕様書 ◎ Video_file_format_spec_v10.pdf ◦ flvファイルの仕様書 ◦ 35 注: Adobe公式サイトからダウンロードできなくなったので、ファイル名だけにします。