native webrtc で動画や音声のデータにアクセスする

通常のビデオチャットのような使用用途で native webrtc を用いる場合 *1、動画を表示する view などが sdk レベルで提供されているので、そのまま使えば良い。(音声データは中で複数音声をミキシングなどしてよしなに再生するところまでやっている)ただ、例えばストリームごとの動画や音声のデータにアクセスする場合は少し工夫する必要があります( ios のクラス名でここから書きます )

ios のクラス名動画の場合は sdk で提供されている RTCVideoTrackaddRenderer を使えば良い。これは RTCEAGLVideoView でも使われている。

RTCVideoRenderer を実装すると RTCVideoFrame にアクセスできるので、それを使ってアクセスすれば動画の一コマの情報が取れる。通常 i420 フォーマットの状態なのでよしなに変換する必要がある。

音声の場合 ( RTCAudioTrack ) は webrtc 側でよしなにやっているせいか sdk レベルでは提供されていないので RTCAudioTrack+Private.h で定義されている webrtc::AudioTrackInterface にアクセスし addSink を用いて音声データにアクセスする必要がある。 AudioTrackSinkInterface を実装すると、データやサンプルレートなどが渡ってくるのでそれを元に色々行える。(なぜ video 側は VideoFrame なのに、audio 側は個別のデータなのか不明。また個別のデータに時刻情報がない。 AudioFrame 自体は存在しているのに!)

フレーム数、サンプルレート等固定ではないようなので、ios で録音等する場合は必要に応じてサンプリング等してから行う必要がある。

また最近はビルドするのも簡単で ios のことだけを考えるのであれば webrtc/build/ios/build_ios_framework.sh を実行するだけで大体良い。(そのうち cocoapods から入れられるようになる模様)

*1: これのことを libwebrtc と言えばいいのか? 長いので略称が欲しい