xqq / mpegts.js

HTML5 MPEG2-TS / FLV Stream Player
Apache License 2.0
1.61k stars 203 forks source link

flv头指定了有音频数据,但实际发送的流没有音频数据,无法播放 #191

Open alun0829 opened 2 months ago

alun0829 commented 2 months ago

因为实际应用中,无法事先确定设备是否存在音频,所以统一在flv头中设置了有音频标志,但是发送的flv流没有音频数据,这样就导致了播放界面黑屏。 经过调试发现问题在于下面一行: let ms = this._mediaSource = this._useManagedMediaSource ? new self.ManagedMediaSource() : new self.MediaSource();

当flv流包含视频和音频时,this._mediaSource是正确的,其中的 activeSourceBuffers 数组有2个元素。 当flv流只有视频无音频时,activeSourceBuffers 数组元素个数为0,是否可以理解为:视频和音频的缓冲区全都没有?

源码中无法找到 self.MediaSource() 定义,不知道该如何修改,才能实现无音频时能正常播放视频。 看到有人提过类似的问题,但是没有可靠的解决方案。

@xqq大神说:确保 onMetaData 里面的 hasAudio / hasVideo 是准确的,客户端不指定则一般没有问题。 但是这个onMetaData里也是根据flv头中指定的标志来的,无法根据实际情况变化。因为在初始化创建this._mediaSource就已经出问题了

求大神给点思路,非常感谢!!!

bosscheng commented 1 month ago

@alun0829 一旦有了音频标志了,就会初始化sourceBuffer 的,如果后续没有音频流数据过来,mse 是没法播放成功的,因为底层需要支持音视频同步的。