TCPでデータを受け取ってそれを画像として連続表示する、いわゆるストリーミング動画再生ソフトを作ろうと思っています。
ソフトウェアプログラミングは疎く、TCPでのデータの受信プログラムの作成はできるのですが、PCへの負荷を最小限にして表示する方法がよくわからず困っております。
動画サイズは、1280*720のフルカラーで、60fpsで表示したいと考えています。
画像は非圧縮のベタデータで送られてきます。
VC++とDirectXを用いれば高速に表示できるかと思い(どちらも使用は初めてです)、この数日調べまわっていますが、まずベタデータを表示することすらままならず(ファイルを読み出してテクスチャを作成し、レンダリングするという情報は多いのですが。。)、それがなんとかできても今度はそのデータを変えてアニメーション表示しようとするとメモリーを山のように消費してまともに動かないプログラムが出来上がったりと、なんとも苦しんでおります。
当方使用できるプログラミング言語はC言語のみですが、必要であればC++も勉強して使用したいと思います。
どのような手法が最適で、どのような手順でやればいいのか、ヒントだけでも、教えていただければ助かります。
No.4ベストアンサー
- 回答日時:
D3DXCreateTextureFromFileInMemoryEx が遅そうですね。
DirectXを使わずに、ビットマップをBitBltで描画する方法はどうでしょうか。
参考URL:
保存した100枚のビットマップ画像を連続表示 - 質問・相談ならMSN相談箱
http://questionbox.jp.msn.com/qa4477113.html
GDI/GDI+のビットマップ転送能力
http://lamoo.s53.xrea.com/develop/gdiplus/gdiplu …
また、YUV→RGB変換には、実数演算がふくまれているので、整数の処理に置き換えると良いかもしれません。
参考URL:
KnowledgeBase: RGB<-->YUV変換
http://tyre.gotdns.org/domino/web01/tecrep2.nsf/ …
この回答への補足
ありがとうございます。
BitBltを試してみましたが、圧倒的に早いですね。
ただ、LoadImageでbmpファイルから作ったビットマップの表示はできるのですが、
メモリー上にあるデータをビットマップ(DDB)にする方法がわからず四苦八苦しております。
CreateBitmapである程度できるようですが、カラーにはCreateCompatibleBitmapで作れとありCreateBitmapでカラーDDBを作るサンプルが見当たらず、CreateCompatibleBitmapで作ろうとすると、こいつは画像データのポインタを渡してくれないらしく、結局メモリー上のデータをDDBにすることができず。。。
このあたりなにかヒントがあれば、お教えいただければと思います。
BitBltの情報をいただけたおかげで、デモのほう完成いたしました。
結局DDBは直接触れないようで、DIBで作成しました。
YUV→RGB変換は、演算そのものよりピクセルごとにデータを書き込むのに時間がかかるようで(ライトバックキャッシュはどうなってるんでしょうか。。)、送信側でYUV→RGB変換して、ソケットの受信バッファに直接DIBの画像データポインタを指定することで表示させました。
そのため、32bitの転送となり、フレームレートは30fpsに下げざるを得なくなりましたが、DIBの表示自体も若干重かったので、ちょうどよかったのかなと考えています。
なんだか、Windowsプログラミングは、MicroSoftの手のひらで踊らされているようですね。
ともかく、ありがとうございました。
No.3
- 回答日時:
非圧縮ということにこだわらないのであれば、1枚ずつJPEG圧縮をかけるのはどうでしょうか。
これでもサイズは数10分の1になります。処理がフレーム単位で独立していますので、送信側、受信側とも苦労せずに対応可能だと思います。送信サイズが小さくなる分、無圧縮で送信するよりも負荷は小さく出来るでしょう。
ちなみに、初代Playstationは、この方法で動画を表示していました。規格的には「MotionJPEG」と呼ばれています。
この回答への補足
今回はTCP転送が高速にできますよというデモに使用しますので、圧縮して転送するのはNGとなります。
また、実際TCPデータの受信およびデータのチェックだけであれば、CPU使用率は20~30%にとどまっています。
今回、TCPの通信を行わない状態で、画像データをPCプログラム内でパターンを生成しているのみにもかかわらず、CPU使用率は50%を超え(Core duoなので、実質使用率は100%です)、60fpsの描画ができていない状況です。
一般的な動画とは違い、60fpsなので重いというのはわかってはいるのですが、WindowsではOpenGLよりDirectXのほうが軽いのではとの思いがあり、今回質問させていただいたしだいです。
DirectShowのレンダラーを使えばできそうな感じではあるのですが、DirectX以上にベタデータの表示に関する情報が少なく、困っております。
No.2
- 回答日時:
>これで1280*720*60*16なので、885Mbpsになるかと考えています。
やっぱりギガビットイーサでも足りません。
「ギガビットイーサなら1000Mbpsだから足りるのでは?」
とか思っています?
規格上は1000Mbpsでも、その速度がフルで出るコトはありません。
またTCP/IPのヘッダが付与されたりしますから全部は使えません。
TCPは比較的重いです。
UDPなら多少は早くなりますが、エラー時の再送などはありませんしパケットの到着順も保証されません。
データ圧縮して転送するなりしないとどうにもならんでしょう。
この回答への補足
今回ハードワイヤードTCP/IPをFPGAで作成しまして、PCで受信して
データ比較も行って実測で900Mbps出ることを確認しています。
これはもちろんヘッダを除いた実データ部分の速度です。
以下は、実際のデータ転送の模様で、4GBの転送を35秒以内で完了しています。
ただデータが流れてるだけでは面白くないので、ハイビジョンカメラのデータを
イーサネット経由でPCで受信して表示するというデモを作成しようと思っております。
通信部分は今回問題としておりませんので、できれば、今回の質問そのものに
お答えいただけますと助かります。
DirectXで、
D3DXCreateTextureFromFileInMemoryEx→BeginScene→Begin→Draw→End→EndScene→Present→SAFE_RELEASE
をループさせることで表示させることはできましたが、負荷が高すぎて60fpsはまったく出ませんでした。(表示する画像はプログラム内で簡単なパターンを作成しています)
この方法があっているかどうかがわかっておりませんが。。
OpenGLも、試してみましたが少し厳しいようです。
(glutIdleFuncで画像パターンデータ生成と、glutPostRedisplayを回しております。)
そもそも画像データパターン生成だけでも重いようで(したがって、ソフトウェアでのYUV→RGB変換も重いと思われます)、そこから考えないといけないようではあるのですが。。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- フリーソフト 倍率自動調整して全画面表示できるフリーの画像ビューアー 1 2023/08/24 10:55
- HTML・CSS WEBサイトの構築。表示データとWEBデザインを分離する考え方を専門用語・業界用語では何と言うか? 8 2022/09/27 09:16
- Excel(エクセル) iphonからone driveに保存してあるExcelを閲覧すると表示の仕方がちがうデータ 2 2022/12/21 13:51
- C言語・C++・C# 【C++】IDirect3DSurfaceのディープコピーは可能ですか? 1 2022/07/06 02:47
- Excel(エクセル) [Excel2016] 相関表等の自動作成 2 2022/08/01 20:34
- ドライブ・ストレージ HDDの未割り当て領域が認識されない 7 2022/11/27 18:51
- ドライブ・ストレージ SSDを追加したら昔のHDDがおかしくなった 4 2023/03/23 13:25
- Visual Basic(VBA) エクセルマクロでアニメを作る方法を教えてください。 1 2023/02/07 14:27
- ノートパソコン ハードディスクが壊れたPCのオークションへの出品の仕方を教えてください 9 2022/11/16 08:13
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・2024年に成し遂げたこと
- ・3分あったら何をしますか?
- ・何歳が一番楽しかった?
- ・治せない「クセ」を教えてください
- ・【大喜利】看板の文字を埋めてください
- ・【大喜利】【投稿~12/17】 ありそうだけど絶対に無いことわざ
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・【穴埋めお題】恐竜の新説
- ・我がまちの「給食」自慢を聞かせてっ!
- ・冬の健康法を教えて!
- ・一番好きな「クリスマスソング」は?
- ・集合写真、どこに映る?
- ・自分の通っていた小学校のあるある
- ・フォントについて教えてください!
- ・これが怖いの自分だけ?というものありますか?
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・10代と話して驚いたこと
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DTOとEntityの差は何ですか。
-
【C#】DataGridViewの最大列数...
-
excel access連携 このテーブル...
-
長い1枚ページを無限スクロール...
-
EXCEL VBAでのCSV出力について
-
ActiveReportのサブレポート機...
-
GridViewからチェックボックス...
-
wordの差し込み印刷で文字...
-
C#でのForm間のデータ受け渡し...
-
ソフト(ガジェット)を作りたい
-
ArrayListへArrayListの格納
-
WordでExcelデータを差込...
-
表を表示するコントロールについて
-
VBA内でのGetPixelを使用した時...
-
INIファイルに一括書き込みを行...
-
ASP.NET GridView の検索画面で...
-
Dosブロンプトでtabを出力したい
-
バッチファイルでpingの結果を...
-
shシェルスクリプト 空白行の...
-
「取得先」という表現について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
wordの差し込み印刷で文字...
-
【C#】DataGridViewの最大列数...
-
DTOとEntityの差は何ですか。
-
excel access連携 このテーブル...
-
WordでExcelデータを差込...
-
ActiveReportのサブレポート機...
-
「外部データの取り込み」とい...
-
XMLHttpRequestでウェブページ取得
-
VB.NET 2017の勉強中です。 今...
-
C言語で地図を描きたい
-
C#でのForm間のデータ受け渡し...
-
MSFlexGridのデータを初期化し...
-
Windowsのマクロプログラムで、...
-
VBA内でのGetPixelを使用した時...
-
Outlookで2年日記はできる?
-
INIファイルに一括書き込みを行...
-
json_encodeが表示しない
-
VB6.0とスプレッドシート
-
ADOを使用してExcelファイルを...
-
VB6でDBからクリップボード経由...
おすすめ情報