Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >「简单实战」YouTube Iframe API 的使用

「简单实战」YouTube Iframe API 的使用

作者头像
拾贰
发布于 2019-08-28 02:56:53
发布于 2019-08-28 02:56:53
4.5K00
代码可运行
举报
文章被收录于专栏:前端讲堂前端讲堂
运行总次数:0
代码可运行

前言

业务需求需要在自己的网页上嵌入油管( youtube )上的视频,所以去踩了油管 IFrame Player API 的坑。其实和大多数国内视频网站的 ifram Embed 方式是相似,比如说爱奇艺、腾讯视频、优酷等。在这些视频网站上你会发现都有分享功能,其中有一项就是通用代码。油管提供的 IFrame Player API 也是类似的方案。

0. 网页中基本使用

要使用 IFrame Player API 需要浏览器支持 postMessage 功能。

油管上直接放出了代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!DOCTYPE html>
<html>
  <body>
    <!-- 1. The <iframe> (and video player) will replace this <div> tag. -->
    <div id="player"></div>

    <script>
      // 2. This code loads the IFrame Player API code asynchronously.
      var tag = document.createElement('script');

      tag.src = "https://www.youtube.com/iframe_api";
      var firstScriptTag = document.getElementsByTagName('script')[0];
      firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);

      // 3. This function creates an <iframe> (and YouTube player)
      //    after the API code downloads.
      var player;
      function onYouTubeIframeAPIReady() {
        player = new YT.Player('player', {
          height: '360',
          width: '640',
          videoId: 'M7lc1UVf-VE',
          events: {
            'onReady': onPlayerReady,
            'onStateChange': onPlayerStateChange
          }
        });
      }

      // 4. The API will call this function when the video player is ready.
      function onPlayerReady(event) {
        event.target.playVideo();
      }

      // 5. The API calls this function when the player's state changes.
      //    The function indicates that when playing a video (state=1),
      //    the player should play for six seconds and then stop.
      var done = false;
      function onPlayerStateChange(event) {
        if (event.data == YT.PlayerState.PLAYING && !done) {
          setTimeout(stopVideo, 6000);
          done = true;
        }
      }
      function stopVideo() {
        player.stopVideo();
      }
    </script>
  </body>
</html>

直接给出了注释,很清晰明了。当然 https://www.youtube.com/iframe_api 也是可以直接用 script 标签直接引入。其中 videoId 可以在油管上找到。我们随便找一个视频就可以在地址栏看到 https://www.youtube.com/watch?v=PkZNo7MFNFg 后面的 v=PkZNo7MFNFg 这个就是 videoId

1. 基本参数

油管的 IFrame Player API 可自定义的程度并不高,可能也是出于要保护对自家产品利益的目的,视频播放结束后推荐列表之类的是去不掉的。

参数名

说明

autoplay

取值0和1,自动播放。默认为0。(我自己试了好像不生效,Stack Overflow 上有人说改了)

cc_lang_pref

显示字幕的默认语言,取值为 ISO 639-1双字母语言代码

cc_load_policy

值:1。默认根据用户偏好设置确定的。设为1会使系统在默认情况下显示字幕,即使在用户关闭字幕。

color

进度条颜色,只有两种可选 red 和 white,设置成 white 时,modestbranding 无效。

modestbranding

是否显示 YouTube 徽标。

controls

是否显示播放器控件 0 不显示,1 显示,默认 1。

disablekb

是否允许键盘控制,0 允许,1 不允许,默认 0。

enablejsapi

是否允许通过 IFrame API 控制播放器。0 不允许,1 允许,默认 0。

end

播放多少秒后停止。(正整数)

fs

是否显示全屏按钮,0 不显示,1 显示,默认 1。

hl

