Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
alun0829 opened this issue May 7, 2024 · 3 comments

Comments

@alun0829
Copy link

alun0829 commented May 7, 2024

因为实际应用中,无法事先确定设备是否存在音频,所以统一在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
Copy link

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

@sacter
Copy link

sacter commented Aug 23, 2024

如果是flv的就在flv-demuxer.js中改一下代码,其他的在对应解析器文件中做更改。使用时默认都有音频,解析音频没有匹配上mp3和aac之后改为没有音频就可以了。
// Force-override audio track present flag, boolean
set overridedHasAudio(hasAudio) {
this._hasAudioFlagOverrided = true;
this._hasAudio = this._hasAudio ? hasAudio : false;
this._mediaInfo.hasAudio = hasAudio;
}
if (soundFormat !== 2 && soundFormat !== 10) { // MP3 or AAC
this._hasAudio = false;
this._onError(DemuxErrors.CODEC_UNSUPPORTED, 'Flv: Unsupported audio codec idx: ' + soundFormat);
return;
}

@Talking-mute
Copy link

自适应不行嘛,非要指定?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants