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 と言えばいいのか? 長いので略称が欲しい

ムカシ×ムカシ X (講談社ノベルス)

なんとなく、こういうときに人間は、死にたくなるんじゃないだろうか、と考えてしまった。今の自分は大丈夫だが、危ないときもあったな、と思い出す。死ぬのは、本当に簡単なことなのだ。少なくとも生きることに比べたら、短い決意とほんのちょっとの勇気で実現する。それよりも、だらだらと傷つきながら生きながらえる方を選ぶなんて、いったいどういう了見だろうか、と思わないでもない。

今じゃなくても良いよ。以前でも、もっと昔でも、実在する人物で、名探偵っていう人、誰かいる? 歴史上の人物で、そういう人って、ただの一人もいないよね。大泥棒とかならいるのに……。だから、なんていうか、名探偵という人物が出てくるだけで、もうリアリティがないんだよね。現実離れしすぎているわけ。名探偵が登場したら、もうSFだよ」

たぶん、自分の今の気持ちは、以前のパートナを椙田に重ねて見ている結果なのだ。それが、本当のところだろう。でも、そちらへは考えないようにしている。考えるだけで涙が出るし、そんな健気な自分が、あまり好きではなかったからだ。こんな生き方しかできないのだから、好きも嫌いもないのだが、とにかく、嫌いな自分には触らないように、騙し騙し生きているといえる。