Popularity
8.9
Stable
Activity
8.8
Growing
2,378
73
514

Code Quality Rank: L3
Programming language: Swift
License: BSD 3-clause "New" or "Revised" License
Tags: Streaming    
Latest version: v1.1.1

HaishinKit alternatives and similar libraries

Based on the "Streaming" category.
Alternatively, view lf.swift alternatives based on common mentions on social networks and blogs.

Do you think we are missing an alternative of HaishinKit or a related project?

Add another 'Streaming' Library

README

HaishinKit for iOS, macOS, tvOS, and Android.

Platform Language CocoaPods GitHub license

  • Camera and Microphone streaming library via RTMP, HLS for iOS, macOS, tvOS.
  • API Documentation

Sponsored with πŸ’– by Enterprise Grade APIs for Feeds & Chat. Try the iOS Chat tutorial πŸ’¬

πŸ’¬ Communication

  • If you need help with making LiveStreaming requests using HaishinKit, use a GitHub Discussions with Q&A.
  • If you'd like to discuss a feature request, use a GitHub Discussions with Idea
  • If you met a HaishinKit's bugπŸ›, use a GitHub Issue with Bug report template
    • The trace level log is very useful. Please set LBLogger.with(HaishinKitIdentifier).level = .trace.
    • If you don't use an issue template. I will immediately close the your issue without a comment.
  • If you want to contribute, submit a pull request!
  • If you want to support e-mail based communication without GitHub.
    • Consulting fee is $50/1 incident. I'm able to response a few days.
  • Discord chatroom.
  • ζ—₯本θͺžγŒεˆ†γ‹γ‚‹ζ–Ήγ―ζ—₯本θͺžγ§γŠι‘˜γ„します!

πŸ’– Sponsors

🎨 Features

