こちらでかつて質問して以来チャット関係はご無沙汰しており、いまだ
クライアントA ――― ルータ ――― インターネット ――― ルータ ――― クライアントB
というのが作れてませんが、疑問に思ったので質問です。
ボイスチャット(以下ボイチャ)や画像送信はどうやるのでしょうか?
全く方法が思いつきません。同じ「1」「0」で表されるものですが、
画像のほうはまだ例えばバイナリ化して先頭から順に送っていって相手側で繋げて拡張子を元に戻すというのが思いつきましたが(だからといってやり方は分からない)、ボイスのほうは(間違っているにしろ)見当すら付きません。
考え方だけでも良いので教えていただけないでしょうか?
ボイスチャットと画像送信をDXLibで
Re: ボイスチャットと画像送信をDXLibで
音の伝送は原理を言えば、一定のサンプリング周期で録音した電圧値を送ればできます。
例えばよく見るサンプリング周波数は44.1KHzなどがありますが、これは1秒に44100回だけ
マイク(音源)から電圧を読み取ってくるということを示します。
その読み取った電圧を相手先に送ってやって、また1秒に44100回だけスピーカーに流してやれば
音が再生できます。
例えばよく見るサンプリング周波数は44.1KHzなどがありますが、これは1秒に44100回だけ
マイク(音源)から電圧を読み取ってくるということを示します。
その読み取った電圧を相手先に送ってやって、また1秒に44100回だけスピーカーに流してやれば
音が再生できます。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: ボイスチャットと画像送信をDXLibで
音の原理を勉強されたほうが良いと思いますが音は瞬間で見ると音圧=音の大きさです。これの連続変化が音声や音楽となります。
パソコン上の扱いは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
これが音声データですので、これをネットパケットに分割して相手に送りつけて相手側で順に再生してやれば音は再生できることになります。
パソコン上の扱いは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
これが音声データですので、これをネットパケットに分割して相手に送りつけて相手側で順に再生してやれば音は再生できることになります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: ボイスチャットと画像送信をDXLibで
DXlibでできるのかはわからないのですが、音の仕組みとか詳しいことを抜きにして
WinAPIを使うのであれば、
waveInOpen関数とかで、デバイスから音をバッファに貯める
ある程度溜まったら相手に送ります。
貰った側はwaveOutOpen関数とかで、データをそのまま、再生してやれば出来ました。
自分が昔やったときはそんな感じでした。
ただ、音が途切れがちになったり、同じ音にエコーがかかったような感じになったりして、
うまくいかなくなりました。ダブルバッファリングとかして現実的なレベルまで完成度を上げる必要がありそうです。
ただし、ボイスチャットは遅延が大きな問題になるのでUDPで作ったほうがよさそうです。
「クライアントA ――― ルータ ――― インターネット ――― ルータ ――― クライアントBというのが作れてませんが」
という部分が気になったのですが、基本的にはルーターの設定ができていないと
(特別な場合を除いて)通信できないので、プログラムの問題ではないような気がします。
誤解してたらすみません。
WinAPIを使うのであれば、
waveInOpen関数とかで、デバイスから音をバッファに貯める
ある程度溜まったら相手に送ります。
貰った側はwaveOutOpen関数とかで、データをそのまま、再生してやれば出来ました。
自分が昔やったときはそんな感じでした。
ただ、音が途切れがちになったり、同じ音にエコーがかかったような感じになったりして、
うまくいかなくなりました。ダブルバッファリングとかして現実的なレベルまで完成度を上げる必要がありそうです。
ただし、ボイスチャットは遅延が大きな問題になるのでUDPで作ったほうがよさそうです。
「クライアントA ――― ルータ ――― インターネット ――― ルータ ――― クライアントBというのが作れてませんが」
という部分が気になったのですが、基本的にはルーターの設定ができていないと
(特別な場合を除いて)通信できないので、プログラムの問題ではないような気がします。
誤解してたらすみません。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: ボイスチャットと画像送信をDXLibで
そういえば前のやり取りの中で抜けいた点で
クライアントA ――― ルータ ――― プロバイダ(グローバルIP-A) ――― インターネット ――― プロバイダ(グローバルIP-B) ――― ルータ ――― クライアントB
となっていないと通信できませんので個人一人だけでテストすることはこの形では不可能です。グローバルIP-AとグローバルIP-Bは違っていないといけません。
あるいは、
クライアントA ―――> ルータ ―――> プロバイダ(グローバルIP-A) ―――> インターネット ―――> レンタルサーバー(受信)
クライアントB <――― ルータ <――― プロバイダ(グローバルIP-A) <――― インターネット <――― レンタルサーバー(送信)
とすればクライアントAとクライアントBを同じPCで動かすことは可能です。
[追記]
そういえば最終目標はMMORPGですよね。
だとすると音声は必要最低限の音質でパケット量を減らす必要性と動画や画像の通信はほぼ不可能だと思います。
それより他のユーザーとのゲーム状況のすり合わせの通信を優先する必要がありますからね。
クライアントA ――― ルータ ――― プロバイダ(グローバルIP-A) ――― インターネット ――― プロバイダ(グローバルIP-B) ――― ルータ ――― クライアントB
となっていないと通信できませんので個人一人だけでテストすることはこの形では不可能です。グローバルIP-AとグローバルIP-Bは違っていないといけません。
あるいは、
クライアントA ―――> ルータ ―――> プロバイダ(グローバルIP-A) ―――> インターネット ―――> レンタルサーバー(受信)
クライアントB <――― ルータ <――― プロバイダ(グローバルIP-A) <――― インターネット <――― レンタルサーバー(送信)
とすればクライアントAとクライアントBを同じPCで動かすことは可能です。
[追記]
そういえば最終目標はMMORPGですよね。
だとすると音声は必要最低限の音質でパケット量を減らす必要性と動画や画像の通信はほぼ不可能だと思います。
それより他のユーザーとのゲーム状況のすり合わせの通信を優先する必要がありますからね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: ボイスチャットと画像送信をDXLibで
判った気になったような気がします。まあ、出来るかどうかは別ですけどね^^;
皆さんに教えていただいた考え方でやってみようと思います。
未だ2台のPCの有線接続でしかプログラムの動かせません。
というだけの話です。質問には全然(?)関係ないので書く必要ありませんでしたね^^;
人数が少なければそこまで処理が大変じゃないでしょうし。(推定人数=20人)
それに、仮に盛り込めなくてもプログラムを組んでおけばいつか流用して役に立つときが来るかもしれませんし。(スカイプ代わりにちゃちゃっと組んだりとか)
皆さんに教えていただいた考え方でやってみようと思います。
えっと、リンク先で解決した時点では2台のPCの有線接続でしか文字列送信が出来ておらず、それ以来通信関係に全く手を着けていなかったのでshiro4ao さんが書きました:「クライアントA ――― ルータ ――― インターネット ――― ルータ ――― クライアントBというのが作れてませんが」
という部分が気になったのですが、基本的にはルーターの設定ができていないと
(特別な場合を除いて)通信できないので、プログラムの問題ではないような気がします。
誤解してたらすみません。
未だ2台のPCの有線接続でしかプログラムの動かせません。
というだけの話です。質問には全然(?)関係ないので書く必要ありませんでしたね^^;
ただの自己満足なので仮にサイトとか作ったとしても、知り合いと、作品お披露目掲示板で告知したのを見て来てくださった方、サイトにたどり着いた迷い人しかおそらくプレイしないので、私がMMORPGに対して持ってる「こんな機能があればいいのにな」というのをふんだんに詰め込んでやろうかと^^;softya(ソフト屋) さんが書きました: [追記]
そういえば最終目標はMMORPGですよね。
だとすると音声は必要最低限の音質でパケット量を減らす必要性と動画や画像の通信はほぼ不可能だと思います。
それより他のユーザーとのゲーム状況のすり合わせの通信を優先する必要がありますからね。
人数が少なければそこまで処理が大変じゃないでしょうし。(推定人数=20人)
それに、仮に盛り込めなくてもプログラムを組んでおけばいつか流用して役に立つときが来るかもしれませんし。(スカイプ代わりにちゃちゃっと組んだりとか)
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: ボイスチャットと画像送信をDXLibで
音声のやり取りはサーバーを介しないで直接UDPパケットでやりとりすることを考えた方が良い出でしょうね。あと、ゲームのデータ・パケットもUDPでしょうから同時にやったほうが良いでしょう。それにUDPパケットをやり取りするルータのポートを自動で開けるためにuPnPも勉強したほうが良いでしょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。