「通話」サービス-Odnoklassniki Webサイトでのビデオチャットは、Flashを使用して実装されます。 しかし、すべてのユーザーがコンピューター/ラップトップからOdnoklassnikiにアクセスするわけではありません。 ビデオチャットの視聴者を拡大するために、スマートフォンでもサポートすることにしました。
この記事では、iOSのアプリケーションにビデオコールを実装した経験について説明します。
アプリケーションのスキーム:
オーディオ/ビデオエンコーダーとデコーダー
ビデオキャプチャモジュール
バージョン4.0以降、iOSには生のビデオをキャプチャするためのAPI(AVCaptureSession)があります。 ただし、このAPIには制限があります。特に、任意の解像度を設定することはできません(いくつかの固定プリセットがサポートされています)。 また、デバイスを回転させるときにビデオの向きを変更することもできません。 これらの制限を回避するために、必要以上のサイズのビデオフレームをキャプチャし、デバイスの向きに応じてビデオをカットおよび回転します。 これは非常に多くのプロセッサリソースを消費し、望ましくないズーム効果(「ズーム」)がありますが、このようなAPIの実装についてAppleに感謝するだけです。
ビデオは、ネイティブコーデック形式のYUVでキャプチャされます。 この点で、画面に「自分の」写真を表示するための「レンダリング」フレームの問題が発生します。 私たちもそれを決定しましたが、その詳細については、後ほど「ビデオを画面に表示する」セクションで説明しました。
言及する価値のあるもう1つの機能は、カメラ選択アルゴリズムです。デバイスにフロントカメラがある場合、アプリケーションはそれを選択します。 前面カメラがない場合、ビデオは背面カバーのカメラからキャプチャされます。 カメラがまったくない場合(iPadなど)、「ビデオを有効にする」ボタンは表示されません。
画面にビデオを表示する
ビデオデコーダー、およびカメラからのビデオキャプチャモジュールは、YUV形式でフレームを出力します。 デバイスの画面にフレームを表示するには、フレームをRGB形式に変換し、目的のサイズにする必要があります。 現在、メインプロセッサは他のタスクでビジーであるため、OpenGL ES 2.0を使用してこれらの操作をGPUに転送しました。 YUV形式のフレームはOpenGLテクスチャにロードされ、その後フラグメントシェーダーは各ポイントの色成分を再カウントします。 OpenGL ES 2.0をサポートしない古いデバイス(3GS未満)をサポートするために、アプリケーションにはシェーダーを使用せずにすべての計算を実行するコードブランチがあります。 そのようなデバイスでは、ビデオフレームレートを下げることで処理能力の不足を補う必要があります。
サウンドをキャプチャして再生する
マイクからサウンドをキャプチャしてスピーカーで再生するには、AudioSession APIを使用します。これはiOSアプリケーションからアクセスできる最低レベルのAPIです。 サーバーから送られてくる音はデコードされ、バッファに落ちます。これにより、ネットワークの「ジッター」が滑らかになります。 バッファの深さは、接続の品質によって異なります-ネットワークが悪いほど、バッファは深くなります。 ユーザーにとって、これは、悪いネットワークでは音声遅延が増加するという事実に現れています。
iPhoneには、サウンドを再生するためのルートがいくつかあります。電話のスピーカー、スピーカーフォン(デバイスの下部にあるスピーカー)、または接続されたヘッドセットから再生できます。 ヘッドセットが接続されていない場合、スピーカーフォンルートがデフォルトで選択されます。 近接センサーがトリガーされると、電話のスピーカーが接続されます。
マルチタスク
バージョン
近接センサーを使用する
近接センサーは、電話の前面の上部に取り付けられたセンサーで、デバイスとオブジェクトの近接を判断します。 アイデアは、ユーザーがいつ電話を耳に当てるかを判断することです。 ビデオコール中、アプリケーションはこのセンサーのステータスを監視します。 センサーの場合、アプリケーションは画面を消し、ビデオの受信と送信をオフにし、音声を電話のスピーカーに切り替えます。 これは、電話で「昔ながらの方法で話したい」というユーザーにとって便利です。
通話品質への適応
アプリケーションのビデオ通話は、WIFIと3G / EDGEネットワークの両方で使用できます。 通話中、ネットワーク接続のステータスは常に監視され、通信の品質が低下した場合、フレームレートとビデオ品質が低下します。
改善したいこと
- 会話中にクラスメートアプリケーションの残りを使用できるようにする
- 中断が発生した場合の自動再接続(たとえば、
Wi-Fi / 3G ネットワーク間の切り替え時) - ARMプロセッサのコード最適化をより広範囲に使用して、呼び出し中のプロセッサの負荷とバッテリーの消耗を減らします。
サービスの改善に関するご意見やご提案をお待ちしております。
Callsサービスの開発チーム。