首頁 > web前端 > H5教程 > 主體

html5 video 行動端詳解

小云云
發布: 2018-05-24 11:16:11
原創
7089 人瀏覽過

本文主要介紹了淺談html5 video 行動端填坑記,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟著小編過來看看吧,希望能幫助大家。

本文介紹了html5 video 行動端填坑記,分享給大家,具體如下:

<video id="video" 
  style="object-fit:fill" 
  autoplay
  webkit-playsinline 
  playsinline 
  x5-video-player-type="h5"
  x5-video-player-fullscreen="true"
  x5-video-orientation="portraint" 
  src="video.mp4" />
</video>
<!--
  object-fit: fill   视频内容充满整个video容器
  poster:"img.jpg" 视频封面
  autoplay: 自动播放
     auto - 当页面加载后载入整个视频
     meta - 当页面加载后只载入元数据
     none - 当页面加载后不载入视频

  muted:当设置该属性后,它规定视频的音频输出应该被静音

  webkit-playsinline playsinline:   内联播放

  x5-video-player-type="h5" :  启用x5内核H5播放器
  x5-video-player-fullscreen="true"  全屏设置。ture和false的设置会导致布局上的不一样
  x5-video-orientation="portraint" :声明播放器支持的方向,可选值landscape 横屏,portraint竖屏。
                                     默认值portraint。无论是直播还是全屏H5一般都是竖屏播放,
                                     但是这个属性需要x5-video-player-type开启H5模式
-->
登入後複製

#自動播放

設定autoplay屬性

<video autoplay></video>
登入後複製

行動瀏覽器中

但是在很多行動瀏覽器裡,都是要求使用者的真實操作來(touchend、click、doubleclick 或keydown 事件等標準的事件)觸發呼叫video.play(),才能自動播放影音影片。

 dom.addEventListener(&#39;click&#39;, function () {
   video.play()
})
登入後複製

微信中

也可以在  wx.ready()中觸發video.play()

wx.ready(function () {
  video.play()
})
登入後複製

內聯播放

設定屬性webkit-playsinline playsinline

<video id="video" webkit-playsinline playsinline /></video>
登入後複製

在iOS Safari和一些安卓的一些瀏覽器下播放視頻的時候,不能在h5頁面中播放視頻,系統會自動接管視頻

如果需要在h5頁面內播放視頻,需要在視頻標籤上加上  webkit-playsinline,在iOS10以後,需要加上playsinline,建議同時加上這兩個屬性。同時也需要app支援這種模式

webview.allowsInlineMediaPlayback = YES;
登入後複製

ios手Q和微信都支援這種模式,但是android 微信就掛了

android 微信


##android微信內建瀏覽器採用騰訊X5內核,不遵循X5web標準,video強制全螢幕就是其一。影片播放完畢後還會出現QQ自己的影片推薦

據說,其有個白名單,白名單下的影片資源,就不會全螢幕。但是騰訊已經不能再增加白名單了。尿性,無解。 。 。 。 。 。 目前還有一個解決方法,就是使用h5  canvas 播放video

#canvas 播放影片


##使用canvas 遇到的坑:video 必須加x5-video-player-type="h5" 屬性,否則,在移動端就會卡死不能播放視頻,個人認為是因為視頻被接管的原因導致。

<p class="wrapper">
  <video id="video" style="display: none" autoplay src="video.mp4" x5-video-player-type="h5"></video>
  <canvas id="canvas"></canvas>
</p>
<script>
  var video = document.querySelector(&#39;#video&#39;)
  var canvas = document.querySelector(&#39;#canvas&#39;)
  var wrapper = canvas.parentNode
  var width = wrapper.offsetWidth
  var height = wrapper.offsetHeight
  var ctx = c.getContext(&#39;2d&#39;)
  var time = null
  canvas.width = width
  canvas.height = height

  canvas.addEventListener(&#39;click&#39;, function () {
    video.play()
  })

  video.addEventListener(&#39;play&#39;, function () {
      time = window.setInterval(function () {
        ctx.drawImage(v, 0, 0, width, height);
      }, 20);
  }, false);

  video.addEventListener(&#39;pause&#39;, function () {
      window.clearInterval(time);
  }, false);

  video.addEventListener(&#39;ended&#39;, function () {
      window.clearInterval(time);
  }, false);
</script>
登入後複製

最後發現,雖然使用canvas播放視頻,android微信中可以屏蔽全屏視頻播放完的推薦視頻。但是還沒辦法禁止影片播放時 的全螢幕問題。還是得萬惡的白名單。吐槽。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 更坑爹的是沒有找到js觸發退出全螢幕的方法。

