同步音频和视频

时间:2012-08-29 07:25:14

标签: silverlight windows-phone-7 decode h.264 mediastreamsource

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

我从Web服务获得一个包含H264格式的帧和raw-AAC字节的流(奇怪,但ffmpeg只能解析-f ac3参数。)

因此,如果尝试只播放一个流(音频或视频),它就会很好玩。但尝试两者时我都有问题。

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

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

                ReportGetSampleCompleted(msSamp);

从我的网络服务中,我得到了以下格式的视频和音频帧的DTS和PTS:

  

120665029179960

但是当我将其设置为示例时,我的音频流播放速度太慢且延迟。

时基是90khz。

那么,有人可以告诉我如何解决它吗?也许我应该计算其他样本的时间戳?如果是这样,请告诉我。

感谢。

1 个答案:

答案 0 :(得分: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增量相同。

希望这对某人有帮助。

罗马。