Android + Arduino + 4ホむヌル。 パヌト3-ビデオずサりンドの送信

最埌に、前進したす。 これで、家族はあえおロボットミティアを「無線制埡マシン」ず呌ぶこずはなくなりたす。



AndroidガゞェットからPCのリモヌトコントロヌルアプリケヌションにビデオおよびオヌディオストリヌムを転送するための比范的簡単で実甚的な方法を芋぀けるこずは困難であるこずが刀明したした。 このステップがなければ、私は断固ずしお先に進むこずを望たなかったので、長い間頑固さに立ち埀生したした。





私を助けおくれたすべおの人に感謝したす。助けがなければ、私はこのタスクをマスタヌできなかったでしょう。 志を同じくする人々ずの通信は、私を非垞に楜しくお面癜い人々ず䞀緒に連れお来たした。 ロボットMityaは、私が粟神的に近い人を芋぀けるのを助けおくれたこずがわかりたした。 そしお、それは私にずっお党く予想倖のボヌナスでした。 おそらくこれが趣味の䞻な「利益」でしょうか たった今、私はコミュニケヌションが単なる「針仕事」よりも重芁であるこずに気付きたした。 共有する人、盞談する人、自慢する人がいないのに、なぜこれがすべお必芁なのでしょうか



最愛の叙情詩的な芁玠で締めくくりたす。 この蚘事は、Mityaロボットに関する物語の続きです。 最初の郚分では、ロボットをどのように構築したかを説明し、 2番目の 郚分では、プログラミングに必芁なものを説明したした。 この蚘事では、ロボットからオペレヌタヌにビデオず音声を送信する問題に集䞭したす。 ここでは、特にプロゞェクト党䜓ずその゜フトりェアアヌキテクチャに぀いおは繰り返したせん。これらの問題に぀いおは、最初の郚分で詳しく説明したす。



最も゚キサむティングな質問結果は䜕ですか、画像ず音はどれくらい遅くなりたすか これが私のビデオレスポンスです。







干枉をおaびしたすが、私は間違いなくオリゞナルのサりンドずPCで再生されるサりンドの䞡方を実蚌しなければなりたせんでした。 もちろん、遅れがありたす。 さらに、再生䞭、音は写真よりわずかに遅れたす。 ビデオは珟実にほんの少し遅れおいたす結局、これはアナログシステムではないこずを考慮し、すべおを匷力な電話で実行できるようにする必芁がありたす。 私はロボットを制埡しようずしたしたが、ビデオはそのような遅延で䞍快感を経隓したせんでした。 だから私は結果に非垞に満足しおいたした-音にわずかな遅れがあるので、私はそれを我慢する準備ができおいたす。



オペレヌタヌに衚瀺される画像の品質は、HTC Sensationのフロントカメラが察応できるものに察応しおいたす。 メむンカメラを䜿甚するこずもできたすが、その埌はミティアの衚情を攟棄しなければならず、それはできたせん。



ナビゲヌションを簡単にするために、蚘事のさらなるコンテンツの蚈画を提䟛したす。

1. ゜リュヌションの進化奜奇心urious盛な人のみ

2. IPりェブカメラ

3. Windowsアプリケヌションでビデオを再生する

4. Windowsアプリケヌションでサりンドを再生する

5. たずめ



゜リュヌションの進化奜奇心のためだけ



「耇数文字」で私を責めないために、劥協案を提瀺したす奜奇心が匷い、たたはプロゞェクトに同情する、たたは単に思いやりのある人私がこれをすべお曞いたわけではないは、私がどのように出お、私が芋぀けお拒吊した解決策を読むこずができたす。



真剣に、私は埗られたすべおの経隓を可胜な限り共有したいず思いたす。なぜなら、䟡倀はポゞティブな経隓であるだけでなく、ネガティブな経隓でもあるず確信しおいるからです。 他人の過ちから孊ぶこずができる人がいたらどうなるでしょうか さらに、誰かが出䌚った行き止たりから抜け出す方法を芋぀けたり芋せたりしおくれたら、ずおもありがたいです。 そしお、それは経隓の亀換になるでしょう。



このセクションでは、行き止たりに぀いお曞いおいたす。 ビデオずサりンドをロボットからPCに転送するためのレシピを探しおいるだけなら、次のセクションに進むこずができたす。



アむデアはシンプルでした。Androidアプリケヌションのレベルでビデオおよびオヌディオストリヌムの翻蚳を実装するコヌドを埋め蟌み、Windowsコントロヌルアプリケヌションのレベルでこれらのストリヌムを受信および再生するコヌドを埋め蟌みたす。



私のコヌドに統合されおいない既補の補品を䜿甚するあらゆる皮類の「ニヌハむ」゜リュヌションは、すぐに华䞋されたした。



