首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >任务:创建一个与视频列表和画布的连接,让它们一对一地播放,没有停止,没有点击功能,结束AddEventListener

任务:创建一个与视频列表和画布的连接,让它们一对一地播放,没有停止,没有点击功能,结束AddEventListener
EN

Stack Overflow用户
提问于 2013-08-30 07:45:15
回答 1查看 574关注 0票数 0

我想做一个视频播放列表,(源视频是在画布复制块控制,像下载视频的选项),我做了2个拖放列表,我想连接1拖拽n下拉列表到画布(这也是视频播放器框),然后播放视频1个1,没有停止,没有点击功能,功能AddEventListener结束在画布框中。

我值得买两个视频,下面是代码的一部分:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    <script type="text/javascript">
    // listener function changes src
    function myNewSrc() {
        var myVideo = document.getElementsByTagName('video')[0];
        myVideo.src = "videos/80s_Mix_II-700.mp4";
        myVideo.src = "videos/80s_Mix_II-700.webm";
        myVideo.load();
        myVideo.play();
    }



    // add a listener function to the ended event
    function myAddListener() {
        var myVideo = document.getElementsByTagName('video')[0];
        myVideo.addEventListener('ended', myNewSrc, false);
    }

</script>



<body onload="myAddListener()">

    <div id="video_player_box">

        <video id="video" autoplay autobuffer width="1" height="1" >
            <source src="videos/milenio_6_minimix_700.mp4" type="video/mp4">
            <source src="videos/milenio_6_minimix_700.webm" type="video/webm">
            <source src="videos/milenio_6_minimix_700.ogg" type="video/ogg">
        </video>

        <div align="center">
            <canvas id="myCanvas" width="1130" height="560">
                Your browser does not support the HTML5 canvas tag.</canvas>
        </div>



        <script>

            var v = document.getElementById("video");
            var c = document.getElementById("myCanvas");
            ctx = c.getContext('2d');

            v.addEventListener('play', function() {
                var i = window.setInterval(function()
                {
                    ctx.drawImage(v, 5, 5, 1130, 560)
                }, 20);
            }, false);
            v.addEventListener('pause', function() {
                window.clearInterval(i);
            }, false);
            v.addEventListener('ended', function() {
                clearInterval(i);
            }, false);

        </script>

    </div> 


    <div id="cadre2" ondrop="drop(event)" ondragover="allowDrop(event)"> <p> Canal VIP </p>
        <ol><li> <video src="videos/milenio_6_minimix_700.mp4" draggable="true"   
                        ondragstart="drag(event)" id="drag1" width="288" height="188" alt="Video 1">
                </video></li>

..。

这个想法是说从#cadre2获取视频,在画布上一个接一个地播放它们,直到结束并循环,形成相同的路径。

我拖拽我的列表,使在线修改视频播放列表的决定更加灵活。

希望能有一些建议!!我不是Php和dynamic的专家,我已经开始使用Javascript了,但要成为专家需要时间!

如果你有一些代码,将会非常感谢!提前感谢!

EN

回答 1

Stack Overflow用户

发布于 2013-08-30 19:26:03

为了使播放器能够连续播放视频,您需要在加载级别实现某种类型的双缓冲(我将在稍后演示)。

但代码中存在一些问题-

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
myVideo.src = "videos/80s_Mix_II-700.mp4";
myVideo.src = "videos/80s_Mix_II-700.webm";
myVideo.load();

这将简单地覆盖source属性。并且设置信号源将自动开始加载视频。

检查视频支持的正确方法是使用方法canPlayType,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/// which format can we play?
if (video.canPlayType("video/mp4").length > 0) {
    video.src = urlToMP4;

} else if (video.canPlayType("video/webm").length > 0) {
    video.src = urlToWEBM;

} else {
    video.src = urlToOggOrSomeOtherSupportedFormat;
}

不过,canPlayType的问题在于,它在Chrome中返回maybe,在火狐中返回probably。如果不能播放视频类型,则返回一个空字符串,因此我们检查string是否包含任何内容,以确定该格式是否可以播放。

您还需要为canplay实现一个事件侦听器,它会告诉您的应用程序视频已成功加载和缓冲,现在可以使用play启动(如果autoplay设置为true,则可以启动)。

我推荐一个简单的过程,如下所示:

  • 使用您要播放的各种格式的视频URL创建对象数组
  • 加载第一个视频时(canplay)开始加载列表中的下一个视频当开始播放第一个

