• Stars
    star
    2,665
  • Rank 16,448 (Top 0.4 %)
  • Language
    Swift
  • License
    BSD 3-Clause "New...
  • Created almost 9 years ago
  • Updated about 2 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Camera and Microphone streaming library via RTMP and SRT for iOS, macOS, tvOS and visionOS.

HaishinKit for iOS, macOS, tvOS, visionOS and Android.

GitHub Stars Release Platform Compatibility Swift Compatibility GitHub license GitHub Sponsor

  • Camera and Microphone streaming library via RTMP and SRT for iOS, macOS, tvOS and visionOS.
  • README.md contains unreleased content, which can be tested on the main branch.
  • API Documentation

Sponsored with ๐Ÿ’– by
Stream Chat
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 with a pr template.
  • 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



Sponsorship

๐ŸŒ Related projects

Project name Notes License
HaishinKit for Android. Camera and Microphone streaming library via RTMP for Android. BSD 3-Clause "New" or "Revised" License
HaishinKit for Flutter. Camera and Microphone streaming library via RTMP for Flutter. BSD 3-Clause "New" or "Revised" License

๐ŸŽจ Features

RTMP

  • Authentication
  • Publish and Recording
  • Playback (Beta)
  • Adaptive bitrate streaming
  • Action Message Format
    • AMF0
    • AMF3
  • SharedObject
  • RTMPS
    • Native (RTMP over SSL/TLS)
    • Tunneled (RTMPT over SSL/TLS) (Technical Preview)
  • RTMPT (Technical Preview)
  • ReplayKit Live as a Broadcast Upload Extension
  • Enhanced RTMP

SRT(beta)

  • Publish and Recording (H264/AAC)
  • Playback(beta)
  • mode
    • caller
    • listener
    • rendezvous

Multi Camera

Supports two camera video sources. A picture-in-picture display that shows the image of the secondary camera of the primary camera. Supports camera split display that displays horizontally and vertically.

Picture-In-Picture Split
// If you want to use the multi-camera feature, please make sure stream.isMultiCamSessionEnabled = true. Before attachCamera or attachAudio.
stream.isMultiCamSessionEnabled = true

let back = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .back)
stream.attachCamera(back, track: 0) { _, error in
  if let error {
    logger.warn(error)
  }
}

let front = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .front)
stream.attachCamera(front, track: 1) { videoUnit, error in
  videoUnit?.isVideoMirrored = true
  if let error {
    logger.error(error)
  }
}

Rendering

Features PiPHKView MTHKView
Engine AVSampleBufferDisplayLayer Metal
Publish โœ” โœ”
Playback โœ” โœ”
VisualEffect โœ” โœ”
MultiCamera โœ” โœ”
PictureInPicture โœ”

Others

๐Ÿพ Examples

Examples project are available for iOS with UIKit, iOS with SwiftUI, macOS and tvOS. Example macOS requires Apple Silicon mac.

  • Camera and microphone publish.
  • Playback
git clone https://github.com/shogo4405/HaishinKit.swift.git
cd HaishinKit.swift
carthage bootstrap --platform iOS,macOS,tvOS --use-xcframeworks
open HaishinKit.xcodeproj

๐ŸŒ Requirements

Development

Version Xcode Swift
1.8.0+ 15.3+ 5.9+
1.7.0+ 15.0+ 5.9+
1.6.0+ 15.0+ 5.8+

OS

- iOS tvOS macOS visionOS watchOS
HaishinKit 13.0+ 13.0+ 10.15+ 1.0+ -
SRTHaishinKit 13.0+ - 13.0+ - -

Cocoa Keys

Please contains Info.plist.

iOS 10.0+

  • NSMicrophoneUsageDescription
  • NSCameraUsageDescription

macOS 10.14+

  • NSMicrophoneUsageDescription
  • NSCameraUsageDescription

tvOS 17.0+

  • NSMicrophoneUsageDescription
  • NSCameraUsageDescription

๐Ÿ”ง Installation

