私は独自の 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
すると、想定どおりに流れますが、いくつかのフレーム間で遅延が発生します。でもこれが今までで一番!