我还建议对代码进行重构,以处理加载和播放。

例如,如果我们初始化一个数组来保存我们的自定义视频对象:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var list = [];

我们现在可以像这样添加URL:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function addVideo(urlMP4, url) {
    list.push({
        urlMP4: urlMP4,
        url: url,
        isReady: false
    })
}

然后这个函数会让我们为WEBM或OGG添加一个MP4和一个链接:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
addVideo('http://video1.mp4', 'http://video1.webm');
addVideo('http://video2.mp4', 'http://video2.webm');
addVideo('http://video3.mp4', 'http://video3.ogg');
...

然后,我们需要启动一个“连锁反应”,可以说是通过使用双缓冲加载机制。第一次需要手动触发时:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
getVideo(list[0], play);

function getVideo(vid, callback) {

    /// which video is playing? (see demo for details)
    var video = (isVideo1 === false ? video1 : video2),
        me = this;

    /// we need to know when video is ready
    video.addEventListener('canplay', canPlay, false);;

    /// call this when ready
    function canPlay(e) {

        /// remove event listener (in case setting new src does not trigger)
        video.removeEventListener('canplay', canPlay, false);

        /// update our object with useful data, for example:
        vid.isReady = true;

        /// if we provided a callback then call that with custom video object
        if (typeof callback === 'function')
            callback(vid);
    }

    /// check video format support (see demo for details)
    if (video.canPlayType("video/mp4").length > 0) {
        video.src = vid.urlMP4;

    } else {
        video.src = vid.url;
    }
}

我们的play函数将管理正在播放的视频以及接下来要播放的内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function play(){

    /// what video is currently not playing?
    var video = (isVideo1 === false ? video1 : video2),
        next = current; /// current is index for list, starts at 0

    /// switch
    isVideo1 = !isVideo1;

    /// increment for next video to platy and start over if list ended    
    next++;
    if (next > list.length - 1) next = 0;

    /// only attempt next if there are more videos than 1 in list
    if (list.length > 0) getVideo(list[next]);

    /// start already loaded video (getVideo)
    video.play();
    isPlaying = true;

    /// set current to next in list
    current = next;
}

我制作这个演示只是为了演示双缓冲加载。您可以使用pause、stop等将其整合到您自己的项目中。

我在这里提供的代码中有移动东西的空间,但正如前面所说的,它只是原理的示例。你还需要考虑一种情况,在这种情况下,下一个视频的加载时间比当前视频播放所需的时间更长(即。当前视频在下一个完成加载之前结束)。这在这段代码中没有被选中。

为了正确地同步视频帧与画布,你需要使用来使用requestAnimationFrame,否则你会时不时地冻结。

在演示中,循环一直在运行。您可以考虑实现一个条件来停止循环。我刚刚实现了一个在视频列表开始播放时绘制的条件(rAF本身并不使用太多的资源,当你切换视频时,你可能会遇到同步停止和启动的问题,所以我个人会让它保持运行状态,用于这种类型的场景(连续视频播放),只有在出现错误时才停止它)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18527593