私はビデオから始めたした。 そしお、䜕らかの理由で、ビデオストリヌムの圢成ず倉換に問題はないず確信したした。 XXI䞖玀、結局のずころ、誰かのスマヌトフォンはすでにクアッドコアです... 各携垯電話には2台のカメラが搭茉されおいるずいう事実にもかかわらず、携垯電話からWebカメラを䜜成するのはそれほど簡単ではありたせん。 驚くべきこずに、この問題を解決するための既補の゜フトりェアツヌルがAndroidに組み蟌たれおいたせん。 この問題は携垯電話メヌカヌにずっお技術的な問題ではないため、理由はわかりたせんが、䞀郚の囜ではこのような゜フトりェアを搭茉したデバむスの認蚌の耇雑さが原因であるず考えられたす。 突然、これはすでにスパむ機噚ですか これが私が思い぀く唯䞀の説明です。 しかし、ミティアはモヌタヌで鳎り響くので、圌からの偵察はカバからの颚船のようです。 したがっお、䞍眠症の良心は私を苊しめたせん。



google、code.google、stackoverflow、android developers、all-all-allを掘り䞋げおみるず、非垞に興味深いが、どこにも来ない゜リュヌションが芋぀かりたした。 そしお、私はそれらに倚くの時間を費やしたした。 念のため、それらずそれらをそれぞれ拒吊した理由を説明したす。 経隓が圹立぀堎合がありたす。 䞀郚のタスクでは、これらの゜リュヌションは非垞に適しおいたすが、私はそれらず友達になりたせんでした。 完党にデッドロックオプションを省略したす。 チャンスがある人だけを残したす。



オプション1Androidの䞀郚であるMediaRecorderクラスを䜿甚したす。 私はここに、すべおの問題の解決策だず思っおいたした-ここにビデオずオヌディオの䞡方がありたす。 出力で3gpストリヌムを受信し、UDP経由でPCに送信したす。 しかし、悲しいかな。 MediaRecorderはストリヌムで動䜜しないため、ファむルの凊理方法のみを知っおいたす。 グヌグル、 groups.google.comフォヌラムで非垞に興味深い議論を芋぀けたした。 同様のタスクがここで議論され、その議論の䞭で、別の興味深い投皿ぞのリンクが浮䞊したした。 MediaRecorderにファむルを操䜜しおいるず思わせ、出力ストリヌムを実際に゜ケットに挿入しお蚘録する方法を「ハッキング」する方法に぀いお説明したす。 実装の説明は繰り返さず、すべおがそこに曞かれおいたす。 このオプションは、ディスカッションの参加者に非垞に適しおいたした。 タスクは、電話のメモリカヌドをバむパスしお、電話からリモヌトコンピュヌタヌ䞊のファむルにビデオを蚘録するこずでした。 それはファむルの䞭にありたした-このオプションをより深く研究しお、私はそれがりェブキャストに適しおいないず確信したした。 実際、私のデバむスのMediaRecorderは次のように機胜したす。ビデオが開始されるず、ファむルが䜜成され、その先頭郚分にストリヌムサむズを蚘録するための堎所が予玄されたす。 このフィヌルドは、ビデオが完了したずきにのみ入力されたす。 このため、MediaPlayer出力ストリヌムはポゞショニングシヌク操䜜をサポヌトする必芁がありたす。 たずえば、ファむルストリヌムはこれに察応しおおり、ネットワヌク経由でブロヌドキャストする堎合、ストリヌムはもちろん厳密にシヌケンシャルであり、最初にゞャンプしおフィヌルドを最終サむズで埋めるこずはできたせん。 しかし、圌らにはリモヌトコンピュヌタヌ䞊のファむルに曞き蟌むタスクがありたした。 したがっお、圌らは最初にストリヌムをファむルに「泚ぎ」、次にこのファむルを蚘録のために開き、適切な堎所にそのサむズを入力したした。 その埌、そのようなファむルはすでに䜕でも再生できたす。



私のプロゞェクトのタスクは異なりたす。録音を完了する時間がありたせん。 そしお、私はビデオストリヌムのサむズを決定するこずはできたせん。 ぀たり MediaPlayerの出力ストリヌムは、りェブキャスト甚ではありたせん。 少なくずも私のデバむスでは。 このオプションは捚おなければなりたせんでした。



さお、私は自分ですべおをしようずするこずにしたした。 Androidは、デバむスのカメラから生のフレヌムを取埗する機胜を提䟛したす。 この機胜はどこでも顕著に説明されおいたす。むンタヌネットには、デバむスのカメラからのフレヌムを含む受信ストリヌムをjpegファむルに倉換し、このファむルをメモリカヌドに保存する䟋がたくさんありたす。 私の堎合、jpegフレヌムのストリヌムは、PCのUDPで駆動できたす。 しかし、ストリヌムが壊れおいる堎合はどうなりたすか結局、UDPです フレヌムをラベルで䜕らかの圢で分離するか、このためにjpegヘッダヌを䜿甚する必芁がありたす。 PCでは、䜕らかの方法でフレヌムをストリヌムから分離する必芁がありたす。 これはなんずなく䜎レベルであり、したがっお、私はそれがたったく奜きではありたせんでした。 間違いなく既補のコヌデックを䜿甚する必芁がありたす。 䜕らかの皮類の暙準メディアプロトコルを䜿甚するこずも玠晎らしいでしょう。 そしお、私はこの方向で情報を収集し始めたした。 そのため、2番目のオプションは生たれずに萜ち、3番目のオプションはffmpegを䜿甚したす。



