0

私は独自の RTSP プッシュ ソース DirectShow フィルター (CBaseFilter) を作成しました。これは、H264 で魅力的に機能します。しかし、MPEG4 (MP4V-ES ストリーム) をサポートしようとすると、問題が発生しました... ストリームがデコードされ (ffdshow Video Decoder フィルタまたは DivX Video Decoder を使用)、正確に 10 秒間完全にレンダリングされます。画像は 15 fps で流暢ですが、10 秒後には fps が大幅に低下し、IVOP のみがデコードされ、PVOP/BVOP は破棄されます。

それから私は自分のコードをいじり始め、MPEG4 RTP ペイロードを正しくデパケット化し、メディア サンプルをデコーダに正しく送信し、それらを正しくリリースしCBaseOutputPin::DecideBufferSize()、本来のように仕事をし、IMediaSample::SetTime()正しく呼び出していることを発見しました...しかし、サンプルをデコーダーに配信するこのコードを変更すると、次のようになります。

hr = videoPin->Deliver(sample);
sample->Release();

このコードで(最初の行に注意してください)

videoPin->DeliverNewSegment(REFERENCE_TIME(start), REFERENCE_TIME(end), 1.0);                                               
hr = videoPin->Deliver(sample);
sample->Release();

ビデオは 10 秒以降も滑らかですが (fps は 15 のままです)、画像はすべてめちゃくちゃです... IVOP が適切にデコードされず、シーンの静的な部分にいくつかのアーティファクトがあるように。

では、CBaseOutputPin::DeliverNewSegment() をどのように使用すればよいでしょうか? そして、なぜ私はそれが必要なのですか?

ビデオストリームが流暢にデコードされないようにするので、必要だと思うので...

私はグーグルで検索しましたが、運がありませんでした。どんな助けでも大歓迎です。ありがとう。

アップデート

メソッドのvideoPin->DeliverNewSegment(tStart, tStop, dRate)パラメーターdRateは次のとおりです。

このセグメントを処理するレート (元のレートのパーセンテージ)。

したがって、代わりにストリーム1.0を配置100.0すると、想定どおりに流れますが、いくつかのフレーム間で遅延が発生します。でもこれが今までで一番!

4

1 に答える 1

1

NewSegment があなたが見ている問題を引き起こしているとは確信していません。NewSegment は、単一のパケットでプッシュするデータが開始時間または停止時間を超える場合に使用され、デコーダーが停止時間までしか配信できないようにします。この場合、ストリーミングの開始時に NewSegment (0, MAX_LONGLONG, 1) を 1 回呼び出すことができます。

問題が発生した場合は、デコーダ出力のレイテンシを確認する必要があります (タイムスタンプを現在のストリーム時間と比較します)。

G

于 2011-06-21T17:47:24.363 に答える