タイムスタンプ付ストリームI/Oに よる音の実時間処理 栗田 亮 (東工大) 千葉 滋 (東工大) 光来 健一 (NTT未来ねっと研究所) 1 タイミングが重要な音の処理 自動伴奏システム ソリストに対しコンピュータが伴奏を合わせる ソリストのメロディーの入力に対し伴奏データを出力で返す 入出力をリアルタイムに処理する必要がある ♪ OUT IN メロディー 解析 伴奏データ 音程、音量、 作成 テンポ、etc ♪ 伴奏 2 音の入出力処理 Linuxカーネルにおける音の録音 サウンドデバイスにアクセスして行う A/Dコンバータ・・・アナログ・デジタル変換器 割り込み・・・カーネルバッファにデジタルデータが格納される read()・・・カーネルバッファからアプリケーションバッファへサウ ンドデータをコピー kernel application buffer アナログデータ buffer A/D 再生の場合は逆の流れ 3 音の処理のミス 原因 その1: ハードウェア~カーネル間でのデータ損失 → アナログ音の録音再生では高負荷時でもめったに起 きない 割り込みの衝突は少ない その2: カーネル~アプリケーション間の転送の遅れ ハードウェア~カーネル間の転送レートについていけなくなり、 バッファリングでミスが生じる OSに大きな負荷がかかると生じる 4 2つの処理ミス 音飛び 録音時に発生し、一部のデータが抜け落ちる カーネルバッファが一杯になって生じる 9 8 7 4 3 2 1 6 5 途切れ 9 8 7 4 3 2 1 アプリケーションへ カーネル 再生時に発生し、再生が一時止まる カーネルバッファが空になって生じる 7 8 9 1 2 3 4 5 6 5 ハードウェアへ 再生STOP カーネル 従来のLinux Linuxが備える実時間処理機能 優先度割り当て機能 指定したプロセスを優先して実行することが可能 問題点 完全な優先実行は不可能 優先度の高い処理が、優先度の低い処理やハードウェア割り 込みによって妨げられる場合がある 処理ミスに対処できない 処理ミスを検知する機能がないので対処できない 6 リアルタイムLinuxによる対処 既存のリアルタイムLinux リアルタイムスケジューラを用いる実時間処理システム ハードリアルタイム:RT-Linux, ART-Linuxなど ソフトリアルタイム:Linux-SRT, QLinuxなど 問題点 マルチメディア処理には不向き(ハードリアルタイム) ハードリアルタイムOSの応答性はあまり必要ではない 処理ミスに対処できない ユーザーの負担が大きい システムの肥大化 プログラミングが複雑 7 提案するシステム TS-I/O (Time Stamp - I/O) 入出力(I/O)のタイムスタンプを利用するシステム 処理ミスに対処する機能を提供 TS-I/Oでの入力処理 I/Oデータがバッファに格納された時刻を記録する 音飛びの検知が可能 タイムスタンプとデータサイズを比較する kernel buffer サウンド データ 時刻0 4 6 音飛び 10 タイム スタンプ 0..4 6..10 size=8 tsize application buffer buf tbuf 8 TS-I/Oでの出力処理(1) 再生中の処理ミスへの対処 間が発生した場合、それ以降のデータをとばす 時間軸に沿った再生が可能 application buffer 0 サウンド データ 5 7 kernel data0~5 buffer 7秒経過(2秒遅れ) data7~10 data5~10 0~5 play 5~7 no data! 7~10 play 9 TS-I/Oでの出力処理(2) タイムスタンプに従った再生処理 アプリケーションが渡したタイムスタンプに従って再生 録音時のミス(音飛び)に対処した再生が可能 application buffer size=8 音飛びした サウンド データ タイム スタンプ kernel buffer 0~5 play 5~7 wait… 0..5 7..10 7~10 play 10 TS-I/Oの利点 シンプルな設計 I/Oのみをリアルタイム化 マシンの性能に依存しない実時間処理を可能に カーネルレベルの処理 アプリケーションレベルではできない処理が可能 OS内のバッファリングでのミスの検知 全てのストリームに適応できる 全てのストリームにTS-I/Oを利用できれば、タイミング重視 のプログラムの作成は非常に楽 汎用ルーチンを作ることで実装できそう 11 追加システムコール read_gettbuf(fd,buf,tbuf,size,tsize) read(fd,buf,size)+タイムスタンプの取り出し デバイスからの録音データとタイムスタンプを返す tbuf・・・タイムスタンプを格納するバッファ tsize・・・タイムスタンプのサイズ write_puttbuf(fd,buf,tbuf,size,tsize) write(fd,buf,size)+タイムスタンプの転送 デバイスに再生データとタイムスタンプを送る 12 TS-I/Oの実装 デバイスドライバの関数に処理を追加 タイムスタンプの付加 割り込み処理関数 関数が呼ばれた際にタイムスタンプを取得する タイムスタンプを処理 read関数 タイムスタンプをアプリケーションに転送する write関数 タイムスタンプに従って、時間軸にそった同期再生を行う 再生処理中のミスに対して、その後のデータが時間軸にそう ように処理をとばす 13 実験 オーバーヘッドを測定 割り込み関数、read関数、write関数のオーバーヘッド 計算機:PentiumⅢ 733MHz, メモリ 512MB 処理にかかったクロックを測定 割り込み関数のオーバーヘッド 割り込み関数1回あたりのオーバーヘッドを測定 割り込み関数呼び出しの周期: 5333 μsec 結果: 2.3 μsec → 割り込み関数の呼ばれる周期内に納まる小さい値 14 read関数のオーバーヘッド 10秒のデータを数回のread関数に分けて録音し、1回あた りのタイムスタンプ転送の時間を測定 回数(1回あたりの時間) オーバーヘッド(μsec) 割合(%) 10000回(1msec) 3.2 0.32 1000回(10msec) 5.4 0.054 100回(100msec) 33.1 0.031 呼び出す回数が多いほどオーバーヘッドは大きい この時間だけバッファにデータがたまるが、この程度なら問 題ない 15 write関数のオーバーヘッド 10秒のデータを数回のwrite関数に分けて再生し、関数が1 回呼ばれてから終わるまでの処理時間を測定 今回はミスが起こらない場合のオーバーヘッドを測定 回数(1回あたりの時間) オーバーヘッド(μsec) 割合(%) 10000回(1msec) 8.8 0.88 1000回(10msec) 10.3 0.103 100回(100msec) 0 0 100回呼び出した場合、オーバーヘッドはほとんどなかった この時間だけバッファのデータが減っていくが、この程度な ら問題ない 16 ネットワークにおけるTS-I/O(1) TS-I/Oの拡張・・・UDPを利用するマルチメディ ア処理に関して パケットの損失の検知 メディア内、メディア間の同期 処理時間の制御 受信側のアプリケーションに処理開始時間を指定する → これらの処理をOSが自動的にしてくれる 17 ネットワークにおけるTS-I/O(2) QoS制御 バッファのデータが減ってきた場合、タイムスタンプをみてス トリームを優先的に処理 サーバからのストリームをバッファリングしながら再生する場 合に有効 アプリケーションではできない処理 サーバー クライアント タイムスタンプ Check! リングバッファ ♪ 出力 18 関連研究 アプリケーションレベルの実時間処理 MPEG 映像や音声の圧縮符号化方式 各パケットにタイムスタンプを含むヘッダーを付加する RTP(Real-time Transport Protocol) 映像や音声のストリーミングのためのプロトコル タイムスタンプなどを含むヘッダーを付加して送る 我々のTS-I/O 上の技術が提供する実時間処理をカーネルレベルで提供 する パケットの損失の検知、同期処理 19 実時間処理のレベルの比較 SOFT アプリケーション アプリケーション メディア内、メディア間の同期が可能 TS-I/O カーネルレベルの実時間処理 TS-I/O リアルタイムOS QoS制御 OS内のバッファリングミスの検知 リアルタイムOS リアルタイムスケジューリング HARD 20 まとめ TS-I/Oを提案 Linuxにおけるカーネルレベルでの実時間処理を可能にす る機能 今後の発展 TS-I/Oの拡張 ネットワークでのマルチメディア処理にTS-I/Oを適用 ルーチンの作成 現在、各デバイスドライバを書き換える設計 → 汎用ルーチンを作ることで、デバイスドライバへの変更をせ ずに処理を提供する予定 21
© Copyright 2024 ExpyDoc