复制
相关文章
golang exec 命令执行
Cmd 结构体 命令的操作通过 Cmd结构体实现 type Cmd struct { // 命令 Path string // 命令参数 Args []string // 进程执行环境 Env []string // 命令执行目录, 默认当前目录 Dir string // 命令输入 Stdin io.Reader // 命令输出 Stdout
copy_left
2019/08/23
2.2K0
ambari-server操作与对应的源文件
源文件: apache-ambari-2.4.2-src/ambari-server/src/main/python/ambari_server/serverSetup.py
程裕强
2022/05/06
5650
Raspberry Pi 安装 go 后提示错误 Exec format error
Raspberry Pi 的 CPU架构为 ARM,如果你下载使用了 X86 架构的话,你的安装是没有办法运行的。
HoneyMoose
2021/05/16
1K0
Raspberry Pi 安装 go 后提示错误 Exec format error
CentOS 常见异常及解决办法
在CentOS上部署Django项目时,经常需要安装MySQL数据库引擎,如mysqlclient,在执行pip3 install mysqlclient命令时,可能会报错如下:
cutercorley
2020/11/24
1.2K0
docker exec执行多个命令详解 原
docker exec命令能够在运行着的容器中执行命令。docker exec命令的使用格式:
拓荒者
2019/03/11
6.5K0
k8s安装使用_setup error怎么解决
W: GPG error: https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial InRelease: The following signatures couldn’t be verified because the public key is not available: NO_PUBKEY FEEA9169307EA071 NO_PUBKEY 8B57C5C2836F4BEB W: The repository ‘https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial InRelease’ is not signed. N: Data from such a repository can’t be authenticated and is therefore potentially dangerous to use. N: See apt-secure(8) manpage for repository creation and user configuration details.
全栈程序员站长
2022/11/07
7790
k8s安装使用_setup error怎么解决
PHP执行系统外部命令函数:exec()、passthru()、system()、shell_exec()
php提供4种方法执行系统外部命令:exec()、passthru()、system()、 shell_exec()。 在开始介绍前,先检查下php配置文件php.ini中是有禁止这是个函数。找到 disable_functions,配置如下:
全栈程序员站长
2022/07/08
1.4K0
php执行系统外部命令函数:exec()、passthru()、system()、 shell_exec()
php提供4种方法执行系统外部命令:exec()、passthru()、system()、 shell_exec()
Yiiven
2022/12/15
1.1K0
urlopen error errno111(英雄联盟报错error)
6. 选择使用特定DNS服务器地址,并设置为114.114.114.114
全栈程序员站长
2022/08/01
1K0
urlopen error errno111(英雄联盟报错error)
执行Hive查询时出现OOM
使用的是缺省参数每个task分配200M内存「mapred.child.java.opts」
WHYBIGDATA
2023/01/31
9530
执行Hive查询时出现OOM
mac执行git命令出现xcrun: error: invalid active developer path解决方法
运行git clone的时候报错 xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun 解决方法: 打开终端输入 xcode-select --install 回车 xcode-select: note: install requested for comma
Albert陈凯
2018/04/04
8.8K0
mac执行git命令出现xcrun: error: invalid active developer path解决方法
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
Java架构师历程
2018/09/26
2.5K0
ERROR: Could not install packages due to an OSError: [WinError 5] Access is denied
pip默认将Python包安装到系统目录(例如/usr/local/lib/python3.4).这需要root访问权限.
全栈程序员站长
2022/10/01
5830
ERROR: Could not install packages due to an OSError: [WinError 5] Access is denied
Filebeat 执行 setup命令等待时长过久问题处理
Beats是一个代理平台,其监控数据主要发往Logstash和Elasticsearch,其官方组件大致如下:
南非骆驼说大数据
2020/12/02
2K0
Filebeat 执行 setup命令等待时长过久问题处理
解决urllib.error.URLError urlopen error Errno 11004 getaddrinfo failed
在进行Web开发或网络数据爬取时,你可能会遇到​​urllib.error.URLError: urlopen error [Errno 11004] getaddrinfo failed​​这样的错误。该错误表示​​urlopen​​函数在解析URL时无法获取到正确的主机名和IP地址。这篇博客将帮助你了解这个错误的原因,并提供解决方案。
大盘鸡拌面
2023/10/18
1.7K0
exec_command 详解_linux exec命令
2D-Position 允许通过拖曳移动绝对定位的对象。 AbsolutePosition 设定元素的 position 属性为“absolute”(绝对)。 BackColor 设置或获取当前选中区的背景颜色。 BlockDirLTR 目前尚未支持。 BlockDirRTL 目前尚未支持。 Bold 切换当前选中区的粗体显示与否。 BrowseMode 目前尚未支持。 Copy 将当前选中区复制到剪贴板。 CreateBookmark 创建一个书签锚或获取当前选中区或插入点的书签锚的名称。 CreateLink 在当前选中区上插入超级链接,或显示一个对话框允许用户指定要为当前选中区插入的超级链接的 URL。 Cut 将当前选中区复制到剪贴板并删除之。 Delete 删除当前选中区。 DirLTR 目前尚未支持。 DirRTL 目前尚未支持。 EditMode 目前尚未支持。 FontName 设置或获取当前选中区的字体。 FontSize 设置或获取当前选中区的字体大小。 ForeColor 设置或获取当前选中区的前景(文本)颜色。 FormatBlock 设置当前块格式化标签。 Indent 增加选中文本的缩进。 InlineDirLTR 目前尚未支持。 InlineDirRTL 目前尚未支持。 InsertButton 用按钮控件覆盖当前选中区。 InsertFieldset 用方框覆盖当前选中区。 InsertHorizontalRule 用水平线覆盖当前选中区。 InsertIFrame 用内嵌框架覆盖当前选中区。 InsertImage 用图像覆盖当前选中区。 InsertInputButton 用按钮控件覆盖当前选中区。 InsertInputCheckbox 用复选框控件覆盖当前选中区。 InsertInputFileUpload 用文件上载控件覆盖当前选中区。 InsertInputHidden 插入隐藏控件覆盖当前选中区。 InsertInputImage 用图像控件覆盖当前选中区。 InsertInputPassword 用密码控件覆盖当前选中区。 InsertInputRadio 用单选钮控件覆盖当前选中区。 InsertInputReset 用重置控件覆盖当前选中区。 InsertInputSubmit 用提交控件覆盖当前选中区。 InsertInputText 用文本控件覆盖当前选中区。 InsertMarquee 用空字幕覆盖当前选中区。 InsertOrderedList 切换当前选中区是编号列表还是常规格式化块。 InsertParagraph 用换行覆盖当前选中区。 InsertSelectDropdown 用下拉框控件覆盖当前选中区。 InsertSelectListbox 用列表框控件覆盖当前选中区。 InsertTextArea 用多行文本输入控件覆盖当前选中区。 InsertUnorderedList 切换当前选中区是项目符号列表还是常规格式化块。 Italic 切换当前选中区斜体显示与否。 JustifyCenter 将当前选中区在所在格式化块置中。 JustifyFull 目前尚未支持。 JustifyLeft 将当前选中区所在格式化块左对齐。 JustifyNone 目前尚未支持。 JustifyRight 将当前选中区所在格式化块右对齐。 LiveResize 迫使 MSHTML 编辑器在缩放或移动过程中持续更新元素外观,而不是只在移动或缩放完成后更新。 MultipleSelection 允许当用户按住 Shift 或 Ctrl 键时一次选中多于一个站点可选元素。 Open 目前尚未支持。 Outdent 减少选中区所在格式化块的缩进。 OverWrite 切换文本状态的插入和覆盖。 Paste 用剪贴板内容覆盖当前选中区。 PlayImage 目前尚未支持。 Print 打开打印对话框以便用户可以打印当前页。 Redo 目前尚未支持。 Refresh 刷新当前文档。 RemoveFormat 从当前选中区中删除格式化标签。 RemoveParaFormat 目前尚未支持。 SaveAs 将当前 Web 页面保存为文件。 SelectAll 选中整个文档。 SizeToControl 目前尚未支持。 SizeToControlHeight 目前尚未支持。 SizeToControlWidth 目前尚未支持。 Stop 目前尚未支持。 StopImage 目前尚未支持。 StrikeThrough
全栈程序员站长
2022/11/16
2.6K0
Ambari安装hive服务,数据库Connection Failed
因为写 ambari 相关的文章比较多,所以有很多使用 ambari 的朋友加我好友,发现有很多初学者都会卡在一个地方,就是安装依赖 mysql 的服务会提示:MYSQL Connection: Error ,像安装 hive、oozie、ranger 等等服务都会遇到这个问题。
create17
2022/11/17
1.4K0
Ambari安装hive服务,数据库Connection Failed
ERROR: Could not install packages due to an OSError…解决方法
ERROR: Could not install packages due to an OSError: [WinError 5] 拒绝访问。: ‘c:\users\lenovo\python\lib\site-packages\~umpy\.libs\libopenblas.WCDJNK7YVMPZQ2ME2ZZHJJRJ3JIKNDB7.gfortran-win_amd64.dll’ Consider using the --user option or check the permissions.
全栈程序员站长
2022/09/12
3.1K0
ERROR: Could not install packages due to an OSError…解决方法
为 Hive 配置 postgres 或 MySQL 作为元数据库
Hive的元数据默认使用derby作为存储DB,derby作为轻量级的DB,在开发、测试过程中使用比较方便,但是在实际的生产环境中,还需要考虑易用性、容灾、稳定性以及各种监控、运维工具等,这些都是derby缺乏的。
Lu说
2022/06/07
2.9K0
为 Hive 配置 postgres 或 MySQL 作为元数据库
Ambari安装与集群配置
参考网址: http://www.ibm.com/developerworks/cn/opensource/os-cn-bigdata-ambari/index.html http://docs.hortonworks.com/HDPDocuments/Ambari-2.4.2.0/bk_ambari-installation/content/index.html
程裕强
2022/05/06
4400

相似问题

基于选择列表选择的字段显示

13

JS/PHP -基于先前的选择自动填充选择字段

11

基于选择的Django模板/ChoiceField显示字段

26

基于选择jQuery/MySQL显示输入字段

24

基于用户选择的WordPress ACF显示字段

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文