Swiftpack.co - shogo4405/HaishinKit.swift as Swift Package

Swiftpack.co is a collection of thousands of indexed Swift packages. Search packages.
See all packages published by shogo4405.
shogo4405/HaishinKit.swift 1.6.0
Camera and Microphone streaming library via RTMP, HLS for iOS, macOS and tvOS.
โญ๏ธ 2,574
๐Ÿ•“ 6 days ago
iOS macOS tvOS macCatalyst
.package(url: "https://github.com/shogo4405/HaishinKit.swift.git", from: "1.6.0")

HaishinKit for iOS, macOS, tvOS, and Android.

GitHub Stars Release Platform Compatibility Swift Compatibility GitHub license

  • Camera and Microphone streaming library via RTMP, HLS for iOS, macOS, tvOS.
  • 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

Streamlabs

๐ŸŒ 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
    • โ˜‘ Handling (see also #1153)
  • โ˜ 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

HLS

  • โ˜‘ HTTPService
  • โ˜‘ HLS Publish

SRT

  • โ˜‘ 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're using multi-camera functionality, please make sure to call the attachMultiCamera method first. This is required for iOS 14 and 15, among others.
if #available(iOS 13.0, *) {
  let front = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .front)
  stream.attachMultiCamera(front)
}
let back = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .back)
stream.attachCamera(back)
rtmpStream.attachAudio(AVCaptureDevice.default(for: .audio))

Rendering

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

Others

๐Ÿพ Examples

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

  • โ˜‘ Camera and microphone publish.
  • โ˜‘ RTMP 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.6.0+ 15.0+ 5.8+
1.5.0+ 14.0+ 5.7+

OS

- iOS tvOS macOS visionOS watchOS
HaishinKit 12.0+ 12.0+ 10.13+ - -
SRTHaishinKit 12.0+ - - - -

Cocoa Keys

Please contains Info.plist.

iOS 10.0+

  • NSMicrophoneUsageDescription
  • NSCameraUsageDescription

macOS 10.14+

  • 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

Real Time Messaging Protocol (RTMP).

