1

Python の Twisted.web と ffmpeg へのコールバックを使用して、ビデオ ストリーマーを構築しています。

「return file.read()」を使用してファイルを送信しているため、トランスコードされた出力を完全に読み取ることができないため、送信に問題が発生するのではないかと思っています。これは考えすぎで、Twisted.web の低レベルの管理コードによってすべて管理されているのでしょうか、それとも方法を再考する必要がありますか?

さらに、バッファリングされていないビデオの部分にスキップするユーザーをサポートするにはどうすればよいですか? 本当に複雑になると思いますが、そうでない場合に備えて。

ありがとう

4

1 に答える 1

3

1)ツイストで file.read() を使用できますか?

短い答えは「いいえ」です。

fd に O_NONBLOCK を設定したり、このリクエストを別のスレッドに明示的に委任したりするなど、他の比較的複雑なことをたくさん行っていない限り、これfile.read()はブロッキング呼び出しであり、ファイル全体をメモリに読み取ってから返します。

このデータがディスクから同期的に読み取られている間、Twisted のリアクターはコールバックを呼び出したり、fds で利用可能なデータを読み書きしたりすることができず、ファイルが読み取られている間、他の保留中のリクエストまたはストリーミング転送が完全に停止します。メモリに。

さらに、ファイルのソース ボリュームの負荷が高い場合やファイルが多数ある場合は、open()ファイル オブジェクトを取得するための呼び出しでさえ、かなりの時間ブロックされる可能性があります。ノンブロッキング オープンがないため、ファイル オブジェクトが必要なreactor.deferToThread()場合は、ツイストで通常のファイル オブジェクトを取得する必要がある場合に使用する必要があります。

したがって、次のことを行う必要があります。

twisted でファイルシステムから直接ファイルを読み取るには、twisted.web.server.Site と twisted.web.static.File を調べる必要があります。それらに関する興味深いチュートリアルがここにあります。これらの呼び出しは、ディスクからファイル コンテンツをストリーミングするだけでなく、HTTP Range 要求などの静的ファイル用の追加の HTTP 機能もサポートします。

2) バッファリングされていないビデオの部分にスキップするユーザーをサポートするにはどうすればよいですか?

これは一般にスクラブと呼ばれ、基本的に HTML5 スクラブと時間ベースのスクラブの 2 種類のスクラブがあります。

前者 (HTML5 スクラビング) は、"HTTP 範囲リクエスト" を巧妙に表現したものにすぎず、Safari Mobile、Quicktime、mplayer などのネイティブ ブラウザーとプラグイン、および html5 タグを実装するすべてのブラウザーでサポートされています。twisted.web.static.Fileこれは、最初の質問への回答で言及し たことによって裏付けられています。

後者 (時間ベースのスクラビング) は、スクラビングをサポートする従来の方法です。これは基本的に、カスタム プレーヤー (jwplayer や OSMF など) とサーバーとの間の合意であり、特定のクエリ パラメーターで指定された時間オフセットで開始するビデオをプレーヤーが要求できるようにします。

-itsoffsetこれは、必要なクエリ パラメータから取得したパラメータを使用してサブプロセスで ffmpeg を開始するか、ディスクの入力ファイルを使用するか、お気に入りの webserver のモジュールを使用することで、ハックに実行できます。どちらの方法でも、送信するクエリ パラメータを理解するプレーヤーが必要です。

于 2012-12-02T03:21:08.173 に答える