1

libtorrent を介してストリーミング クライアントを作成するプロジェクトに取り組んでいます。私はpythonクライアント(pythonバインディング)を使用しています。これらの関数set_sequential_download()およびset_piece_deadline( ) について多くのことを検索しましたが、ピースを順番に強制的にダウンロードする方法についての良い答えが見つかりませんでした。つまり、最初のピース 1、次に 2,3,4 など.

フォーラムで人々がこれを尋ねているのを見ましたが、成功するために変更を行う必要があることについて、誰も良い答えを得ていません。

set_sequential_download()は順番にピースを要求するだけだと理解しましたが、実際にはランダムにダウンロードされます。set_piece_deadline()を使用してピースの締め切りを変更しようとしましたが、各ピースを増やしましたが、まったく機能しません。

** アップデート

私が達成しようとしている目標は、一度に 1 つずつダウンロードすることで、急流を介してストリーミングを作成できるようにすることです。

ベンに感謝します。

4

2 に答える 2

1

私はあなたと同じ問題に遭遇しました。torrent をシーケンシャル ダウンロードに設定するということは、部分がある程度順序付けられた方法でダウンロードされることを意味します。これは、ストリーミングの直感的なソリューションかもしれません。ただし、ビデオのストリーミングは、すべての部分を順番にダウンロードするよりも複雑です。

ビデオ ファイルは、さまざまなコンテナー (mkv、mp4、avi など) とさまざまなコード (h264、theora など) で提供されます。一部のコーデック/コンテナは、ファイル内の異なる場所にメタデータ/ヘッダーを保存します。頭のてっぺんから思い出せませんが、特定のコンテナ/コーデックはすべてのヘッダー情報をファイルの最後に保存します。このようなファイルは、連続してダウンロードするとうまくストリーミングできない場合があります。

ストリーミングを開始するために必要な部分を決定するためのコードを作成しない限り、既存のメカニズムに依存する必要があります。たとえば、Mplayer のブラウザー ビデオ プレーヤー VLC を生成する Peerflix を考えてみましょう。これらのアプリケーションは、さまざまなコンテナー/コーデックに必要なバイト範囲を把握しています。Peerflix が VLC を起動して AVI ファイルを再生すると、VLC は最初の数バイトと最後の数バイト (ヘッダー) を読み取ろうとします。

Peerflix の背後にある天才は、独自の Web サーバーを介してビデオ ファイルを提供しようとするため、VLC が求めているファイルのバイト範囲を認識していることです。次に、バイト範囲がどの部分に該当するかを判断し、それらの部分に優先順位を付けます。Peerflix は Node.js BitTorrent ライブラリを使用していますが、その正確な優先順位付けメカニズムは私にはわかりません。ただし、libtorrent-rasterbar の場合、set_piece_deadline() 関数を使用すると、必要な部分をライブラリに通知できます。私の経験では、必要なピースを決定したら、短い期限 (50 ミリ秒程度) で set_piece_deadline() を呼び出し、到着を待ちます。set_piece_dealine() の使用は、順次ダウンロードと互換性がないことに注意してください (単に false に設定してください)。

注意すべきことの 1 つは、libtorrent-rasterbar は、ピースを取得してもすぐにハード ドライブに書き込まないことです。これは、作品が到着したときにファイルからそのバイト範囲を読み取ろうとしたために陥った罠です。このためには、スレッドを実行して libtorrent-rasterbar がアプリケーションに渡すアラートをキャッチする必要があります。具体的には、read_piece_alert でそのピースの生のバイナリ データを受け取ります。

于 2015-11-27T11:06:51.420 に答える