RTMP

  • [x] Authentication
  • [x] Publish and Recording (H264/AAC)
  • [x] Playback (Beta)
  • [x] Adaptive bitrate streaming
    • [x] Handling (see also [#126](/../../issues/126))
    • [x] Automatic drop frames
  • [ ] Action Message Format
    • [x] AMF0
    • [ ] AMF3
  • [x] SharedObject
  • [x] RTMPS
    • [x] Native (RTMP over SSL/TLS)
    • [x] Tunneled (RTMPT over SSL/TLS) (Technical Preview)
  • [x] RTMPT (Technical Preview)
  • [x] ReplayKit Live as a Broadcast Upload Extension

HLS

  • [x] HTTPService
  • [x] HLS Publish

Rendering

- HKView PiPHKView MTHKView
Engine AVCaptureVideoPreviewLayer AVSampleBufferDisplayLayer Metal
Publish β—‹ β—― β—‹
Playback Γ— β—― β—‹
VisualEffect Γ— β—― β—‹

Others

  • [x] Support tvOS 11.0+ (Technical Preview)
    • tvOS can't publish Camera and Microphone. Available playback feature.
  • [x] Hardware acceleration for H264 video encoding, AAC audio encoding
  • [x] Support "Allow app extension API only" option
  • [ ] Support GPUImage framework (~> 0.5.12)
  • [ ] Objective-C Bridging

🌏 Requirements

- iOS OSX tvOS Xcode Swift
1.3.0+ 11.0+ 10.13+ 10.2+ 14.0+ 5.7+
1.2.0+ 9.0+ 10.11+ 10.2+ 13.0+ 5.5+

🐾 Examples

Examples project are available for iOS with UIKit, iOS with SwiftUI, macOS and tvOS.

  • [x] Camera and microphone publish.
  • [x] RTMP Playback
    sh git clone https://github.com/shogo4405/HaishinKit.swift.git cd HaishinKit.swift carthage bootstrap --use-xcframeworks open HaishinKit.xcodeproj

β˜• Cocoa Keys

Please contains Info.plist.

iOS 10.0+

  • NSMicrophoneUsageDescription
  • NSCameraUsageDescription

macOS 10.14+

  • NSMicrophoneUsageDescription
  • NSCameraUsageDescription

πŸ”§ Installation

CocoaPods

source 'https://github.com/CocoaPods/Specs.git'
use_frameworks!

def import_pods
    pod 'HaishinKit', '~> 1.3.0
end

target 'Your Target'  do
    platform :ios, '11.0'
    import_pods
end

Carthage

github "shogo4405/HaishinKit.swift" ~> 1.3.0

Swift Package Manager

https://github.com/shogo4405/HaishinKit.swift

πŸ’  Donation

πŸ”§ Prerequisites

Make sure you setup and activate your AVAudioSession.

import AVFoundation
let session = AVAudioSession.sharedInstance()
do {
    // https://stackoverflow.com/questions/51010390/avaudiosession-setcategory-swift-4-2-ios-12-play-sound-on-silent
    if #available(iOS 10.0, *) {
        try session.setCategory(.playAndRecord, mode: .default, options: [.defaultToSpeaker, .allowBluetooth])
    } else {
        session.perform(NSSelectorFromString("setCategory:withOptions:error:"), with: AVAudioSession.Category.playAndRecord, with: [
            AVAudioSession.CategoryOptions.allowBluetooth,
            AVAudioSession.CategoryOptions.defaultToSpeaker]
        )
        try session.setMode(.default)
    }
    try session.setActive(true)
} catch {
    print(error)
}

πŸ““ RTMP Usage

Real Time Messaging Protocol (RTMP).

let rtmpConnection = RTMPConnection()
let rtmpStream = RTMPStream(connection: rtmpConnection)
rtmpStream.attachAudio(AVCaptureDevice.default(for: AVMediaType.audio)) { error in
    // print(error)
}
rtmpStream.attachCamera(DeviceUtil.device(withPosition: .back)) { error in
    // print(error)
}

let hkView = HKView(frame: view.bounds)
hkView.videoGravity = AVLayerVideoGravity.resizeAspectFill
hkView.attachStream(rtmpStream)

// add ViewController#view
view.addSubview(hkView)

rtmpConnection.connect("rtmp://localhost/appName/instanceName")
rtmpStream.publish("streamName")
// if you want to record a stream.
// rtmpStream.publish("streamName", type: .localRecord)

RTMP URL Format

  • rtmp://server-ip-address[:port]/application/[appInstance]/[prefix:[path1[/path2/]]]streamName
    • [] mark is an Optional. rtmpConneciton.connect("rtmp://server-ip-address[:port]/application/[appInstance]") rtmpStream.publish("[prefix:[path1[/path2/]]]streamName")
  • rtmp://localhost/live/streamName rtmpConneciton.connect("rtmp://localhost/live") rtmpStream.publish("streamName")

Settings

var rtmpStream = RTMPStream(connection: rtmpConnection)

rtmpStream.captureSettings = [
    .fps: 30, // FPS
    .sessionPreset: AVCaptureSession.Preset.medium, // input video width/height
    // .isVideoMirrored: false,
    // .continuousAutofocus: false, // use camera autofocus mode
    // .continuousExposure: false, //  use camera exposure mode
    // .preferredVideoStabilizationMode: AVCaptureVideoStabilizationMode.auto
]
rtmpStream.audioSettings = [
    .muted: false, // mute audio
    .bitrate: 32 * 1000,
]
rtmpStream.videoSettings = [
    .width: 640, // video output width
    .height: 360, // video output height
    .bitrate: 160 * 1000, // video output bitrate
    .profileLevel: kVTProfileLevel_H264_Baseline_3_1, // H264 Profile require "import VideoToolbox"
    .maxKeyFrameIntervalDuration: 2, // key frame / sec
]
// "0" means the same of input
rtmpStream.recorderSettings = [
    AVMediaType.audio: [
        AVFormatIDKey: Int(kAudioFormatMPEG4AAC),
        AVSampleRateKey: 0,
        AVNumberOfChannelsKey: 0,
        // AVEncoderBitRateKey: 128000,
    ],
    AVMediaType.video: [
        AVVideoCodecKey: AVVideoCodecH264,
        AVVideoHeightKey: 0,
        AVVideoWidthKey: 0,
        /*
        AVVideoCompressionPropertiesKey: [
            AVVideoMaxKeyFrameIntervalDurationKey: 2,
            AVVideoProfileLevelKey: AVVideoProfileLevelH264Baseline30,
            AVVideoAverageBitRateKey: 512000
        ]
        */
    ],
]

// 2nd arguemnt set false
rtmpStream.attachAudio(AVCaptureDevice.default(for: AVMediaType.audio), automaticallyConfiguresApplicationAudioSession: false)

Authentication

var rtmpConnection = RTMPConnection()
rtmpConnection.connect("rtmp://username:[email protected]/appName/instanceName")

Screen Capture

// iOS
rtmpStream.attachScreen(ScreenCaptureSession(shared: UIApplication.shared))
// macOS
rtmpStream.attachScreen(AVCaptureScreenInput(displayID: CGMainDisplayID()))

πŸ““ HTTP Usage

HTTP Live Streaming (HLS). Your iPhone/Mac become a IP Camera. Basic snipet. You can see http://ip.address:8080/hello/playlist.m3u8

var httpStream = HTTPStream()
httpStream.attachCamera(DeviceUtil.device(withPosition: .back))
httpStream.attachAudio(AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeAudio))
httpStream.publish("hello")

var hkView = HKView(frame: view.bounds)
hkView.attachStream(httpStream)

var httpService = HLSService(domain: "", type: "_http._tcp", name: "HaishinKit", port: 8080)
httpService.startRunning()
httpService.addHTTPStream(httpStream)

// add ViewController#view
view.addSubview(hkView)

πŸ“– Reference

πŸ“œ License

BSD-3-Clause


*Note that all licence references and agreements mentioned in the HaishinKit README section above are relevant to that project's source code only.