HaishinKit has a multi-module configuration. If you want to use the SRT protocol, please use SRTHaishinKit. SRTHaishinKit supports SPM only.

HaishinKit SRTHaishinKit
SPM https://github.com/shogo4405/HaishinKit.swift https://github.com/shogo4405/HaishinKit.swift
CocoaPods source 'https://github.com/CocoaPods/Specs.git'
use_frameworks!

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

target 'Your Target' do
platform :ios, '12.0'
import_pods
end
Not supported.
Carthage github "shogo4405/HaishinKit.swift" ~> 1.6.0 Not supported.

๐Ÿ”ง Prerequisites

Make sure you setup and activate your AVAudioSession iOS.

import AVFoundation
let session = AVAudioSession.sharedInstance()
do {
    try session.setCategory(.playAndRecord, mode: .default, options: [.defaultToSpeaker, .allowBluetooth])
    try session.setActive(true)
} catch {
    print(error)
}

๐Ÿ““ RTMP Usage

Ingest

let connection = RTMPConnection()
let stream = RTMPStream(connection: connection)

stream.attachAudio(AVCaptureDevice.default(for: .audio)) { _, error in
  if let error {
    logger.warn(error)
  }
}

stream.attachCamera(AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .back), track: 0) { _, error in
  if let error {
    logger.warn(error)
  }
}

let hkView = MTHKView(frame: view.bounds)
hkView.videoGravity = AVLayerVideoGravity.resizeAspectFill
hkView.attachStream(stream)

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

connection.connect("rtmp://localhost/appName/instanceName")
stream.publish("streamName")

Playback

let connection = RTMPConnection()
let stream = RTMPStream(connection: connection)

let hkView = MTHKView(frame: view.bounds)
hkView.videoGravity = AVLayerVideoGravity.resizeAspectFill
hkView.attachStream(stream)

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

connection.connect("rtmp://localhost/appName/instanceName")
stream.play("streamName")

Authentication

var connection = RTMPConnection()
connection.connect("rtmp://username:password@localhost/appName/instanceName")

๐Ÿ““ SRT Usage

Ingest

let connection = SRTConnection()
let stream = SRTStream(connection: connection)
stream.attachAudio(AVCaptureDevice.default(for: .audio)) { error in
    // print(error)
}
stream.attachCamera(AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .back), track: 0) { _, error in
  if let error {
    logger.warn(error)
  }
}

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

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

connection.connect("srt://host:port?option=foo")
stream.publish()

Playback

let connection = SRTConnection()
let stream = SRTStream(connection: connection)

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

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

connection.connect("srt://host:port?option=foo")
stream.play()

๐Ÿ““ Settings

๐Ÿ“น AVCaptureSession

stream.frameRate = 30
stream.sessionPreset = AVCaptureSession.Preset.medium

// Do not call beginConfiguration() and commitConfiguration() internally within the scope of the method, as they are called internally.
stream.configuration { session in
  session.automaticallyConfiguresApplicationAudioSession = true
}

๐Ÿ”Š Audio

Specifies the capture capture settings.

let front = AVCaptureDevice.default(for: .audio)
stream.attachAudio(front, track: 0) { audioUnit, error in
}

If you want to mix multiple audio tracks, please enable the Feature flag.

FeatureUtil.setEnabled(for: .multiTrackAudioMixing, isEnabled: true)

When you specify the sampling rate, it will perform resampling. Additionally, in the case of multiple channels, downsampling can be applied.

// Setting the value to 0 will be the same as the value specified in mainTrack.
stream.audioMixerSettings = IOAudioMixerSettings(
  channels: UInt32 = 0,
  sampleRate: Float64 = 44100
)

stream.audioMixerSettings.isMuted = false
stream.audioMixerSettings.mainTrack = 0
stream.audioMixerSettings.tracks = [
  0: .init(
    isMuted: Bool = false,
    downmix: Bool = true,
    channelMap: [Int]? = nil
  )
]
/// Specifies the bitRate of audio output.
stream.audioSettings.bitrate = 64 * 1000
/// Specifies the mixes the channels or not. Currently, it supports input sources with 4, 5, 6, and 8 channels.
stream.audioSettings.downmix = true
/// Specifies the map of the output to input channels.
 stream.audioSettings.channelMap: [Int]? = nil

