3

まず、私の下手な英語で申し訳ありません。C++ でビデオ ストリーミング サーバーを作成しています。1 つの TS-FILE として HTTP 経由でストリーミングする必要がある複数の mpeg2-ts ファイル (映画と広告) があります。問題は、すべての mpeg-ts ファイルに独自のタイムスタンプ (PCR、PTS、DTS) があることです。そして、私が理解しているように、連続したストリーミング フローを作成するには、すべての新しい PCR (PTS、DTS) 値が最後の PCR (PTS、DTS) 値から継続する必要があります。

これは、私が言っていることをよりよく理解するための写真です: http://i.stack.imgur.com/vL1m6.png (メッセージに私の写真を直接含めることはできません。申し訳ありません)

pcr`1、pcr`2、pcr`3 のタイムスタンプを新しいものに置き換える必要があります。たとえば、pcr3 タイムスタンプを含む ts-packet を送信し、さらにいくつかの ts パケット (PCR の値を含まない) を送信した後、アドバタイズメントを挿入したいと考えています。私の質問は、pcr`1、pcr`2、pcr`3 などの新しい値をどのように計算するのですか?

現在のビデオのビットレートを計算し、最後の PCR タイムスタンプ (この場合は pcr3) 以降にプログラムが送信したビット数をこのビットレートで割るのは正しいですか? つまり、(新しいタイムスタンプ) = (前のタイムスタンプ) + (ビット数) / (ビットレート) です。または、より効率的な方法はありますか?

PTS と DTS のタイムスタンプについては、これらのタイムスタンプが非線形になる可能性があることをここで読みました。最後に受け取った元の PCR と比較して計算するのは正しいでしょうか? つまり:

pts_new = (original_pts - last_original_pcr) + pcr_new. 
dts_new = (original_dts - last_original_pcr) + pcr_new. 

(original_pts - last_original_pcr) is the difference between pts and pcr values
pcr_new is the last modified pcr value

私のプログラムは、mpeg-ts ストリームでこれらのタイムスタンプを読み取って編集できます。幸いなことに、その方法に関する文献はたくさんあります。しかし、これらのタイムスタンプの新しい値を計算するにはどうすればよいでしょうか?

mpeg2-ts の仕様を学習し始めたばかりで、何か間違っている場合は訂正してください。前もって感謝します。あなたが私を理解してくれることを願っています。

4

1 に答える 1

5

Mpeg2 の「スプライシング」は一種の芸術形式であり、2 つのストリームを連結するよりもはるかに複雑です。多くの企業が特許を取得している操作が必要です ( http://www.google.com/patents/US6380991http://www.google.com/patents/US6806909http://www.google.com/patents/US6993081 )

あなたの質問のいくつかに答えるために: 次の pcr の計算は問題ないように見えますが、DTS/PTS の多くのコンプライアンスの問題 (たとえば、etr290) を考慮する必要があります。最も基本的なスプライスは、最初の TS の最後のタイムスタンプから続くように、広告の pts/dts を再スタンプするだけです。

ad first timestamp = last timestamp + frame interval

トリックは、プレゼンテーションのタイムスタンプまたはデコードのタイムスタンプに「穴」がないことを確認することにあります。これは難しい部分であり、MPEG2 バッファ (tstd、eb、mb) に関する深い理解が必要です。

幸運を。

于 2013-05-13T11:04:04.470 に答える