播放器多语言。取值为 [ISO 639-1双字母语言代码。

iv_load_policy

显示视频注释,而设置为3不会显示视频注释。默认值为1。(我没发现默认注释是啥玩意)

listType

有效的参数值playlist,search和user_uploads。

list

结合 listType 确定播放列表的内容。

loop

循环播放视频,0 不循环,1循环。默认值为 0。单视频时需要在playlist放一个相同videoId

origin

大致就是安全域名吧。enablejsapi为 1 的时候,这个参数是当前域名。

playlist

要播放的视频列表,以逗号分隔的视频ID。

playsinline

控制在 iOS 全屏播放。0 全屏,1 不全屏。

start

从多少秒开始播放。(正整数)

widget_referrer

看了半天没看明白的 api 。(大致好像是表示来源……)

rel

播放结束后显示相关视频。0 不显示,1 显示。(这个api已经修改为0推荐同频道,1推荐相关)

showinfo (弃用)

是否显示视频标题和上传者等信息。0 不显示,1 显示。

onYouTubeIframeAPIReady 方法中直接传参就可以了,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function onYouTubeIframeAPIReady() {
  player = new YT.Player('player', {
    height: '360',
    width: '640',
    videoId: 'PkZNo7MFNFg',
    playerVars: {
      enablejsapi: 1,
      autoplay: 1,
      controls: 0,
      loop: 1,
      cc_lang_pref: 'en',
      iv_load_policy: 1,        
    },
    events: {
      'onReady': onPlayerReady,
      'onStateChange': onPlayerStateChange
    }
  });
}

2. 钩子函数(hook)

从上面的代码案例大家其实也看到了,在 events 里面有 onReadyonStateChange 其实对应的就是相应的钩子函数。

hook

作用

onReady

在播放器准备就绪后触发。

onStateChange

视频状态发生改变时会触发。

onPlaybackQualityChange

视频播放质量发生变化时触发。

onPlaybackRateChange

视频播放速率发生变化时触发。

onError

播放器中发生错误时触发。

onApiChange

播放器已加载(或卸载)具有公开 API 方法的模块触发。

使用方法就像案例一样。

3. YT.Player 对象方法(几个常用的)

方法名

作用

playVideo()

播放

pauseVideo()

暂停

stopVideo()

停止

seekTo(seconds:Number, allowSeekAhead:Boolean)

跳转到视频多少秒。seconds要跳转的秒数,allowSeekAhead 当秒数已经超出已缓冲时间,是否发出请求

nextVideo()

播放下一个视频

previousVideo()

播放上一个视频

playVideoAt(index:Number)

播放指定视频(index 必传,为视频列表下表)

mute()

设置为静音

unMute()

取消为静音

isMuted()

获取当前是否静音

setVolume(volume:Number)

设置播放器的当前音量

getVolume()

获取播放器的当前音量

setSize(width:Number, height:Number)

设置视频大小(单位:像素)

getPlayerState()

返回播放器的状态

getCurrentTime()

返回视频已播放的时长

getPlaybackQuality()

当前视频的实际质量

setPlaybackQuality(suggestedQuality:String)

设置当前视频的建议质量。suggestedQuality 参数的值可以为small、medium、large、hd720、hd1080、highres 或 default。

getDuration()

返回当前正在播放的视频的时长

getVideoUrl()

返回当前已加载/正在播放的视频的 YouTube.com 网址

getVideoEmbedCode()

返回当前已加载/正在播放的视频的嵌入代码。

getPlaylist()

按当前顺序返回播放列表中视频ID的数组。

getPlaylistIndex()

返回当前正在播放的播放列表中视频的索引。

使用方法我想不用说,大家都知道怎么用啦。player.playVideo()

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-07-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
LeetCode 141.环形链表 - JavaScript
Floyd 判圈算法类似龟兔赛跑,需要用到快指针 fast 和慢指针 slow。算法流程是:
心谭博客
2020/04/21
4320
每天一道leetcode141-环形链表
题目 每天一道leetcode141-环形链表 分类:链表 中文链接: https://leetcode-cn.com/problems/linked-list-cycle/description/ 英文链接 https://leetcode.com/problems/linked-list-cycle/description/ 题目详述 给定一个链表,判断链表中是否有环。 进阶: 你能否不使用额外空间解决此题? 题目详解 思路 使用两个指针,一个快指针,一个慢指针; 快的每次走两步,慢的每次走一步
乔戈里
2019/09/17
2690
【小Y学算法】⚡️每日LeetCode打卡⚡️——38.环形链表
如果链表中有某个节点,可以通过连续跟踪 next指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。
呆呆敲代码的小Y
2021/09/26
2910
【小Y学算法】⚡️每日LeetCode打卡⚡️——38.环形链表
LeetCode题解—链表中环的检测
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 pos为环的起点位置。
码上积木
2021/03/10
1.3K0
环形链表
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。
_kyle
2020/11/26
6030
环形链表
LeetCode笔记 | 链表(ing)
思路如下: 0.利用递归首先找到单链表的最后一个节点; 最后一个节点存储在re里面, re在找到最后一个节点时被赋值且其永远为最后一个节点的值,保持不变; 从找到最后一个节点开始, 从最后往前的方向,每一层递归反转一对节点 / 一个指向;
凌川江雪
2019/10/24
4720
LeetCode笔记 | 链表(ing)
单链表之环形链表
不论在面试或者刷题过程中,很大概率都会遇到环形链表这种类型的题目,例如 leetcode 141. 环形链表 以及 leetcode 142. 环形链表 II 等,本文主要介绍通过快慢指针法来解决此类题型,以供大家参考。
程序员小熊
2021/05/28
5140
单链表之环形链表
LeetCode之链表(10)
今天有点闲,就来连刷几道题,下次不这样干了,有点hold不住,建议以后保持平衡刷题规律!
公众号guangcity
2019/09/20
4040
LeetCode之链表(10)
算法:链表之环形链表
该类题目的核心点在于如何判断是环形链表,核心思想是:两个人在环上跑步,跑的快的早晚会追上跑的慢的。
灰子学技术
2020/07/29
3570
算法:链表之环形链表
LeetCode:环形链表_141
注意:是慢指针正常速度,快指针两倍速度。不是快指针正常速度,慢指针1/2速度。不然会超时
Yuyy
2022/06/28
2390
LeetCode:环形链表_141
用python 判断一个单链表是否有环.
https://leetcode.com/problems/linked-list-cycle/
py3study
2020/01/06
1.3K0
漫画:不一样的链表成环检测!
今天为大家带来,链表检测成环的经典题目。如果你觉得你会了,请你不妨耐心些认真看下去,我相信会有一些不一样的收获!
程序员小浩
2020/03/31
8530
Js算法与数据结构拾萃(3):链表
对于一个数组,想要做篡改是复杂度是非常高的,设想你接到一个需求,让你记录存储一个人的简历,你用数组储存,可能是这样的:
一粒小麦
2020/02/25
6410
LeetCode 141:环形链表 Linked List Cycle
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。
爱写bug
2019/07/16
3940
LeetCode 142:环形链表 II Linked List Cycle II
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。
爱写bug
2019/07/17
5250
《剑指offer》第22天:链表成环的新解法
思路:通过hash表来检测节点之前是否被访问过,来判断链表是否成环。这是最容易想到的一种题解了。过于简单,直接上代码,go:
程序员小浩
2020/09/14
4871
常见编程模式之快慢指针
快慢指针方法,又称为龟兔赛跑算法,其基本思想就是使用两个移动速度不同的指针在数组或链表等序列结构上移动。这种方法对于处理「环形」链表或数组非常有用。以链表为例,通过以不同的速度移动,我们可以证明如果链表中存在环,则两个指针必定会相遇,当两个指针均处在环中时,快指针会追上慢指针(如下图所示)。
口仆
2020/08/28
5.1K1
【每日leetcode】14.环形链表
链表中节点的数目范围是 [0, 104] -105 <= Node.val <= 105 pos 为 -1 或者链表中的一个 有效索引 。
一条coding
2021/08/12
3320
【每日leetcode】14.环形链表
【一天一大 lee】环形链表II (难度:中等) - Day20201010
给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
前端小书童
2020/10/26
2750
【一天一大 lee】环形链表II (难度:中等) - Day20201010
leetcode刷题(37)——141. 环形链表
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。
老马的编程之旅
2022/06/22
2180
leetcode刷题(37)——141. 环形链表
推荐阅读
相关推荐
LeetCode 141.环形链表 - JavaScript
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验