ライブキャプション — Vonage Video iOS SDK (Swift)
OpenTok iOS SDK には、iOS クライアントが OpenTok セッション内でキャプションを送信および受信するためのメソッドが含まれています。
ライブキャプションは、セッション単位で以下の設定を通じて有効にする必要があります。 REST API.
ライブキャプションは、以下の場合にのみサポートされます。 ルーティングセッション.
このトピックには以下のセクションが含まれます:
ライブキャプションの公開
OpenTokのパブリッシャーは、以下の設定を行うことで、リアルタイムのライブキャプションの配信を開始または停止することができます。
publishCaptions プロパティを使用します:
publisher.publishCaptions = true
出版社がオーディオトラックを収録していない場合は [PublisherKit publisher:didFailWithError:]
メッセージが送信される。 code プロパティを OTPublisherMissingAudioTrack.
Vonage iOS SDKは、パブリッシャーが自身のキャプションのイベントを受信することをサポートしていません。スピーカー自身のキャプションをレンダリングするには、(パブリッシャーのストリームに) キャプションイベントをリッスンする隠しサブスクライバーを作成します。(次のセクションを参照してください)。
ライブキャプションを購読する
購読者は、次のように設定することで、キャプションの受信を開始または停止することができます。 subscribeToCaptions プロパティ
プロパティを使用します:
subscriber.subscribeToCaptions = true
このメソッドは、ストリームのパブリッシャーが現在ライブキャプションを公開しているかどうかに関係なく呼び出すことができます。 このメソッドを呼び出すことができます。サブスクライバは、パブリッシャがキャプションの発行を開始すると、 キャプションデータの受信を開始します。 サブスクライバーはキャプションデータの受信を開始します。
キャプションの受信を停止するには、プロパティを false:
subscriber.setSubscribeToCaptions = false
について OTSubscriberKitCaptionsDelegate(_:subscriber:caption:isFinal:) メッセージは
メッセージが送信される:
// OTSubscriberKitDelegate callbacks:
func subscriber(_ subscriber: OTSubscriberKit, caption text: NSString, isFinal final: Bool) {
// Display caption text in UI.
}
のキー・バリュー・オブザーバーを設定することができます。 hasCaptions OTStreamオブジェクトのプロパティ
プロパティを使用すると、ストリームでキャプションが有効になっているときと無効になっているときを確認できます。
//add observer on a stream of interest
let hasCaptionsObservation: NSKeyValueObservation = subscriber.stream.observe(\.hasCaptions, options: [.old, .new]) { object, change in
guard let oldValue = change.oldValue else { return }
guard let newValue = change.newValue else { return }
print("KVO change for \(subscriber.stream.streamId) hasCaptions: \(newValue)")
//manipulate GUI element
}
ライブキャプションの受信
Vonage Video API では、パブリッシャーが自身のキャプションに関するイベントを受信することはサポートされていません。話者自身のキャプションを表示するには、(ローカルパブリッシャーのストリームに対する)非表示のサブスクライバーを作成し、キャプションイベントをリッスンするようにしてください。 このサブスクライバーのビューを UI に表示したり、そのオーディオを購読したりしないでください(エコーを防ぐため)。その後、キャプションのテキストを UI に追加することができます。
Publisherではデフォルトでキャプションは公開されないため、 publishCaptions 出版社の所有物である true:
publisher = OTPublisher(delegate: self, settings: pubSettings!)
publisher?.publishCaptions = true
ストリームを OTPublisherKitDelegate(publisher, streamCreated) メソッドを使用する:
func publisher(_ publisher: OTPublisherKit, streamCreated stream: OTStream) {
// Add view
let pubView = self.publisher?.view
if(pubView != nil) // audio only publisher
{
ViewUtils.addViewFill(pubView!, rootView: self.publisherView!)
}
let subscriber = OTSubscriber(stream: stream, delegate: self)
subscriber.subscribeToAudio = false
subscriber.subscribeToVideo = true // typically should be false, but due to an existing bug in 2.25.3, it is set to true. Future versions will fix the issue.
subscriber.subscribeToCaptions = true
subscriber.captionsDelegate = self
do {
try self.session?.subscribe(subscriber)
} catch let error {
print("Error subscribing: \(error)")
}
selfPublisherStreamId = stream?.streamId
}
前述の通り、字幕を表示するには動画の購読が必要です。(この問題は今後のバージョンで修正される予定です。)
この例では、パブリッシャーのストリーム ID を selfPublisherStreamId 変数。ここでは、そのビューがUIに追加されないようにするために使用されています:
func subscriberDidConnect(toStream subscriberKit: OTSubscriberKit) {
if subscriber.stream.streamId == selfPublisherStreamId {
return // Don't show the self subscriber view.
}
// Show other subscribers in the UI
if let subsView = subscriber?.view {
subsView.frame = CGRect(x: 0, y: kWidgetHeight, width: kWidgetWidth, height: kWidgetHeight)
view.addSubview(subsView)
}
}
サブスクライバーは、以下のデリゲート内で(公開されたストリーム用の)文字起こしテキストを取得できます:
func onSubscriberCaptionText(_ subscriber: OpaquePointer!, caption_text: String!) {
// Adjust UI to show captions.
DispatchQueue.main.async {
if let s = self.views[subscriber] {
s.updateCaptionText(caption_text)
}
}
}