OpusはXiph.Org Foundationによって開発されたオーディオコーデック規格で、IETFによってRFC 6716として標準化されています。音声と音楽の両方に対応し、低遅延リアルタイム通信を目的とした設計となっています。
ステレオ入力のモノラルエンコード処理
48kHzサンプリング、16bit量子化、ステレオPCMデータを入力として扱います。ステレオデータはインターリーブ形式(左-右-左-右...)で格納されています。
単純にチャネル数を1に設定してエンコード/デコードすると、音声に歪みが生じます:
// エンコード/デコードチャネル設定
int enc_channels = 1;
int dec_channels = 1;
この問題を解決するには、強制的にモノラルエンコードを行う設定が必要です:
#define INPUT_CHANNELS 2
int enc_channels = INPUT_CHANNELS;
int dec_channels = 1;
opus_encoder_ctl(enc_ctx, OPUS_SET_FORCE_CHANNELS(1));
APIドキュメントより:
/** エンコーダのモノ/ステレオ強制設定
* 入力形式に関わらずモノ/ステレオエンコードを強制
* @param x 設定値:
* OPUS_AUTO : 自動(デフォルト)
* 1 : モノ強制
* 2 : ステレオ強制 */
エンコード複雑度の性能測定
複雑度設定(0~10)による処理時間の変化を計測:
// 複雑度設定例
opus_encoder_ctl(enc_ctx, OPUS_SET_COMPLEXITY(5));
計測結果(48kHzステレオ入力):
複雑度 処理時間(s)
0 2.218
1 2.606
5 4.179
10 6.307
ビットレートと音質の関係
48kHzステレオ入力に対するビットレート変更の影響:
// ビットレート設定(bps単位)
int bitrate = 64000;
opus_encoder_ctl(enc_ctx, OPUS_SET_BITRATE(bitrate));
- 32kbps: 音声の歪みが顕著
- 64kbps: 許容範囲の品質
- 128kbps: 高品質再生
エンコードモードの比較
オーディオモード(CBR)
int app_type = OPUS_APPLICATION_AUDIO;
OpusEncoder* enc = opus_encoder_create(48000, 2, app_type, &error);
opus_encoder_ctl(enc, OPUS_SET_VBR(0)); // CBRモード
VOIPモード(CVBR)
int app_type = OPUS_APPLICATION_VOIP;
OpusEncoder* enc = opus_encoder_create(48000, 2, app_type, &error);
opus_encoder_ctl(enc, OPUS_SET_VBR(1)); // VBR有効
opus_encoder_ctl(enc, OPUS_SET_VBR_CONSTRAINT(1)); // 制約付きVBR
パケットロス耐性の評価
64kbps CVBRモードでのロス率シミュレーション:
int loss_percent = 10; // 0~100%
opus_encoder_ctl(enc, OPUS_SET_PACKET_LOSS_PERC(loss_percent));
- 0%: 正常再生
- 10%: 軽微な音声欠損
- 30%: 明瞭な欠損(許容範囲)
OpusはFEC(前方誤り訂正)技術により、パケットロス環境での耐性を向上させています。