### [HTML5 video 标签属性全解与音视频兼容处理实战:自动播放、编码格式、微信内核与流媒体选型](https://www.huociguo.com/article/1914)
**Published:** 2026-10-05T05:07:23
**Author:** 米了
**Excerpt:** 音视频这块,看着就是一行 的事,真上了线才发现到处是坑:iPhone 上点播放直接跳全屏、静音能放有声放不了、…
音视频这块,看着就是一行 `
```
这几条都要写在 HTML 标签上。用 JS 动态 `setAttribute` 在部分版本不生效,因为内核在解析阶段就决定了用哪种播放器。需要感知全屏状态时监听 X5 的自定义事件:
```
document.addEventListener('x5videoenterfullscreen', () => { /* 页面进入全屏 */ });
document.addEventListener('x5videoexitfullscreen', () => { /* 退出全屏 */ });
```
同层播放下依然有两个坑:一是视频区域上方的 UI 层级仍然可能出问题,交互元素尽量别压在视频正上方;二是移动端多视频滑动切换时,X5 容易出现残留画面,切换前先 `pause()` 再换 `src` 更稳。
流媒体在微信里的选择也要分开:iOS 微信是 WKWebView,原生 HLS 和 MSE 都还行;安卓 X5 对 hls.js 支持不稳定,直接把 m3u8 交给内核原生播放更省事。
## 直播与长视频:HLS、HTTP-FLV、MSE 怎么选 📡
选型写法:
```
const video = document.querySelector('#player');
const m3u8 = 'https://example.com/live/stream.m3u8';
if (video.canPlayType('application/vnd.apple.mpegurl')) {
video.src = m3u8; // Safari、iOS 走原生
} else if ('MediaSource' in window &&
MediaSource.isTypeSupported('video/mp4; codecs="avc1.42E01E,mp4a.40.2"')) {
const hls = new Hls(); // 其余走 hls.js
hls.loadSource(m3u8);
hls.attachMedia(video);
} else {
fallbackWithPosterAndTip(); // 都不支持就给提示
}
```
iPhone 上的 MSE 直到较新版本才有限支持,直播别依赖它。另外微信、QQ 浏览器会缓存 m3u8 和分片,地址后面挂个时间戳参数可以避免更新不及时。
## 控制条、全屏、画中画与字幕 🎛️
产品要求 UI 统一,就别用原生 `controls`,自己画:播放暂停绑 `play` / `pause`,进度条用 `timeupdate` 读 `currentTime`,缓冲进度读 `video.buffered.end(0)`。
全屏:标准是 `video.requestFullscreen()`;iPhone 上的 video 元素只有 `webkitEnterFullscreen()`,而且必须在用户手势里调用
画中画:判断 `document.pictureInPictureEnabled` 后调 `video.requestPictureInPicture()`,监听 `enterpictureinpicture` / `leavepictureinpicture` 同步 UI
字幕:`