1

我需要在 Windwso Phone 应用程序中使用 MediaElement 显示流视频。

我从 web 服务获取一个流,其中包含 H264 格式的帧和原始 AAC 字节(奇怪,但ffmpeg只能使用参数解析-f ac3)。

因此,如果尝试仅播放其中一个流(音频或视频),它会播放得很好。但是我在尝试两者时都有问题。

例如,如果我报告没有时间戳的视频样本并报告带有时间戳的音频,我的视频播放速度会比我需要的快 3 到 5 倍。

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

                ReportGetSampleCompleted(msSamp);

从我的网络服务中,我获得了以下格式的视频和音频帧的 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 回答