1

Windwso Phone アプリケーションで MediaElement を使用してストリーム ビデオを表示する必要があります。

H264形式のフレームと生のAACバイトを含むストリームをWebサービスから取得しています(奇妙ですが、パラメーターのみでffmpeg解析できます)。-f ac3

そのため、ストリーム (オーディオまたはビデオ) の 1 つだけを再生しようとすると、うまく再生されます。しかし、両方を試すと問題が発生します。

たとえば、ビデオ サンプルをタイムスタンプなしでレポートし、オーディオタイムスタンプ付きでレポートすると、ビデオは必要な速度の 3 倍から 5 倍速く再生されます。

MediaStreamSample msSamp = new MediaStreamSample(
                    _videoDesc,
                    vStream,
                    0,
                    vStream.Length,
                    0,
                    _emptySampleDict);

                ReportGetSampleCompleted(msSamp);

私の Web サービスから、ビデオとオーディオ フレームの DTS と PTS を次の形式で取得します。

120665029179960

しかし、サンプル用に設定すると、オーディオ ストリームの再生が遅すぎて遅延が発生します。

タイムベースは90khzです。

それで、誰かがそれを解決する方法を教えてもらえますか? たぶん、サンプルの他のタイムスタンプを計算する必要がありますか? もしそうなら、道を教えてください。

ありがとう。

4

1 に答える 1

2

わかりました、解決しました。

では、A/V を同期するために必要なことは次のとおりです。

フレームレートを使用して、各ビデオおよびオーディオ フレームの正しいタイムスタンプを計算します。

たとえば、ビデオの場合は 90 kHz、オーディオの場合は 48 kHz で毎秒 25 フレームです。フレームの増分は次のようになります。

_videoFrameTime = (int)TimeSpan.FromSeconds((double)0.9 / 25).Ticks;
_audioFrameTime = (int)TimeSpan.FromSeconds((double)0.48 / 25).Ticks;

次に、各サンプルにこれらの値を追加する必要があります。

private void GetAudioSample()
{
... 
/* Getting sample from buffer */
MediaStreamSample msSamp = new MediaStreamSample(
                    _audioDesc,
                    audioStream,
                    0,
                    audioStream.Length,
                    _currentAudioTimeStamp,
                    _emptySampleDict);

_currentAudioTimeStamp += _audioFrameTime;

ReportGetSampleCompleted(msSamp);
}

gettign ビデオ フレームのメソッドは、代わりに _videoFrameTime のインクリメントと同じになります。

これが誰かに役立つことを願っています。

ローマン。

于 2012-08-29T14:23:06.490 に答える