Edited at

iOSでRTMPライブ配信

More than 1 year has passed since last update.


はじめに

iOS用にRTMP対応のライブラリーをNew BSDライセンスで公開しています。この記事ではライブラリーの紹介と使い方について記載していきます。


ライブラリーについて

ライブラリーの基本情報は次の通りです。

-
内容

ライブラリー名
HaishinKit(旧lf)

開発言語
Swift

サポートOS
iOS8.0以上, macOS 10.11以上

公開先
https://github.com/shogo4405/lf.swift

ライセンス
New BSD


基本機能

iOSのほか、macOSにも対応しています。


  • カメラ・マイクを使ってのライブ配信

  • スクリーンキャプチャしながらのライブ配信

  • CIFFilterを使ったフィルタリング効果

  • ハードウェアでのH264, AACエンコード

  • RTMPのサポート


    • AMF0のサポート

    • SharedObjectのサポート

    • RTMP認証のサポート




ライブラリーの使い方


インストール

 CocoaPodsに対応しているのでPodfileに次のコードを追加してください。

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

use_frameworks!

def import_pods
pod 'lf', '~> 0.5.0'
end

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

Carthageにも対応しました。

github "shogo4405/lf.swift" ~> 0.5.0


サンプルアプリケーション

iOS, macOS向けにそれぞれサンプルアプリケーションを用意しています。git cloneした後にlf.xcodeprojを開いてビルドターゲットExample iOSかExample macOSを選んでください。

https://github.com/shogo4405/lf.swift.git 

cd lf.swift
carthage update


基本的な使い方


カメラとマイクの追加

let rtmpStream = RTMPStream(rtmpConnection: rtmpConnection)

rtmpStream.attachAudio(AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeAudio))
rtmpStream.attachCamera(AVCaptureSessionManager.deviceWithPosition(.Back))


スクリーンキャプチャ

アプリケーションの動作検証に使えそうな機能です。

let rtmpStream = RTMPStream(rtmpConnection: rtmpConnection)

rtmpStream.attachScreen(ScreenCaptureSession())


RTMPの認証

RTMP認証(Adobe方式)に対応しています。URIの箇所に次のようにusernameとpasswordを渡すことで認証情報が渡ります。

let connection = RTMPConnection()

connection.connect("rtmp://username:password@test.com/live")


カスタムフィルターの追加

CIFilterでのフィルタリングに対応しています。このフィルターの仕組みを使うと今のところCPU使用率が40〜50%くらい(iPhone5s)になります。(GPUレンダリングを使って負荷軽減予定)

// VisualEffectクラスを継承する。

final class SepiaEffect: VisualEffect {
let filter:CIFilter? = CIFilter(name: "CISepiaTone")

override func execute(image: CIImage) -> CIImage {
guard let filter:CIFilter = filter else {
return image
}
filter.setValue(image, forKey: "inputImage")
filter.setValue(0.8, forKey: "inputIntensity")
return filter.outputImage!
}
}

let rtmpStream = RTMPStream(rtmpConnection: rtmpConnection)
stream.registerEffect(SepiaEffect())


再生機能

ベーター段階ですがシュミレーターレベルでの再生も...

let connection = RTMPConnection()

let rtmpStream = RTMPStream(rtmpConnection: connection)
rtmpConnection.addEventListener(Event.RTMP_STATUS, selector:"rtmpStatusHandler:", observer: self)
connection.connect("rtmp://username:password@test.com/live")

func rtmpStatusHandler(notification:NSNotification) {
let e:Event = Event.from(notification)
if let data:ASObject = e.data as? ASObject , code:String = data["code"] as? String {
switch code {
case RTMPConnection.Code.ConnectSuccess.rawValue:
rtmpStream!.play(streamName)
default:
break
}
}
}