Streaming video di iOS melalui RTMP

Intro

Baru-baru ini saya mendapat tugas menarik untuk bekerja, membuat aplikasi untuk video streaming, ini untuk startup ShopStory (ecomm live streaming). Versi pertama aplikasi diimplementasikan menggunakan pustaka Open Source untuk streaming RTMP HaishinKit . Dan versi kedua ada di Larix SDK . Pada artikel ini, saya akan menganalisis masalah apa yang muncul dalam prosesnya.





Persyaratan

 ShopStory.live - B2B live e-commerce, , . , , , , . ShopStory.live  , , beauty- live commerce .





ShopStory, LarixBroadcaster , Android iOS. :





  1. , , , LarixBroadcaster



    , . , , , .





  2. , , .





  3. .





  4. , (, , ).





:









  • ( , )





  • ABR - Adaptive BitRate ( )





  • , fps, ..





  • .





โ€“ . Larix SDK



โ€“ , .

, :





  • LFLiveKit โ€“ 4.2k , 2016. 115 issue, .





  • HaishinKit โ€“ 2.1k , 7 . 11 issues.





  • VideoCore โ€“ 1.5k , 2015. .





  • KSY Live iOS SDK โ€“ 0.8k , 22 2020. README .





HaishinKit. , , .





HaishinKit

, . . /, . AVCaptureSession, AVCaptureDevice, AVCaptureDeviceInput



. View



, attach



RTMPStream







:





protocol BroadcastService: AnyObject {
    func connect()
    func publish()
    func stop()
}
      
      



.





class HaishinBroadcastService: BroadcastService {}
      
      



ABR - Adaptive BitRate

, , ().





ABR, issue. RTMPStreamDelegate



.





extension HaishinBroadcastService: RTMPStreamDelegate {
    func rtmpStream(_ stream: RTMPStream, didPublishInsufficientBW connection: RTMPConnection) {
        guard self.config.adaptiveBitrate else { return }
        guard let bitrate = self.currentBitrate else {
            assertionFailure()
            return
        }
        let newBitrate = max(UInt32(Double(bitrate) * Constants.bitrateDown), Constants.minBitrate)
        self.rtmpStream.videoSettings[.bitrate] = newBitrate
    }

    func rtmpStream(_ stream: RTMPStream, didPublishSufficientBW connection: RTMPConnection) {
        guard self.config.adaptiveBitrate else { return }
        guard let currentBitrate = self.currentBitrate,
              currentBitrate < Constants.maxBitrate else {
            return
        }
        guard self.bitrateRetryCounter >= Constants.retrySecBeforeUpBitrate else {
            self.bitrateRetryCounter += 1
            return
        }

        self.bitrateRetryCounter = 0
        let newBitrate = min(Constants.maxBitrate, UInt32(Double(currentBitrate) * Constants.bitrateUp))
        if newBitrate == currentBitrate { return }

        self.rtmpStream.videoSettings[.bitrate] = newBitrate
    }
}

private struct Constants {
    static let bitrateDown: Double = 0.75
    static let bitrateUp: Double = 1.15
    static let retrySecBeforeUpBitrate = 20
}
      
      



issue โ€“ ( 2 ), . didPublishInsufficientBW



, .





:





  • , 0.75





  • , 20 ( ), 1.15





Live update resolution

, , . RTMP . VK Live . Instagram , rtmp , , , ( , ). ShopStory .





. Wi-Fi, LTE. Larix SDK



. LarixBroadcaster โ€“ .





Larix SDK

LarixBroadcaster



+ LarixDemo ( ), , StepByStepGuide.





:





  • ,





  • .





:









  • , - LarixBroadcaster



    ( , : over 2000 )









  • connect



    publish







-

โ€ฆ , LarixBroadcaster



ViewController



2100 , Streamer



1100 . SDK. โ€ฆ , . @Aquary ( ):





ยซ " ". โ€” - . , . โ€” . , , .. , .ยป





, SDK . , . c HaishinKit



, .. ( HaishinKit



).





ABR, ( ), , . . LarixBroadcaster



3 StreamConditionerMode1, 2, 3,



. ABR? ABR ( ).





, . , status = disconnected



. , .





func connectionStateDidChangeId(_ connectionID: Int32, state: ConnectionState, status: ConnectionStatus, info: [AnyHashable: Any]) {}
      
      



Larix



.

: SDK StreamerEngineProxy



bytesSent



bytesDelivered



, , . , , .





Connect Publish

RTMP, publish



connect



, Larix



( ), . - BroadcastService



.





?





  • , , , , , .





  • . , publish



    , , , , ( ). publish



    ( ). .





. , .





Pilihan perpustakaan gratis untuk streaming di iOS tidak terlalu besar dan sebenarnya semuanya bermuara pada satu opsi - HaishinKit



. Ini memiliki keuntungan yang tidak diragukan lagi - open source, dan jika Larix



kita gagal menyelaraskan grafik dan meningkatkan stabilitas, kita akan masuk ke open source dan mencari tempat yang dapat ditingkatkan.





Membeli SDK berbayar - jangan berharap itu akan menyelesaikan semua masalah Anda, mungkin Anda akan memiliki lebih banyak dari mereka (pelajari vc lebih dari 2000 baris).





Dan beberapa kesimpulan global hanya dapat dibuat setelah kami menjalankan perakitan di sejumlah besar aliran.








All Articles