Java 音视频流的基本同步方法

Java 音视频流的基本同步方法,java,android,sockets,synchronization,streaming,Java,Android,Sockets,Synchronization,Streaming,假设我有一些h264视频nal单元和一些g726音频样本塞进一个通过套接字发送的结构中 每个视频和音频数据包都带有UTC时间戳,时间戳为录制时间 数据通过TCP套接字发送。是的,我知道,这对流媒体来说不是很好,但它消除了一些我不想解决的问题 然后,我使用Android MediaCodec对渲染到表面的h264 nal单元进行解码,并使用g726++对接收到的音频数据进行解码,然后通过AudioTrack播放 这一切都是伟大的工作,除了流肯定是不同步 我的时间戳来自编码器 如何使用这些时间戳在解

假设我有一些h264视频nal单元和一些g726音频样本塞进一个通过套接字发送的结构中

每个视频和音频数据包都带有UTC时间戳,时间戳为录制时间

数据通过TCP套接字发送。是的,我知道,这对流媒体来说不是很好,但它消除了一些我不想解决的问题

然后,我使用Android MediaCodec对渲染到表面的h264 nal单元进行解码,并使用g726++对接收到的音频数据进行解码,然后通过AudioTrack播放

这一切都是伟大的工作,除了流肯定是不同步

我的时间戳来自编码器

如何使用这些时间戳在解码器端将视频与音频同步。AudioTrack有一个基于采样率的getPlaybackHeadPosition可用于计算其进度。MediaCodec具有显示时间。除了编码器的时间戳,我想我有足够的信息来同步这两个流


欢迎提供任何建议。

“是的,我知道,这对流媒体不太好”-嗯,这是一种流媒体协议,所以我一点也不明白。“除了流肯定不同步之外,这一切都很好。”-您只有一个流,TCP数据没有收到错误。“我如何使用这些时间戳将视频同步到解码器端的音频。”-是的,视频流很难。您必须接受延迟,并且必须接受缓冲。在缓冲队列中保持高水位线和低水位线,并以适当的速率从队列中取出数据。时间戳和延迟并不难,但你必须做到:(“基本”和“音频/视频流”不属于同一个问题。通常情况下,UDP用于流,您可以在端点管理顺序。我正在使用TCP跳过这一点。它在播放方面不同步,是的,我按顺序接收所有内容,但如果我进行简单播放,音频和视频之间会有很大的差距(即不进行唇形同步)。我不是在寻找一个完美的唇形同步解决方案,我只是想接近。我拥有的时间戳是基于编码器的挂钟。接收器获得这些时间戳很好。我只是不确定从那里开始播放时的同步。视频和音频流是连续的吗?如果是,大概是不同步偏移如果你能计算出并延迟哪个先从偏移量开始,它们就会同步?或者它们是许多单独的离散音频和视频样本,只有UTC时间戳来指示它们应该何时播放-这会困难得多。