RTSP ライブストリーミング
デバイスの RTSP セッションを開始し、コールバックで通知されるホットスポットフローを進め、返された RTSP アドレスを対応プレイヤーへ渡します。
Animated workflow
RTSP の起動と再生
RTSP の起動は、デバイスと Wi-Fi にまたがる複数段階のフローです。各段階を表示し、途中の成功を最終成功として扱わないでください。
前提条件
- デバイスが接続済みで使用可能な状態にあり、
LiveStreamingAPIに準拠していること。 supportsRTSPLiveStreamingがtrueであること。- SDK が管理するデバイスホットスポット接続フローにアプリが対応していること。
- 下記の SDK RTSP プレイヤーを使用する場合は
AIBudsLiveStream.xcframeworkを追加すること。
API Reference
フレームワーク
AIBuds.xcframework、AIBudsFoundation.xcframework、必要に応じて AIBudsLiveStream.xcframework
インポート
- Swift
- Objective-C
import AIBuds
import AIBudsFoundation
import AIBudsLiveStream#import <AIBuds/AIBuds-Swift.h>
#import <AIBuds/AIBuds.h>
#import <AIBudsFoundation/AIBudsFoundation-Swift.h>
#import <AIBudsLiveStream/AIBudsLiveStream-Swift.h>プロパティ
- Swift
- Objective-C
/// Whether RTSP live streaming is supported
var supportsRTSPLiveStreaming: Bool { get }/// Whether RTSP live streaming is supported.
@property(nonatomic, readonly) BOOL supportsRTSPLiveStreaming;インスタンスメソッド
- Swift
- Objective-C
/// Start RTSP live streaming
/// - Parameters:
/// - params: RTSP stream parameters
/// - configureHotspotStartingHandler: Configure hotspot starting handler
/// - hotspotConfigureCompletionHandler: Hotspot configure completion handler
/// - enterLiveStreamingModeStartingHandler: Enter live streaming mode starting handler
/// - enterLiveStreamingModeCompletedHandler: Enter live streaming mode completed handler
/// - waitingForHotspotOpenHandler: Waiting for hotspot open handler
/// - connectDeviceHotspotStartingHandler: Connect device hotspot starting handler
/// - deviceHotspotConnectCompletionHandler: Device hotspot connect completion handler
/// - rtspAddressReceivedHandler: RTSP address received handler
/// - sessionStartCompletionHandler: Session start completion handler
/// - sessionFinishHandler: Session finish handler
func startRTSPLiveStreaming(
withParams params: RTSPStreamParams,
configureHotspotStartingHandler: AIBudsLiveStreamingConfigureHotspotStartingHandler?,
hotspotConfigureCompletionHandler: AIBudsLiveStreamingHotspotConfigureCompletionHandler?,
enterLiveStreamingModeStartingHandler: AIBudsEnterLiveStreamingModeStartingHandler?,
enterLiveStreamingModeCompletedHandler: AIBudsEnterLiveStreamingModeCompletionHandler?,
waitingForHotspotOpenHandler: AIBudsLiveStreamingStartingToWaitForHotspotOpenHandler?,
connectDeviceHotspotStartingHandler: AIBudsLiveStreamingConnectDeviceHotspotStartingHandler?,
deviceHotspotConnectCompletionHandler:
AIBudsLiveStreamingDeviceHotspotConnectCompletionHandler?,
rtspAddressReceivedHandler: AIBudsLiveStreamingRtspAddressReceivedHandler?,
sessionStartCompletionHandler: AIBudsLiveStreamingSessionStartCompletionHandler?,
sessionFinishHandler: AIBudsLiveStreamingSessionFinishHandler?
)/// Start RTSP live streaming
/// - Parameters:
/// - params: RTSP stream parameters
/// - configureHotspotStartingHandler: Configure hotspot starting handler
/// - hotspotConfigureCompletionHandler: Hotspot configure completion handler
/// - enterLiveStreamingModeStartingHandler: Enter live streaming mode starting handler
/// - enterLiveStreamingModeCompletedHandler: Enter live streaming mode completed handler
/// - waitingForHotspotOpenHandler: Waiting for hotspot open handler
/// - connectDeviceHotspotStartingHandler: Connect device hotspot starting handler
/// - deviceHotspotConnectCompletionHandler: Device hotspot connect completion handler
/// - rtspAddressReceivedHandler: RTSP address received handler
/// - sessionStartCompletionHandler: Session start completion handler
/// - sessionFinishHandler: Session finish handler
- (void)startRTSPLiveStreamingWithParams:(AIBudsRTSPStreamParams *)params
configureHotspotStartingHandler:
(AIBudsLiveStreamingConfigureHotspotStartingHandler _Nullable)
configureHotspotStartingHandler
hotspotConfigureCompletionHandler:
(AIBudsLiveStreamingHotspotConfigureCompletionHandler _Nullable)
hotspotConfigureCompletionHandler
enterLiveStreamingModeStartingHandler:(AIBudsEnterLiveStreamingModeStartingHandler _Nullable)
enterLiveStreamingModeStartingHandler
enterLiveStreamingModeCompletedHandler:(AIBudsEnterLiveStreamingModeCompletionHandler _Nullable)
enterLiveStreamingModeCompletedHandler
waitingForHotspotOpenHandler:
(AIBudsLiveStreamingStartingToWaitForHotspotOpenHandler _Nullable)
waitingForHotspotOpenHandler
connectDeviceHotspotStartingHandler:
(AIBudsLiveStreamingConnectDeviceHotspotStartingHandler _Nullable)
connectDeviceHotspotStartingHandler
deviceHotspotConnectCompletionHandler:
(AIBudsLiveStreamingDeviceHotspotConnectCompletionHandler _Nullable)
deviceHotspotConnectCompletionHandler
rtspAddressReceivedHandler:(AIBudsLiveStreamingRtspAddressReceivedHandler _Nullable)
rtspAddressReceivedHandler
sessionStartCompletionHandler:
(AIBudsLiveStreamingSessionStartCompletionHandler _Nullable)
sessionStartCompletionHandler
sessionFinishHandler:
(AIBudsLiveStreamingSessionFinishHandler _Nullable)sessionFinishHandler;startRTSPLiveStreaming と RTSPStreamParams を参照してください。
RTSP パラメーター
| プロパティ | 意味 |
|---|---|
bitrate | Mbps 単位。0 はデバイスの既定値を要求します。 |
qualityFactor | 0 は可逆品質を要求し、値が大きいほど圧縮率が上がります。 |
iFrameInterval | I フレームまでの P/B フレーム数。値が大きいほど圧縮率が上がります。 |
現在の SDK では、これらの値についてデバイス共通の 0 以外の範囲を公開していません。対象デバイスの契約で対応値が提供されない限り、RTSPStreamParams.default を使用してください。
使用例
セッション全体でプレイヤーを保持します。例ではすべてのフローコールバックを使用し、有効な RTSP URL を受信してから再生を開始します。
- Swift
- Objective-C
let player = LiveStreamingPlayer()
player.addVideoView(to: videoContainerView)
guard let streamingDevice = device as? LiveStreamingAPI,
streamingDevice.supportsRTSPLiveStreaming
else { return }
streamingDevice.startRTSPLiveStreaming(
withParams: .default,
configureHotspotStartingHandler: { showStage("Configuring hotspot") },
hotspotConfigureCompletionHandler: { success, error in
showStage(
success
? "Hotspot configured"
: error?.localizedDescription ?? "Hotspot configuration failed")
},
enterLiveStreamingModeStartingHandler: { showStage("Entering live-stream mode") },
enterLiveStreamingModeCompletedHandler: { success, error in
showStage(
success
? "Live-stream mode entered" : error?.localizedDescription ?? "Mode entry failed")
},
waitingForHotspotOpenHandler: { showStage("Waiting for device hotspot") },
connectDeviceHotspotStartingHandler: { ssid in showStage("Connecting to \(ssid)") },
deviceHotspotConnectCompletionHandler: { success, error in
showStage(
success
? "Device hotspot connected"
: error?.localizedDescription ?? "Hotspot connection failed")
},
rtspAddressReceivedHandler: { address in
guard let url = URL(string: address), url.scheme?.lowercased() == "rtsp" else { return }
let source = VideoSource(url: url, videoType: .normal)
source.isLiveStream = true
player.play(source: source)
},
sessionStartCompletionHandler: { success, error in
setStreamingActive(success)
if let error { show(error) }
},
sessionFinishHandler: { userStopped, error in
player.stop()
setStreamingActive(false)
handleFinish(userStopped: userStopped, error: error)
}
)self.mediaPlayer = [[AIBudsLiveStreamingPlayer alloc] init];
[self.mediaPlayer addVideoViewToView:self.videoContainerView];
id<AIBudsLiveStreamingAPI> streamingDevice = (id<AIBudsLiveStreamingAPI>)self.device;
if (![streamingDevice conformsToProtocol:@protocol(AIBudsLiveStreamingAPI)] ||
!streamingDevice.supportsRTSPLiveStreaming) {
return;
}
__weak typeof(self) weakSelf = self;
[streamingDevice startRTSPLiveStreamingWithParams:[AIBudsRTSPStreamParams defaultParams]
configureHotspotStartingHandler:^{
[weakSelf showStage:@"Configuring hotspot"];
}
hotspotConfigureCompletionHandler:^(BOOL success, NSError *error) {
[weakSelf handleStageResult:success error:error];
}
enterLiveStreamingModeStartingHandler:^{
[weakSelf showStage:@"Entering live-stream mode"];
}
enterLiveStreamingModeCompletedHandler:^(BOOL success, NSError *error) {
[weakSelf handleStageResult:success error:error];
}
waitingForHotspotOpenHandler:^{
[weakSelf showStage:@"Waiting for device hotspot"];
}
connectDeviceHotspotStartingHandler:^(NSString *ssid) {
[weakSelf showStage:[NSString stringWithFormat:@"Connecting to %@", ssid]];
}
deviceHotspotConnectCompletionHandler:^(BOOL success, NSError *error) {
[weakSelf handleStageResult:success error:error];
}
rtspAddressReceivedHandler:^(NSString *address) {
NSURL *url = [NSURL URLWithString:address];
if (![url.scheme.lowercaseString isEqualToString:@"rtsp"])
return;
AIBudsVideoSource *source =
[[AIBudsVideoSource alloc] initWithUrl:url
videoType:AIBudsLiveStreamingVideoTypeNormal];
source.isLiveStream = YES;
[weakSelf.mediaPlayer playWithSource:source];
}
sessionStartCompletionHandler:^(BOOL success, NSError *error) {
[weakSelf setStreamingActive:success];
if (error)
[weakSelf showError:error];
}
sessionFinishHandler:^(BOOL userStopped, NSError *error) {
[weakSelf.mediaPlayer stop];
[weakSelf setStreamingActive:NO];
[weakSelf handleFinishUserStopped:userStopped error:error];
}];エラー処理
ホットスポット設定、モード移行、ホットスポット接続、セッション開始、プレイヤー失敗、ユーザー操作以外の終了を、それぞれ別の失敗点として扱います。途中のコールバック成功は、後続段階や再生の成功を保証しません。
注意事項
- SDK は RTSP アドレスを非同期で返します。推測でデバイス URL を組み立てないでください。
- RTSP 再生中は、iPhone がデバイスのホットスポットへ接続し続ける必要があります。
- Demo では受信した RTSP ソースを
LiveStreamerで RTMP へ中継できます。これは独立した配信ライフサイクルで、アプリが用意した RTMP URL が必要です。