3

私はシミュレーションアニメーションをレンダリングし、毎秒複数のPNG画像ファイルを出力し、これらのファイルをディスクに保存するOpen GLアプリケーションを用意しています。これらの画像ファイルをHTTPプロトコルでストリーミングされたビデオとしてストリーミングしたいので、Webブラウザからアニメーションビデオを見ることができます。私はすでにWebSocketからの接続を処理する堅牢なソケットサーバーを持っており、すべてのハンドシェイクとメッセージのエンコード/デコードの部分を処理できます。私のサーバープログラムとOpenGLアプリケーションプログラムはC++で書かれています。連続したPNG出力画像ファイルをWebブラウザ上のライブビデオストリーミングとして配信

念頭に置いての質問のカップル:

  1. このOpenGLのアニメーションの出力をストリーミングし、自分のWebブラウザから、それを表示するための最良の方法は何ですか?ビデオ画像フレームは、OpenGLアプリケーションによってPNG画像ファイルとして動的に(連続的に)生成される。 Webブラウザは、OpenGLディスプレイ出力に対応するビデオを表示する必要があります(最小レイテンシ時間)。

  2. これらのPNG画像ファイルを、C/C++を使用してプログラムで連続的に(ライブの)ビデオとしてエンコードするにはどうすればよいですか?Flash Media Live Encoderのようなストリーミングサーバーソフトウェアに手動で画像ファイルをプッシュしないでください。私はどのようなビデオフォーマットを作りますか?

  3. Webソケットを使用してアニメーションデータを送受信する必要がありますか、それとも他の方法がありますか? (JQuery Ajaxの代わりに、私はこれを作っていますが、これを実装する正しい方法を教えてください)。このライブビデオストリーミングがさまざまなブラウザで機能するなら、素晴らしいことになるでしょう。

  4. HTML5ビデオタグはライブビデオストリーミングをサポートしていますか、特定のURL /ディレクトリ(ライブストリーミングではありません)に存在する完全なビデオファイルに対してのみ動作しますか?

  5. C/C++/Javaアプリケーションでイメージフレームを生成しているこのライブビデオストリーミングを行うための既存のコードサンプル(チュートリアル)があり、ビデオ出力としてこの出力を消費するWebブラウザがありますか? Googleで数時間を過ごした後、このトピックに関するチュートリアルをほとんど見つけることはできませんでした。

答えて

3

PNGファイルのディスクへの出力を停止し、代わりに画像データのフレームをビデオエンコーダに入力します。良い方法は、libav/ffmpegを使うことです。次に、エンコードされたビデオをネットワーク対応の形式にカプセル化する必要があります。エンコーダとMPEG4またはMPEG2TSストリーム形式としてx264をお勧めします。

ビデオをWebブラウザで表示するには、ストリーミング形式を選択する必要があります。 HTML5のHLSはSafariでサポートされていますが、残念ながらそれほど多くはありません。ワイドクライアントのサポートのためには、フラッシュやメディアプレーヤーなどのプラグインを使用する必要があります。

私がこれを行うには、サーバサイドのリストリームを行うためにWowzaを使用するのが最も簡単な方法です。GLプログラムはWowzaにMPEG2 TSをストリーミングし、HLS、RTMP(フラッシュ)、RTSP、Microsoft Smooth Streaming(Silverlight)のストリームを準備します。 Wowzaの費用は約1000ドルです。 RT5ストリームは、無料のRed5を使用して設定できます。または、VLCでRTSPを配信することもできますが、RTSPクライアントは一般的にひどいです。

現時点では、Webビデオの標準化レベルは非常に低く、ビデオツールはかなり面倒です。これは大きな仕事ですが、ffmpeg/libavでハッキングすることができます。概念の証明は、ffmpegがリッスンしているパイプにYUV420p形式のイメージフレームを書き込んで、VLC、Quicktime、Windows Media PlayerなどのRTSPクライアントで読み取ることができる出力ストリームを選択することです。

+0

この回答は、指定された質問に対して効率的な解決法を提供するため、私はこの回答を受け入れたとマークしました。フレームをビデオエンコーダに直接入力することは、実際にはPNGファイルをディスクに出力するよりも効率的です。 ffmpegによるライブエンコーディングは簡単ではないようですが、ライブ入力ストリームを聴くためのffmpeg用のプログラムを作成しようとします。ライブ入力ストリームをリッスンし、これらの入力ストリームを自動的にエンコードするffmpegサーバープログラムを作成するための使用可能なC++の例はありますか?それとも、代わりに、画像のフレームをRTMPストリームとして直接Red5サーバーに送ることができますか? –

+0

@all_by_graceおそらくffmpegにやや複雑なコマンドラインを書いていなくてもそれを行うことができます。あなたのGLプログラムでstdout(または他のパイプ)に "YUV4MPEG2"という形式のフレームを書き込むことができれば、このようなコマンドラインでビデオをエンコードしてRed5サーバーに送ることができます:ffmpeg -f yuv4mpegpipe -i pipe: vcodec libx264 -vpre normal -f flv rtmp:// localhost/live/testStreamこれは、フレームフォーマットに関するリンクです:http://kylecordes.com/2007/pipe-ffmpeg – vipw

0

ほとんどのライブビデオは、RTMP(Flash)またはHLS(Apple)としてラップされたMPEG2形式です。あなたのOpenGLをフレームにレンダリングし、それらをライブストリームとしてMPEG2に変換する方法はおそらくありますが、どのように(おそらくFFMPEGですか?)わからないのです。これが完了すると、Flash Media Live Encoder(無償版)を介してストリームをプッシュし、RTMPを使用してFlashクライアントに直接ストリーム配信するか、Wowza Media Serverに公開してFlash、Http Live Streaming(Cupertino)、Smooth Silverlightのストリーミング

基本的には、いくつかのCOTSソリューションをパイプラインにまとめて、ソケットや低レベルのものを自分で処理することなく、標準プレーヤーで再生することができます。

+0

私は既にopenglプログラムからPNG画像フレームを生成することができました。これは連続画像フレームになります。 Flash Mediaライブエンコーダを使用すると、Flash Mediaライブエンコーダソフトウェアを使用してイメージフレームを手動でプッシュする必要があります。私の主な問題は、アプリケーションが実行されている限り、OpenGLアプリケーションは新しいpngイメージファイルを生成し続けることです。これらのファイルをビデオストリームとして自動的に(これらのファイルを手動で挿入せずに)変換し、ブラウザをライブストリーミングとして(私がアプリケーションを停止するまで)。それをプログラム的にすることはできますか? –

+0

これはすべて残っています - フレーム - > mpeg pocessをバッチするソリューションを見つけること。まともなフレームレートのPNGをディスクに書き込むのは高価なので、メモリ内で実行することはお勧めです。私はそれのすべてのステップの下流での経験があります...しかし、あなたはおそらく、正確にそれを行い、PNGを入力として取り込み、それらをライブmpegにストリングするエンコーダを見つけることができます。おそらくMPEGライブラリーを見つけて、それを行うサービスを書くことができます。 – PTiddy

+0

Wowzaには、同様のことをするいくつかの記事があります。彼らは、Eclipseプラグインを持っており、開発は簡単です。 HTTPライブストリームの場合は、オンザフライでプライオリティとセグメントを作成できます。これとHTTP Liveのクパチーノストリーミングプロトコルにより、あなたは正しい方向に向けることができます。 http://www.wowza.com/forums/content.php?145 – PTiddy

関連する問題