let connection = RTMPConnection()
let stream = RTMPStream(connection: rtmpConnection)
stream.attachAudio(AVCaptureDevice.default(for: .audio)) { error in
    // print(error)
}
stream.attachCamera(AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .back)) { error in
    // print(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")

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 stream = RTMPStream(connection: rtmpConnection)

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

/// Specifies the video capture settings.
stream.videoCapture(for: 0).isVideoMirrored = false
stream.videoCapture(for: 0).preferredVideoStabilizationMode = .auto
// rtmpStream.videoCapture(for: 1).isVideoMirrored = false

// Specifies the audio codec settings.
stream.audioSettings = AudioCodecSettings(
  bitRate: 64 * 1000
)

// Specifies the video codec settings.
stream.videoSettings = VideoCodecSettings(
  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
)

// Specifies the recording settings. 0" means the same of input.
stream.startRecording([
  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
stream.attachAudio(AVCaptureDevice.default(for: .audio), automaticallyConfiguresApplicationAudioSession: false)
// picrure in picrure settings.
stream.multiCamCaptureSettings = MultiCamCaptureSetting(
  mode: .pip,
  cornerRadius: 16.0,
  regionOfInterest: .init(
    origin: CGPoint(x: 16, y: 16),
    size: .init(width: 160, height: 160)
  )
)
// split settings.
stream.multiCamCaptureSettings = MultiCamCaptureSetting(
  mode: .split(direction: .east),
  cornerRadius: 0.0,
  regionOfInterest: .init(
    origin: .zero,
    size: .zero
  )
)

Authentication

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

Screen Capture

// iOS
let screen = IOUIScreenCaptureUnit(shared: UIApplication.shared)
screen.delegate = stream
screen.startRunning()

// macOS
stream.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 stream = HTTPStream()
stream.attachCamera(AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .back))
stream.attachAudio(AVCaptureDevice.default(for: .audio))
stream.publish("hello")

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

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

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

๐Ÿ’  Sponsorship

Looking for sponsors. Sponsoring I will enable us to:

  • Purchase smartphones or peripheral devices for testing purposes.
  • Pay for testing on a specific streaming service or for testing on mobile lines.
  • Potentially private use to continue the OSS development

If you use any of our libraries for work, see if your employers would be interested in sponsorship. I have some special offers.ใ€€I would greatly appreciate. Thank you.

  • If you request I will note your name product our README.
  • If you mention on a discussion, an issue or pull request that you are sponsoring us I will prioritise helping you even higher.

ใ‚นใƒใƒณใ‚ตใƒผใ‚’ๅ‹Ÿ้›†ใ—ใฆใ„ใพใ™ใ€‚ๅˆฉ็”จ็”จ้€”ใจใ—ใฆใฏใ€

  • ใƒ†ใ‚นใƒˆ็›ฎ็š„ใงใ€ใ‚นใƒžใƒผใƒˆใƒ•ใ‚ฉใƒณใฎ่ณผๅ…ฅใ‚„ๅ‘จ่พบๆฉŸๅ™จใฎ่ณผๅ…ฅใ‚’่กŒใ„ใพใ™ใ€‚
  • ็‰นๅฎšใฎใ‚นใƒˆใƒชใƒผใƒŸใƒณใ‚ฐใ‚ตใƒผใƒ“ใ‚นใธใฎใƒ†ใ‚นใƒˆใฎๆ”ฏๆ‰•ใ„ใ‚„ใ€ใƒขใƒใ‚คใƒซๅ›ž็ทšใงใฎใƒ†ใ‚นใƒˆใฎๆ”ฏๆ‰•ใ„ใซๅˆฉ็”จใ—ใพใ™ใ€‚
  • ่‘—ๆ›ธใฎOSS้–‹็™บใ‚’็ถ™็ถš็š„ใซ่กŒใ†็‚บใซ็ง็š„ใซๅˆฉ็”จใ™ใ‚‹ๅฏ่ƒฝๆ€งใ‚‚ใ‚ใ‚Šใพใ™ใ€‚

ใ“ใฎใƒฉใ‚คใƒ–ใƒฉใƒชใƒผใ‚’ไป•ไบ‹ใง็ถ™็ถš็š„ใซๅˆฉ็”จใ—ใฆใ„ใ‚‹ๅ ดๅˆใฏใ€ใœใฒใ€‚้›‡็”จไธปใซใ€ใ‚นใƒใƒณใ‚ตใƒผใซ่ˆˆๅ‘ณใŒใชใ„ใ‹็ขบ่ชใ„ใŸใ ใ‘ใ‚‹ใจๅนธใ„ใงใ™ใ€‚ใ„ใใคใ‹็‰นๅ…ธใ‚’็”จๆ„ใ—ใฆใ„ใพใ™ใ€‚

  • README.mdใธใฎไผๆฅญใƒญใ‚ดใฎๆŽฒ่ผ‰
  • Issueใ‚„Pull Requestใฎๅ„ชๅ…ˆ็š„ใชๅฏพๅฟœ

Sponsorship

๐Ÿ“– Reference

๐Ÿ“œ License

BSD-3-Clause

GitHub

link
Stars: 2574
Last commit: 23 hours ago
jonrohan Something's broken? Yell at me @ptrpavlik. Praise and feedback (and money) is also welcome.

Dependencies

Related Packages

Release Notes

1.6.0
6 days ago

This is a release for Xcode 15. The minimum supported versions for iOS and tvOS will be 12.0. There are some changes to certain methods, but the core functionality remains the same as in version 1.5.8.

Related issues

What's Changed

Full Changelog: https://github.com/shogo4405/HaishinKit.swift/compare/1.5.8...1.6.0

Swiftpack is being maintained by Petr Pavlik | @ptrpavlik | @swiftpackco | API | Analytics