ページ 11

ボイスチャットと画像送信をDXLibで

Posted: 2011年12月09日(金) 19:46
by 史上最悪のデスペナ
こちらでかつて質問して以来チャット関係はご無沙汰しており、いまだ
クライアントA ――― ルータ ――― インターネット ――― ルータ ――― クライアントB
というのが作れてませんが、疑問に思ったので質問です。
ボイスチャット(以下ボイチャ)や画像送信はどうやるのでしょうか?
全く方法が思いつきません。同じ「1」「0」で表されるものですが、
画像のほうはまだ例えばバイナリ化して先頭から順に送っていって相手側で繋げて拡張子を元に戻すというのが思いつきましたが(だからといってやり方は分からない)、ボイスのほうは(間違っているにしろ)見当すら付きません。

考え方だけでも良いので教えていただけないでしょうか?

Re: ボイスチャットと画像送信をDXLibで

Posted: 2011年12月09日(金) 19:50
by beatle
音の伝送は原理を言えば、一定のサンプリング周期で録音した電圧値を送ればできます。
例えばよく見るサンプリング周波数は44.1KHzなどがありますが、これは1秒に44100回だけ
マイク(音源)から電圧を読み取ってくるということを示します。
その読み取った電圧を相手先に送ってやって、また1秒に44100回だけスピーカーに流してやれば
音が再生できます。

Re: ボイスチャットと画像送信をDXLibで

Posted: 2011年12月09日(金) 22:27
by softya(ソフト屋)
音の原理を勉強されたほうが良いと思いますが音は瞬間で見ると音圧=音の大きさです。これの連続変化が音声や音楽となります。
パソコン上の扱いはPCM(パルス符号変調)で音の大きさをデジタルデータ化したものを1秒間に数千回以上記録されたものです。

「パルス符号変調 - Wikipedia」
http://ja.wikipedia.org/wiki/%E3%83%91% ... 9%E8%AA%BF

音の大きさを16ビットや8ビットで表される数値に変換して取り扱います。
更に音質や上限周波数が変わりますが大体8000回/秒から192000回/秒ぐらいのサンプリング周期で数値データを得ます。
音声だけを考えれば秒間4000回=上限周波数2000Hzでも何とかなります。

「サンプリング周波数 - Wikipedia」
http://ja.wikipedia.org/wiki/%E3%82%B5% ... 2%E6%95%B0

これが音声データですので、これをネットパケットに分割して相手に送りつけて相手側で順に再生してやれば音は再生できることになります。

Re: ボイスチャットと画像送信をDXLibで

Posted: 2011年12月09日(金) 23:27
by shiro4ao
DXlibでできるのかはわからないのですが、音の仕組みとか詳しいことを抜きにして
WinAPIを使うのであれば、
waveInOpen関数とかで、デバイスから音をバッファに貯める
ある程度溜まったら相手に送ります。
貰った側はwaveOutOpen関数とかで、データをそのまま、再生してやれば出来ました。
自分が昔やったときはそんな感じでした。
ただ、音が途切れがちになったり、同じ音にエコーがかかったような感じになったりして、
うまくいかなくなりました。ダブルバッファリングとかして現実的なレベルまで完成度を上げる必要がありそうです。
ただし、ボイスチャットは遅延が大きな問題になるのでUDPで作ったほうがよさそうです。

「クライアントA ――― ルータ ――― インターネット ――― ルータ ――― クライアントBというのが作れてませんが」
という部分が気になったのですが、基本的にはルーターの設定ができていないと
(特別な場合を除いて)通信できないので、プログラムの問題ではないような気がします。
誤解してたらすみません。

Re: ボイスチャットと画像送信をDXLibで

Posted: 2011年12月10日(土) 00:52
by softya(ソフト屋)
そういえば前のやり取りの中で抜けいた点で
クライアントA ――― ルータ ――― プロバイダ(グローバルIP-A) ――― インターネット  ――― プロバイダ(グローバルIP-B) ――― ルータ ――― クライアントB
となっていないと通信できませんので個人一人だけでテストすることはこの形では不可能です。グローバルIP-AとグローバルIP-Bは違っていないといけません。

あるいは、
クライアントA ―――> ルータ ―――> プロバイダ(グローバルIP-A) ―――> インターネット  ―――> レンタルサーバー(受信)
クライアントB <――― ルータ <――― プロバイダ(グローバルIP-A) <――― インターネット  <――― レンタルサーバー(送信)
とすればクライアントAとクライアントBを同じPCで動かすことは可能です。

[追記]
そういえば最終目標はMMORPGですよね。
だとすると音声は必要最低限の音質でパケット量を減らす必要性と動画や画像の通信はほぼ不可能だと思います。
それより他のユーザーとのゲーム状況のすり合わせの通信を優先する必要がありますからね。

Re: ボイスチャットと画像送信をDXLibで

Posted: 2011年12月10日(土) 11:57
by 史上最悪のデスペナ
判った気になったような気がします。まあ、出来るかどうかは別ですけどね^^;
皆さんに教えていただいた考え方でやってみようと思います。
shiro4ao さんが書きました:「クライアントA ――― ルータ ――― インターネット ――― ルータ ――― クライアントBというのが作れてませんが」
という部分が気になったのですが、基本的にはルーターの設定ができていないと
(特別な場合を除いて)通信できないので、プログラムの問題ではないような気がします。
誤解してたらすみません。
えっと、リンク先で解決した時点では2台のPCの有線接続でしか文字列送信が出来ておらず、それ以来通信関係に全く手を着けていなかったので
未だ2台のPCの有線接続でしかプログラムの動かせません。
というだけの話です。質問には全然(?)関係ないので書く必要ありませんでしたね^^;
softya(ソフト屋) さんが書きました: [追記]
そういえば最終目標はMMORPGですよね。
だとすると音声は必要最低限の音質でパケット量を減らす必要性と動画や画像の通信はほぼ不可能だと思います。
それより他のユーザーとのゲーム状況のすり合わせの通信を優先する必要がありますからね。
ただの自己満足なので仮にサイトとか作ったとしても、知り合いと、作品お披露目掲示板で告知したのを見て来てくださった方、サイトにたどり着いた迷い人しかおそらくプレイしないので、私がMMORPGに対して持ってる「こんな機能があればいいのにな」というのをふんだんに詰め込んでやろうかと^^;
人数が少なければそこまで処理が大変じゃないでしょうし。(推定人数=20人)
それに、仮に盛り込めなくてもプログラムを組んでおけばいつか流用して役に立つときが来るかもしれませんし。(スカイプ代わりにちゃちゃっと組んだりとか)

Re: ボイスチャットと画像送信をDXLibで

Posted: 2011年12月10日(土) 12:30
by softya(ソフト屋)
音声のやり取りはサーバーを介しないで直接UDPパケットでやりとりすることを考えた方が良い出でしょうね。あと、ゲームのデータ・パケットもUDPでしょうから同時にやったほうが良いでしょう。それにUDPパケットをやり取りするルータのポートを自動で開けるためにuPnPも勉強したほうが良いでしょう。