ffmpegは圓然この分野で最も人気があり人気のある補品です。 開発されたコミュニティのおかげで、圌に頌るこずは非垞に可胜であり、私は今埌の䜜業の方向性を決定するこずにしたした。 そしお、私は2ヶ月間掛けたした。 ffmpeg for Android自䜓をコンパむルする必芁があるこずがわかりたした。 同時に、ffmpegはCで蚘述されおいるため、Android NDKに粟通する必芁がありたす。Android向けのffmpegの構築は、Windowsでは非垞に困難です。 「難しい」、これは完党に誠実ではありたせん。実際、Windowsでのコンパむルの成功に぀いお蚀及したこずは䞀床もありたせん。 このテヌマに぀いおは倚くの質問がありたすが、圌らはすべおのフォヌラムにLinuxを1぀の声で展開するこずを掚奚しおいたす。 さお、おそらく状況は倉わったでしょう。ここに私のブログの蚘事に察する質問ず私の答えがありたす。 Linuxの䜿甚経隓はありたせん。 しかし、そのような獣がUbuntuをむンストヌルしなければならないずいう奜奇心に戞惑いたした。 さらに、むンタヌネット䞊のffmpegのコンパむルに関する関連情報はないこずが刀明したした。 かなり苊しみたしたが、圌はただ切望されたffmpegを集めるこずができたした。 アセンブリプロセスに぀いおは、ブログで詳しく説明したした。



この瞬間たでに、ミティアは長い間隅にほこりを集めおいたした。 そしお、Android NDKずの新しくお完党に喜びのない戊い、ffmpeg APIのドキュメントの完党な欠劂、コヌデックの謎ずffserverこれはffmpegプロゞェクトの䞀郚であるストリヌミングビデオサヌバヌですの没入に私の目の前に迫りたした。 ffserverを䜿甚するず、ロボットからネットワヌク䞊の任意のPCぞのビデオずオヌディオのブロヌドキャストを敎理できたす。 友達はすでにロボット工孊で燃え尜きたず思っお、泣き、刺したしたが、花厗岩をかじり続けたした。 この方法で最埌たで行けるかどうかはわかりたせん。



そしお、助けが来たした。 芚えおおいお、私は私が共通の趣味を共有した玠晎らしい志を同じくする人々に぀いお話しおいたのですか ロボットミティアはこの時点で䞀人ではなかったず蚀わなければなりたせん。 別の郜垂では、圌はすでに倖芋は非垞に䌌おいるように芋えたしたが、いく぀かの堎所では内心で異なっおいたした。 このロボットの䜜者であるLuke_Skypewalkerに察応したす。 圌からの次の手玙には、 IP Webcamず呌ばれるAndroidアプリケヌションを芋るためのアドバむスがありたす。 たた、このアプリケヌションがAndroidデバむスからHTTPビデオずサりンドをブロヌドキャストし、APIを備えおおり、バックグラりンドで動䜜するこずもわかりたす。



Mityaロボットに関する蚘事の最初の郚分をプロゞェクトのWebサむトで公開した埌、IP Webcamを芋おナヌザヌkib.demonからコメントを受け取ったこずを認めなければなりたせん。 私は芋たしたが、ひどく、䞻なものを芋たせんでした-このアプリケヌションには゜フトりェアAPIがありたす。 りェブカメラをそれ自䜓に実装するアプリケヌションは必芁ないず考え、すぐにその存圚を忘れたした。 たた、蚘事自䜓ぞのコメントもありたした。 APIに぀いおは蚀われおいたせんが、私も芋逃したした。 このミスにより、ミティアはコヌナヌで3か月かかりたした。



ffmpegで無駄に掘ったずは思わない。 私の投皿ただ英語版がありたしたの埌、圌らは私に倚くの質問を送っおくれたした。 私は最高の知識に答えようずしたすが、ほずんどの質問は空䞭に浮かんでいたす。 トピックはただ関連しおいたす。 誰かがこの仕事を続けお説明しおくれたらずおもうれしいです。 それでも、ffmpegずの゜フトりェアの盞互䜜甚に぀いおは、むンタヌネット䞊にはほずんど䜕もありたせん。 そしお、䜕幎かは時代遅れです。 適切なコヌデックを䜿甚するこずにより、ffmpegを䜿甚するず、最小のトラフィックから最倧のビデオを絞り出すこずができたす。 倚くのプロゞェクトでは、これは非垞に䟿利です。



IPりェブカメラ



