video无法动态改变src以及在ios无法自动播放的问题处理
问题:
移动端和pc端使用不同的视频
动态替换source不起作用,
动态替换视频的src,src写在video标签中,然后动态渲染dom
代码如下
{isPhone ? ( //手机端渲染这个video标签 <video className="w-full h-full object-cover " ref={videoTag} autoPlay loop muted poster={'/images/video-poster.png'} src="//i2.wp.com/xxx.mp4" > </video> ) : ( //非手机 / pc端渲染这个video标签 <video className="w-full h-full object-cover " ref={videoTag} autoPlay loop muted poster={'/images/video-poster.png'} src="//i2.wp.com/xxx.webm" ></video> )}
but
写完之后发现 视频在手机端一直加载不出来
排查最终发现是视频的编码格式问题
video标签支持的视频格式如下
关于video标签所支持的视频格式和编码:
MPEG4 = 带有H.264视频编码和AAC音频编码的MPEG4文件
WebM = 带有VP8视频编码和Vorbis音频编码的 WebM文件
Ogg = 带有Theora视频编码和Vorbis音频编码的Ogg文件
转换格式之后正常显示
but
又出现问题了
安卓设备视频正常显示
但ios中视频不会显示 没有播放
原因是:
视频使用了autoplay
ios设备默认禁止autoplay?
最终解决方法是:
添加preload属性 preload=“auto”
MDN官网对这个属性的解释如下
https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/video#preload
该枚举属性旨在提示浏览器,作者认为在播放视频之前,加载哪些内容会达到最佳的用户体验。可能是下列值之一:
?
?
?
? 空字符串: 和值为
其中
添加了preload=“auto” 之后,解决了以上问题并正常显示
最终代码:
{isPhone ? ( <video className="w-full h-full object-cover " ref={videoTag} autoPlay preload="auto" loop playsInline muted poster={'/images/video-poster.png'} src="//i2.wp.com/xxx.mp4" > </video> ) : ( <video className="w-full h-full object-cover " ref={videoTag} autoPlay loop muted poster={'/images/video-poster.png'} src="//i2.wp.com/xxx.webm" ></video> )}