๐ŸŽฅ Video

Specifies the video capture settings.

let front = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .front)
stream.attachCamera(front, track: 0) { videoUnit, error in
  videoUnit?.isVideoMirrored = true
  videoUnit?.preferredVideoStabilizationMode = .standard
  videoUnit?.colorFormat = kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange
}
stream.videoMixerSettings = IOVideoMixerSettings(
  mode: .pip,
  cornerRadius: 16.0,
  regionOfInterest: .init(
    origin: CGPoint(x: 16, y: 16),
    size: .init(width: 160, height: 160)
  ),
  direction: .east
)
stream.videoSettings = .init(
  videoSize: .init(width: 854, height: 480),
  profileLevel: kVTProfileLevel_H264_Baseline_3_1 as String,
  bitRate: 640 * 1000,
  maxKeyFrameIntervalDuration: 2,
  scalingMode: .trim,
  bitRateMode: .average,
  allowFrameReordering: nil,
  isHardwareEncoderEnabled: true
)

โบ๏ธ Recording

// Specifies the recording settings. 0" means the same of input.
var recorder = IOStreamRecorder()
stream.addObserver(recorder)

recorder.settings = [
  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
    ]
    */
  ]
]

recorder.startRunning()
// recorder.stopRunning()

๐Ÿ“œ License

BSD-3-Clause

More Repositories

1

HaishinKit.kt

Camera and Microphone streaming library via RTMP for Android.
Kotlin
130
star
2

SRTHaishinKit.swift

Camera and Microphone streaming library via SRT for iOS, macOS.
Swift
70
star
3

GPUHaishinKit.swift

Camera and Microphone streaming library via RTMP, HLS for iOS. Powered by GPUImage + HaishinKit.
Swift
37
star
4

KanaXS

ใฒใ‚‰ใŒใชโ‡”ใ‚ซใ‚ฟใ‚ซใƒŠใ€‚ๅ…จ่ง’่‹ฑๆ•ฐๅญ—โ‡”ๅŠ่ง’่‹ฑๆ•ฐๅญ—ใ€‚ๅ…จ่ง’ใ‚ซใ‚ฟใ‚ซใƒŠโ‡”ๅŠ่ง’ใ‚ซใ‚ฟใ‚ซใƒŠ็›ธไบ’ๅค‰ๆ›ใƒฉใ‚คใƒ–ใƒฉใƒชใƒผใฎJSใ€AS3ใ€JavaScript็‰ˆ
Java
32
star
5

Logboard

Simple logging framework for your framework project.
Swift
26
star
6

HaishinKit.dart

Camera and Microphone streaming library via RTMP for Flutter.
Dart
26
star
7

KanaSwift

ใฒใ‚‰ใŒใชโ‡”ใ‚ซใ‚ฟใ‚ซใƒŠใ€‚ๅ…จ่ง’่‹ฑๆ•ฐๅญ—โ‡”ๅŠ่ง’่‹ฑๆ•ฐๅญ—ใ€‚ๅ…จ่ง’ใ‚ซใ‚ฟใ‚ซใƒŠโ‡”ๅŠ่ง’ใ‚ซใ‚ฟใ‚ซใƒŠ็›ธไบ’ๅค‰ๆ›ใƒฉใ‚คใƒ–ใƒฉใƒชใƒผใฎSwift็‰ˆ
Swift
8
star
8

Usage

A (mac|watch|i|tv)OS Information Swift Wrapper Library
Swift
5
star
9

danger-privacymanifest

A Danger plugin that informs about PrivacyManifest compliance.
Ruby
5
star
10

HaishinKit-CocoaPods-Test

This is a test project verification for CocoaPods
Swift
1
star
11

MicrophoneInfo

Swift
1
star
12

danger-inspect

Danger plugin for Code inspections๏ปฟ.
Ruby
1
star