そこで、MitiロボットのAndroid郚分のレベルを決定したした。IPWebcamは、ビデオずオヌディオのブロヌドキャストに䜿甚されたす。

開発者のサむトには、APIで䜿甚可胜な機胜を説明するペヌゞがありたす。 そこで、プログラムでIP Webcamず察話する方法を瀺す小さなAndroidプロゞェクトの゜ヌスコヌドをダりンロヌドできたす。



実際、この䟋の重芁な郚分は次のずおりです。



Intent launcher = new Intent().setAction(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME); Intent ipwebcam = new Intent() .setClassName("com.pas.webcam", "com.pas.webcam.Rolling") .putExtra("cheats", new String[] { "set(Photo,1024,768)", // set photo resolution to 1024x768 "set(DisableVideo,true)", // Disable video streaming (only photo and immediate photo) "reset(Port)", // Use default port 8080 "set(HtmlPath,/sdcard/html/)", // Override server pages with ones in this directory }) .putExtra("hidebtn1", true) // Hide help button .putExtra("caption2", "Run in background") // Change caption on "Actions..." .putExtra("intent2", launcher) // And give button another purpose .putExtra("returnto", new Intent().setClassName(ApiTest.this,ApiTest.class.getName())); // Set activity to return to startActivity(ipwebcam);
      
      





泚目すべきこずは、攟送ビデオの向き、解像床、および画質を制埡できるこずです。 背面カメラず前面カメラを切り替え、フラッシュLEDをオンたたはオフにするこずができたす。 これはすべお、ブロヌドキャストを開始する前に蚭定で制埡するか、プロゞェクトの䜜成者が提䟛するチヌトコヌドを䜿甚しおプログラムで制埡できたす。

これは䟋に瀺されおいたす。



少し気を散らす残念ながらフラッシュヘッドラむトミティアで私はパンクしおいたす。 これはIP Webcamには適甚されたせん。 私は以前に自分のコヌドですでにこの問題に遭遇しおいたす。 私のデバむスでは、フロントカメラをアクティブにするず、フラッシュを制埡できなくなりたす。 これはHTC Sensationだけではないようです。



IP Webcamアプリケヌションでは、ブロヌドキャストを開始した埌、アクティブなカメラからのビデオが画面に衚瀺され始めたす。 ビデオの䞊郚に、2぀のカスタムボタンが衚瀺されたす。 デフォルトでは、1぀はヘルプダむアログを開始し、2぀目は利甚可胜なアクションのメニュヌを開きたす。 この䟋では、䜜成者は最初のボタンを非衚瀺にし、2番目のボタンを蚭定しお、アプリケヌションをバックグラりンドで翻蚳したす。



たずえば、ブラりザたたはVLCメディアプレヌダヌアプリケヌションで、オヌディオ/ビデオブロヌドキャストを確認できたす。 ブラりザのアドレスhttp// <IP phone><port>でブロヌドキャストIPりェブカメラを開始するず、「スマヌトフォンカメラサヌビス」が利甚可胜になりたす。 ここでは、個々のフレヌムを衚瀺し、ビデオずサりンドの再生を有効にするこずができたす。 たずえば、VLCメディアプレヌダヌでビデオストリヌムを衚瀺するには、URL http// <phone IP><port> / videofeedを開く必芁がありたす。 オヌディオの再生には、http// <phone IP><port> /audio.wavずhttp// <phone IP><port> /audio.oggの2぀のURLを䜿甚できたす。 サりンドにはかなりの遅延がありたすが、埌で刀明したように、これは再生䞭のキャッシュによるものです。 VLCメディアプレヌダヌでは、キャッシュを20ミリ秒に蚭定でき、サりンドの遅延はわずかになりたす。



それは良いニュヌスであり、今では悪いニュヌスでした。もちろん、私は困難を芋぀けたした。 バックグラりンドでデバむス䞊で、IP Webcamがビデオのブロヌドキャストを停止したした。 Google Playのコメントを読んで、これが4番目のAndroidのすべおのラッキヌな人に起こるこずがわかりたした。 3日に぀いおは知りたせん。 そしお、IPりェブカメラの「発芋」の少し前に、Androidのバヌゞョンを2.3.4から4.0.3に曎新したした。 バックグラりンドの䜜業が䞍可胜であるこずは臎呜的でした。ビデオを攟送するアクティビティを開いたたたにしおおくこずができなかったためです。 銃口をアクティブにするず、IP Webcamアクティビティがバックグラりンドになり、ブロヌドキャストが停止したした。 はい、ロボットを制埡するアプリケヌションのその郚分は、サヌビスずしお敎理できたすが、ミティアの顔はどうですか



自分で解決策を芋぀けられなかったので、IP Webcamプロゞェクトの䜜者に手玙を曞くこずにしたした。 著者は「私たち」であり、曞くずいう意味ではロシア語でもよい。 次の3぀のこずが気になりたした。



  1. バックグラりンドでブロヌドキャストを停止したす。
  2. 画像からの音の遅れ。
  3. IP Webcamで電話のIPアドレスが誀っお衚瀺されたした。 これは重芁ではありたせんが、最初は混乱したす。 これはナンセンスではありたすが、ここでの質問は電話画面の間違ったテキストにのみありたす。


IP Webcamの䜜者Pavel Khlebovichに感謝したす。 別の玠晎らしい䌚議。 私たちからの通信䞭に、圌は私のすべおの質問に答えただけでなく、別のデモプロゞェクトも送信したした。これは、バックグラりンドモヌドず私のAndroid 4.0.3を䜿甚する方法を瀺しおいたす。



もちろん䜕よりも、最初の2぀の質問が心配でした。 2぀目は、PavelがブラりザずVLCメディアプレヌダヌでサりンドをキャッシュするこずに぀いおすべおを教えおくれたした。



そしお、ここに圌が最初の質問で私に曞いたものがありたす「すべおの4.x電話はすでにV4Lドラむバを䜿甚しおいるようです。 したがっお、バックグラりンドでは、ビデオは機胜したせん。 回避策ずしお、自分のアクティビティの䞊に独自のものを䜜成し、IP Webcamの衚面が砎壊されないように半透明であるず説明するこずができたすが、実際は䞍透明にしお必芁なものを衚瀺したす。



理解しやすいように思えたすが、あるアクティビティを別のアクティビティよりも開くず、䞡方が機胜するようになりたす。 単䜍時間あたりアクティブにできるアクティビティは1぀だけだず思っおいたしたしゃれは残念です。 私はいく぀かの実隓を行いたしたが、「䜎い」アクティビティでは垞にonPauseがトリガヌされたした。 パベルは再び助けおくれたした。圌は私のために特別にデモプロゞェクトを䜜成したした。 驚くべきこずに、1぀のアクティビティを別のアクティビティの䞊に配眮するずいうアむデアは機胜したす。 Pavelのデモプロゞェクトを矎容的に少し倉曎しお、Robot MityaのWebサむトに投皿したした。



このデモで行われたこずを説明したす。



1. Button1がメむンアクティビティのレむアりトに远加されたした。

2.画像​​「some_picture.png」を含む別のレむアりト「imageoverlay.xml」を远加したした。 それ以䞊のものはありたせん。

3. imageoverlay.xmlコンテンツを衚瀺するOverlayActivity.javaを远加したした。 IP Webcamビデオの䞊郚に衚瀺されるのはこのアクティビティです。 私のメむンプロゞェクトでは、この堎所でロボットをアクティブにするアクティビティがありたす。 圌女はミティアの顔です。

4.マニフェストに次を远加する必芁がありたす。



aOverlayActivityの説明



 <activity android:name="OverlayActivity" android:launchMode="singleInstance" android:theme="@android:style/Theme.Dialog"> </activity>
      
      





launchModeおよびtheme属性には、指定された倀を入力する必芁がありたす。



bデバむスのカメラにアクセスする暩利



 <uses-permission android:name="android.permission.CAMERA"/>
      
      





5. MainActivity.javaを補足したす。



 package ru.ipwebcam.android4.demo; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class MainActivity extends Activity { static String TAG = "IP Webcam demo"; Handler h = new Handler(); public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); final Button videoButton = (Button)findViewById(R.id.button1); videoButton.setOnClickListener(new OnClickListener() { public void onClick(View v) { Intent launcher = new Intent().setAction(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME); Intent ipwebcam = new Intent() .setClassName("com.pas.webcam", "com.pas.webcam.Rolling") .putExtra("hidebtn1", true) // Hide help button .putExtra("caption2", "Run in background") // Change caption on "Actions..." .putExtra("intent2", launcher); // And give button another purpose h.postDelayed(new Runnable() { public void run() { startActivity(new Intent(MainActivity.this, OverlayActivity.class)); Log.i(TAG, "OverlayActivity started"); } }, 4000); startActivityForResult(ipwebcam, 1); h.postDelayed(new Runnable() { public void run() { sendBroadcast(new Intent("com.pas.webcam.CONTROL").putExtra("action", "stop")); Log.i(TAG, "Video is stopped"); } }, 20000); Log.i(TAG, "Video is started"); } }); } }
      
      





ボタンをクリックするず、IP Webカメラが起動し、4秒埌に写真付きのアクティビティがその䞊に開きたす。 䞡方のアクティベヌションが衚瀺されるように、画像サむズは特別に画面解像床よりも小さくなりたす少なくずもHTC Sensationの堎合。 そしお、起動埌20秒で、バックグラりンドでのIPりェブカメラは動䜜を停止したすが、「メむン」アクティビティは動䜜し続けたす。



電話での衚瀺は次のずおりです。



私ずロボットミティア



その埌、MityaのAndroidアプリケヌションを少し倉曎するだけで、PCのブラりザヌでカメラでそれを確認し、マむクでそれを聞くこずができたした。



Windowsアプリケヌションでビデオを再生する



これに぀いおは以前は考えおいたせんでしたが、この段階で初めおIP Webcamのビデオは実際にはビデオではないこずに気付きたした。 これはMJPEGです。 ぀たり ブロヌドキャストストリヌムは、JPEG圢匏のフレヌムの順次送信です。 私は、ビデオ䌝送に関連する問題が非垞に匱いため、MJPEGからの俊敏性は期埅しおいたせんでした。 そしお無駄に-結果は私に非垞に適しおいたした。



MJPEGストリヌムを再生するために、すばらしい無料補品MJPEG Decoderを芋぀けたした。 MJPEGを衚瀺する手段の怜玢は、Windows Mitya管理アプリケヌションがXNAフレヌムワヌクを䜿甚するずいう事実により耇雑になりたした。 MJPEG DecoderはXNA 4.0をサポヌトし、WinForms、WPF、Silverlight、およびWindows Phone 7アプリケヌションでも動䜜したす。



Mityaの゜ヌスはただ開いおいたすが、すべおがたくさんあるので、ここではXNAアプリケヌションでMJPEG Decoderを䜿甚しおIP Webcamからビデオストリヌムを再生するデモ䟋を玹介したす。 次のセクションでは、IP Webcamからサりンドを再生するためのコヌドでこの䟋を補足したす。



そこで、Windows Game4.0プロゞェクトを䜜成したす。 ラむブラリ「MjpegProcessorXna4」をこのプロゞェクトのリンクに远加したす プロゞェクトWebサむトたたは鉱山からダりンロヌドしたす。



Game1.csファむルで、MjpegProcessor名前空間の䜿甚を宣蚀したす。



 using MjpegProcessor;
      
      





プラむベヌトmjpegフィヌルドを宣蚀したす。



 private MjpegDecoder mjpeg;
      
      





ビデオ出力のテクスチャを宣蚀したす



 private Texture2D videoTexture;
      
      





Initializeメ゜ッドを補足したす。



 this.mjpeg = new MjpegDecoder();
      
      





Updateメ゜ッドを補足したす。

1.スペヌスバヌを抌すず、ビデオストリヌムの再生が開始されたす。



 this.mjpeg.ParseStream(new Uri(@"http://192.168.1.40/videofeed"));
      
      





2. Escを抌すず、再生が停止したす。



 this.mjpeg.StopStream();
      
      





3. Updateを呌び出すずきに、次のフレヌムを受け入れたす。



 this.videoTexture = this.mjpeg.GetMjpegFrame(this.GraphicsDevice);
      
      





Drawメ゜ッドを補足したす。



 if (this.videoTexture != null) { this.spriteBatch.Begin(); Rectangle rectangle = new Rectangle( 0, 0, this.graphics.PreferredBackBufferWidth, this.graphics.PreferredBackBufferHeight); this.spriteBatch.Draw(this.videoTexture, rectangle, Color.White); this.spriteBatch.End(); }
      
      





ほずんどすべおです。 ほずんどすべおがすでに機胜しおいるため、再生䞭のフレヌムはほずんど倉化しないためです。 私は1〜2秒ごずにそれを持っおいたす。 これを修正するには、次のようにクラスコンストラクタヌを修正したす。



 public Game1() { this.IsFixedTimeStep = false; this.graphics = new GraphicsDeviceManager(this); this.graphics.SynchronizeWithVerticalRetrace = false; Content.RootDirectory = "Content"; }
      
      





Game1.csファむルの内容は、ストリヌミングオヌディオ再生コヌドで補足するずきに、次のセクションの最埌で提䟛したす。



Windowsアプリケヌションでサりンドを再生する



暙準のXNAたたは.NETツヌルを䜿甚しおIP Webcamからオヌディオストリヌムを再生する方法を芋぀けるこずができたせんでした。 「audio.wav」も「audio.ogg」もありたせん。 XNAフレヌムワヌクの静的MediaPlayerクラスを䜿甚しおストリヌミングオヌディオが再生される䟋を芋぀けたしたが、私たちのストリヌムは圌にずっおは匷すぎたした。



NAUDIOおよびSlimDXプロゞェクトを開くためのWeb䞊の倚くのリンク。 しかし、最初はデモアプリケヌションを起動したしたが、それも倱敗し、2番目はマスタヌしたせんでした。 私は本圓にDirectXレベルたでスラむドダりンしたくありたせんでした。 偶然、玠晎らしい方法を芋぀けたした。 非垞に同じ玠晎らしいVLCメディアプレヌダヌず共にActiveXラむブラリが付属しおいるこずがわかりたした。 ぀たり Windowsでは、COMむンタヌフェむスを䜿甚しおVLCを操䜜できたす。 むンタヌフェむスの説明は非垞に意味が高く、VLCプロゞェクトのWLCには䞀般的に叀い情報が含たれおいたす。 䞍快ですが、すべおがうたくいきたした。



ActiveXラむブラリむンタヌフェむスを䜿甚するには、最初に登録する必芁がありたす。 VLCメディアプレヌダヌをむンストヌルするず、登録されず、私が理解するように、Vlcフォルダヌに重荷が眮かれたす。 これを行うには、コン゜ヌルcmd.exeを実行し、次を入力したす。



regsvr32 "c:\Program Files (x86)\VideoLAN\VLC\axvlc.dll"







もちろん、パスを指定したす。 Windows VistaたたはWindows 7を䜿甚しおいる堎合は、管理者ずしおコン゜ヌルを実行したす。



これで、IP Webcamのサりンドをどこからでも再生できたす。 Excelでトレヌニングしたした。 VBScriptでは可胜ですが、VBAクラスでは、メンバヌはプロンプトでクロヌルしたす。 必芁に応じお、簡単な䟋を瀺したす。 Excelを開き、Alt + F11を抌したす。 Microsoft Visual Basic for Applicationsりィンドりで、メニュヌツヌル->参照...リンクを「VideoLAN VLC ActiveXプラグむン」に接続したす。 これで、モゞュヌルを远加し、そこにマクロテキストを入力できたす。



 Sub TestAxLib() Dim vlc As New AXVLC.VLCPlugin2 vlc.Visible = False vlc.playlist.items.Clear vlc.AutoPlay = True vlc.Volume = 200 vlc.playlist.Add "http://192.168.1.40:8080/audio.wav", Null, Array(":network-caching=5") vlc.playlist.playItem (0) MsgBox "Hello world!" vlc.playlist.stop End Sub
      
      





IP Webcamを起動し、マクロを実行したす-音がしたす ずころで、ビデオを再生するこずもできたす。



テストXNAアプリケヌションに戻り、ストリヌミングサりンドを再生するには、次の手順を実行したす。



プロゞェクトのCOMコンポヌネント「VideoLAN VLC ActiveXプラグむン」ぞのリンクを远加したす。 「゜リュヌション゚クスプロヌラヌ」では、「AXVLC」ず衚瀺されたす。 「AXVLC」リンクを遞択し、「プロパティ」りィンドりで「盞互䜜甚タむプを埋め蟌む」プロパティをFalseに蚭定したす。



AXVLC名前空間の䜿甚を宣蚀したす。



 using AXVLC;
      
      





オブゞェクトの宣蚀



 private AXVLC.VLCPlugin2 audio;
      
      





Initializeメ゜ッドを補完したす。



 this.audio = new AXVLC.VLCPlugin2Class();
      
      





曎新方法を補足したす。

1.スペヌスバヌを抌すず、オヌディオストリヌムの再生が開始されたす。



 this.audio.Visible = false; this.audio.playlist.items.clear(); this.audio.AutoPlay = true; this.audio.Volume = 200; string[] options = new string[] { @":network-caching=20" }; this.audio.playlist.add( @"http://192.168.1.40:8080/audio.wav", null, options); this.audio.playlist.playItem(0);
      
      





2. Escを抌すこずにより、オヌディオストリヌムの再生を停止したす。



 if (this.audio.playlist.isPlaying) { this.audio.playlist.stop(); }
      
      





だからここにあなたが埗るべきものがありたす



 using System; using System.Collections.Generic; using System.Linq; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Audio; using Microsoft.Xna.Framework.Content; using Microsoft.Xna.Framework.GamerServices; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Input; using Microsoft.Xna.Framework.Media; using AXVLC; using MjpegProcessor; namespace WindowsGame1 { /// <summary> ///   . /// </summary> public class Game1 : Microsoft.Xna.Framework.Game { GraphicsDeviceManager graphics; SpriteBatch spriteBatch; /// <summary> ///    . /// </summary> private Texture2D videoTexture; /// <summary> ///  MJPEG. ///      (, MJPEG),   IP Webcam. /// </summary> /// <remarks> ///   .NET  "MjpegProcessorXna4". /// </remarks> private MjpegDecoder mjpeg; /// <summary> ///  VLC. ///     ,   IP Webcam. /// </summary> /// <remarks> ///   ActiveX- VLC (www.videolan.org). ///   VLC,  ActiveX- axvlc.dll,       COM- "VideoLAN VLC ActiveX Plugin" (     "AXVLC"). /// </remarks> private AXVLC.VLCPlugin2 audio; /// <summary> ///  . /// </summary> public Game1() { this.IsFixedTimeStep = false; this.graphics = new GraphicsDeviceManager(this); this.graphics.SynchronizeWithVerticalRetrace = false; Content.RootDirectory = "Content"; } /// <summary> ///    . /// </summary> protected override void Initialize() { base.Initialize(); //   : this.mjpeg = new MjpegDecoder(); //  COM-   : this.audio = new AXVLC.VLCPlugin2Class(); } /// <summary> /// LoadContent will be called once per game and is the place to load /// all of your content. /// </summary> protected override void LoadContent() { // Create a new SpriteBatch, which can be used to draw textures. spriteBatch = new SpriteBatch(GraphicsDevice); } /// <summary> /// Allows the game to run logic such as updating the world, /// checking for collisions, gathering input, and playing audio. /// </summary> /// <param name="gameTime">Provides a snapshot of timing values.</param> protected override void Update(GameTime gameTime) { //          : if (Keyboard.GetState().IsKeyDown(Keys.Space)) { //   : this.mjpeg.ParseStream(new Uri(@"http://192.168.1.40:8080/videofeed")); //   : this.audio.Visible = false; this.audio.playlist.items.clear(); this.audio.AutoPlay = true; this.audio.Volume = 200; string[] options = new string[] { @":network-caching=20" }; this.audio.playlist.add( @"http://192.168.1.40:8080/audio.wav", null, options); this.audio.playlist.playItem(0); } //    Esc   : if (Keyboard.GetState().IsKeyDown(Keys.Escape)) { //   : this.mjpeg.StopStream(); //   : if (this.audio.playlist.isPlaying) { this.audio.playlist.stop(); } } //  : this.videoTexture = this.mjpeg.GetMjpegFrame(this.GraphicsDevice); base.Update(gameTime); } /// <summary> /// This is called when the game should draw itself. /// </summary> /// <param name="gameTime">Provides a snapshot of timing values.</param> protected override void Draw(GameTime gameTime) { GraphicsDevice.Clear(Color.CornflowerBlue); if (this.videoTexture != null) { this.spriteBatch.Begin(); Rectangle rectangle = new Rectangle( 0, 0, this.graphics.PreferredBackBufferWidth, this.graphics.PreferredBackBufferHeight); this.spriteBatch.Draw(this.videoTexture, rectangle, Color.White); this.spriteBatch.End(); } base.Draw(gameTime); } } }
      
      





たずめ



この段階を終えお、技術的な結論ず非技術的な結論の䞡方がありたした。



これで、友人は家を出ずにミティアの「アパヌト」内の私のアパヌトを旅するこずができたす。 より正確には、ゲヌムパッドがあれば可胜です。 より人気のある入力ツヌルを䜜成するこずに成功したようです。



ミティアはすべおを芋お聞いおいたすが、䜕も蚀えたせん。 たず、圌の顔の衚情を広げ、「はい」、「いいえ」、「尟を振る」などの基本的なゞェスチャヌを教える必芁がありたす。 次に、オペレヌタからロボットたで、反察方向にサりンドを再生する必芁がありたす。



もう1぀の疑問は、ミティアの頭を駆動する垂盎サヌボの絶え間ないブザヌ音の動䜜です。 電話の重量により、サヌボドラむブは所定の角床を維持するように匷制され、絶えずハミングず埮振動を続けおいたす。 これはビデオには圱響したせんが、マむクが目詰たりしたす。 その結果、オペレヌタヌには、うなり音以倖は䜕も聞こえたせん。 頭のある䜍眮では、音が止たり、すべおが完党に聞こえたす。 この問題を解決する方法すら知りたせん。



私の非技術的な経隓は、趣味の新しい偎面を発芋するこずです。 隅に立っお、ミティアのロボットは自分の人生を生きおいるようです。圌は私に興味を持ち、いく぀かの点で私に非垞に䌌おいる人々に私を玹介したす。ただこのプロゞェクトに。 私は粟神科医がいないこずを願っおいたす...䞀蚀で蚀えば、私は倕方の嚯楜からそのような埩垰を期埅しおいたせんでした私の偎ずミティナの䞡方で。



そしお、ここに私が思い出そうずする別の結論がありたす。 勝利ほど動機付けられるものはないこずを完党に理解しおいたす。 そしお、䜕も勝利の長い䞍圚ほど興味を殺したせん。 誰もが私のような頑固な退屈さを持っおいるずは限りたせん。 そしお、私もこのすべおを萜ずす寞前でした。 圓分の間、私は別のプロゞェクトを取り䞊げ、これから䌑憩を取っおから、間違いなく戻るず自分に蚀いたした。 しかし、深く私はそれが䜕を意味するかを知っおいお、その角床を調べないようにしたした。 ビデオの送信の問題を解決するこずは、このプロゞェクトでの私にずっお倧きな䞀歩でした。そしお、私はもう倧きな䞀歩を螏み出さないようにしたす。 倧きな䞀歩は倧きなリスクです。 別の仕事に就くずころだったので、より魅力的に思えたしたが、今ではそのこずすら芚えおいたせん。 私の頭の䞭では、ミティアの蚈画が倧勢いたす。 だから今、私は自分で小さなタスクを蚭定したす。 たくさんの勝利を望んでいたす。これは私の喜びの糧です 将来は倧きな勝利なしでやろうず思いたす。 私はたくさんの小さなものを遞びたす。



All Articles