ios黑屏問題

ios 在播放影片時,會出現短暫的黑屏,然後正常顯示。

解決方法:

在影片上層覆蓋一個 新增一個p並用一張圖片填充,製造播放前載入假象。然後監聽事件timeupdate ,影片播放有畫面時移除這個「p塊」###
video.addEventListener(&#39;timeupdate&#39;, function(){
  if(video.currentTime > 0.1){
      posterImg.hidden();
  }
})
登入後複製
#######Media 方法與屬性#########HTMLVideoElement和HTMLAudioElement 皆繼承自HTMLMediaElement###
// 媒体错误
MediaObj.error; //null:正常
MediaObj.error.code; //1.用户终止 2.网络错误 3.解码错误 4.URL无效

//媒体当前状态
MediaObj.currentSrc; //返回当前资源的URL
MediaObj.src = value; //返回或设置当前资源的URL
MediaObj.canPlayType(type); //是否能播放某种格式的资源
MediaObj.networkState; //0.此元素未初始化 1.正常但没有使用网络 2.正在下载数据 3.没有找到资源
MediaObj.load(); //重新加载src指定的资源
MediaObj.buffered; //返回已缓冲区域,TimeRanges
MediaObj.preload; //none:不预载 metadata:预载资源信息 auto:

//准备状态
MediaObj.readyState;//1:HAVE_NOTHING 
                    //2:HAVE_METADATA 
                   //3.HAVE_CURRENT_DATA 
                  //4.HAVE_FUTURE_DATA 
                 //5.HAVE_ENOUGH_DATA
MediaObj.seeking; //是否正在seeking

//回放状态
MediaObj.currentTime = value; //当前播放的位置,赋值可改变位置
MediaObj.startTime; //一般为0,如果为流媒体或者不从0开始的资源,则不为0
MediaObj.duration; //当前资源长度 流返回无限
MediaObj.paused; //是否暂停
MediaObj.defaultPlaybackRate = value;//默认的回放速度,可以设置
MediaObj.playbackRate = value;//当前播放速度,设置后马上改变
MediaObj.played; //返回已经播放的区域,TimeRanges,关于此对象见下文
MediaObj.seekable; //返回可以seek的区域 TimeRanges
MediaObj.ended; //是否结束
MediaObj.autoPlay; //是否自动播放
MediaObj.loop; //是否循环播放
MediaObj.play(); //播放
MediaObj.pause(); //暂停

//视频控制
MediaObj.controls;//是否有默认控制条
MediaObj.volume = value; //音量
MediaObj.muted = value; //静音

//TimeRanges(区域)对象
TimeRanges.length; //区域段数
TimeRanges.start(index) //第index段区域的开始位置
TimeRanges.end(index) //第index段区域的结束位置

//【★★★**相关事件**★★★】
//事件分发
var eventTester = function(e){
    Media.addEventListener(e,function(){
        console.log((new Date()).getTime(),e)
    },false);
}
//事件监听
eventTester("loadstart"); //客户端开始请求数据
eventTester("progress"); //客户端正在请求数据
eventTester("suspend"); //延迟下载
eventTester("abort"); //客户端主动终止下载(不是因为错误引起)
eventTester("loadstart"); //客户端开始请求数据
eventTester("progress"); //客户端正在请求数据
eventTester("suspend"); //延迟下载
eventTester("abort"); //客户端主动终止下载(不是因为错误引起),
eventTester("error"); //请求数据时遇到错误
eventTester("stalled"); //网速失速
eventTester("play"); //play()和autoplay开始播放时触发
eventTester("pause"); //pause()触发
eventTester("loadedmetadata"); //成功获取资源长度
eventTester("loadeddata"); //
eventTester("waiting"); //等待数据,并非错误
eventTester("playing"); //开始回放
eventTester("canplay"); //可以播放,但中途可能因为加载而暂停
eventTester("canplaythrough"); //可以播放,歌曲全部加载完毕
eventTester("seeking"); //寻找中
eventTester("seeked"); //寻找完毕
eventTester("timeupdate"); //播放时间改变
eventTester("ended"); //播放结束
eventTester("ratechange"); //播放速率改变
eventTester("durationchange"); //资源长度改变
eventTester("volumechange"); //音量改变
登入後複製
###相關推薦:############HTML5 video 實作瀏覽器相容的方法############行動程式video影片播放的問題案例總結## ##########簡述
相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!