1

私はリアルタイムでビデオを生成できるプログラムを持っています。今、このビデオが生成されている間、このビデオをオンラインでストリーミングしたいと思います。誰も簡単な方法を知っていますか?ビデオが生成されている間にオンラインでビデオをストリーミングし、失敗したCGIの方法。

私は試みたが動作しなかったCGIアプローチについて説明していますが、私は目標を達成するためのすべてのオプションを公開しています。なぜ私のアプローチがうまくいかないのか、どのように修正するべきかを誰かが知っているのではないかと疑問に思っています。

私はcontent-typeをmpegに設定し、mpegファイルのデータを定期的に出力します。しかし、ビデオは非常に短い時間だけ持続し、ストリーミングを停止します。私のコードはPythonのようなものです。

print "Content-type: video/mpeg" 
print 
f = open("test2.mpg") 
while (True): 
    st = f.read(1024*1024) 
    sys.stdout.write(st) 
    time.sleep(0.5) 

これは正常に動作しますが、私は本当になぜこれらの2つのプログラムの出力が異なるのかわかりません。ファイル全体が生成されるまで私は読む前に待つことができないので、しかし、明らかに私は、このアプローチを使用することはできません。

print "Content-type: video/mpeg" 
print 
f = open("test2.mpg") 
print f.read() 

答えて

0

どのタイプのファイルがtest2.mpgですか? mpeg4ファイルの場合、ファイルの先頭または末尾にヘッダーがあるため、アプローチは機能しません。 ファイルがmpeg2トランスポートストリームの場合、これは機能するはずです。

0

のいずれか、あなたはおそらく、ファイルの終わりに当たっているので、あなたのループが失敗していますEOFErrorやどこかでクラッシュするビデオがリアルタイムで生成されている場合は、test2.mpgがFIFOパイプ(mkfifoを使用して作成されたもので、一度に1つのリーダーしか持てません)でない限り、パイプから読み取るとデータが返されず、ループは、ビデオデータが保存されるよりはるかに速く実行される可能性があります。したがって、EOFを処理する戦略が必要です。

また、このプログラムのsys.stdout.write()行の後と、他のプログラムのビデオストリームの後の両方で、出力を確実にフラッシュする必要があります。ループには終了条件と出力がないため、データの書き込みが終わることはありません。ループの1回の繰り返し後に何かが失敗し、Webサーバーがバッファされたデータを破棄することがあります。

さらに、一度に1MBの一定サイズを読み取ると、レイテンシの問題が発生する可能性があります。レイテンシを向上させるには、より小さなサイズを使用することをお勧めします。しかし、より良い品質とスループットのために、より大きなサイズを使用することができます。ただし、ビデオ、CGIスクリプト、またはWebサーバーを生成するプログラムがすべて一定の間隔でフラッシングするわけではありません。

「選択」または「ポーリング」/ epollを調べることをお勧めします。これらの方法のいずれかを使用すると、読み込みをよりよく制御でき、データがなくなるまでファイルを終了することができます利用可能です。あなたが眠る必要がある(0.5)ことがわかった場合は、選択/ポーリングを正しく使用する方が良いかもしれません。

関連する問題