Ueditor 富文本编辑器 插入 m3u8 和 mp4 视频(PHP)

news2025/1/15 7:41:36

当前环境:PHP、Ueditor的版本是1.4.3

新的需求是,需要在Ueditor 富文本编辑器中,插入视频播放,并且视频格式有MP4,也有M3U8。

百度编辑器默认的是embed,需要修改下配置。 ueditor.all.jsueditor.config.js这两个文件要改一些东西,具体我这里就不展示了,网上有很多文章都有写。

这里主要说下 video 文件夹中的修改(ueditor\dialogs\video)。

先说 video.js 文件,一般的方法是修改 function createPreviewVideo(url) 方法,把 $G(“preview”).innerHTML 原有的修改为:

$G("preview").innerHTML = '<video class="previewVideo video-js" controls="controls" src="'+conUrl+'" style="width:420;height:280 "></video>';

看图:
在这里插入图片描述
回到编辑器中操作插入视频功能,MP4格式的没问题,预览的时候可以播放,插入到编辑器后也可以播放;但是M3U8格式的视频不行,预览和插入后都不能播放。

在 video.html 页面中添加插件videojs:

<link rel="stylesheet" href="/share/js/video/video-js.css">
<script src="/share/js/video/video.min.js"></script>

也不行,好像是js没起作用。

视频弹出框 :

在这里插入图片描述
富文本编辑器中:
在这里插入图片描述
在本地静态页面测试的时候发现 m3u8 格式的 video 标签,要有type属性:type=“application/x-mpegURL”,但是 mp4 格式的加上“application/x-mpegURL”,却不能播放了。

所以在 video.js 里面写了一个判断,根据视频格式写不同的 type:

       $G("preview").innerHTML = '<div class="previewMsg"><span>'+lang.urlError+'</span></div>'+if (conUrl.substr(-3) == '3u8') {
            $G("preview").innerHTML = '<video class="previewVideo video-js" controls="" data-setup="{}" style="width:420;height:280" id="1"><source src='+conUrl+' type="application/x-mpegURL"></source></video>';
            var vid = document.getElementById('preview');
            var player = videojs(vid);
        } else {
            $G("preview").innerHTML = '<video class="previewVideo video-js" controls="controls" src="'+conUrl+'" style="width:420;height:280 "></video>';
        }

重新插入 m3u8 格式的视频,发现预览和插入后还是不能播放,mp4格式的视频在预览和插入后都可以播放。

抱着试一试的想法,点了提交按钮,发现在预览页面中可以播放,前提是要在预览页(detail.php)中引用videojs

<link rel="stylesheet" href="/share/js/video/video-js.css">
<script src="/share/js/video/video.min.js"></script> 
<script>
    $('video.video-js').each(function(i, e) {
        var id = e.id
        var vid = document.getElementById(id);
        var player = videojs(vid);
    })
</script>

如图:
在这里插入图片描述
同理,在前台页面中引用video.js,也可以播放 m3u8 的视频,只是不能在编辑的时候播放。

但是还有个问题,如果插入多个m3u8的视频,它们的id都是一样的,只有一个视频可以播放

在这里插入图片描述
我想在 ueditor.all.js 文件中发现视频部分在前面修改的时候被注释掉了,打开就可以了:
在这里插入图片描述
效果如图:
在这里插入图片描述
修改下js代码,功能是播放其中一个视频的时候,其他视频都暂停播放:

$('video.video-js').each(function(i, e) {
        var id = e.id
        var vid = document.getElementById(id);
        videojs(vid).ready(function(){
        this.on("play", function(e) {
            //pause other video
            $(".video-js").each(function (index) {
                if (i !== index) {
                    this.player.pause();
                }
            });
        });
    });
})

初步实现了需求,只是在视频弹出框预览时,和在ueditor编辑器中不能播放m3u8的视频,但是mp4的视频都可以播放;而在后台预览页,与前台正式页面中,视频的播放都没有问题。

进一步优化

在这里插入图片描述
视频弹出框中底部的按钮,我实在没有找到在哪里定义,或者封装的,就想了一个比较笨的方法,把原始的按钮注释掉,自己重新写2个按钮,实现预览和插入功能。

ueditor.css修改:

.edui-default .edui-dialog-foot {
    background-color: white;
    display: none; /* 隐藏视频弹窗底部按钮 */
}

video.html修改:

<!--把div改下-->
<video-js id="preview" class="vjs-default-skin vjs-big-play-centered" controls preload="auto" width="420" height="280">

</video-js>

<!--自己定义的按钮-->
<div>
      <input type="button" id="btn_preview" value="预览" />
      <input type="button" id="btn_insert" value="确认" />
</div>

<!--js代码-->
<script>
    $(function () {
        $("#btn_preview").click(function () {
            var url = $("#videoUrl").val();
            if (url.substr(-3) == '3u8') {
                $("#preview").html('<source src="' + url + '" type="application/x-mpegURL">');
                var vid = document.getElementById('preview');
                var player = videojs(vid);
            } else {
                $G("preview").innerHTML = '<video class="previewVideo video-js" controls="controls" src="'+url+'" style="width:420;height:280 "></video>';
            }
        });
        $("#btn_insert").click(function () {
            var url = $("#videoUrl").val();
            if (url.substr(-3) == '3u8') {
                var guid = generateGUID();           
                var html = '<video class="video video-js vjs-default-skin vjs-big-play-centered" id="' + guid + '" controls preload="auto" width="420" height="280">' +
                ' <source src="' + url + '" type="application/x-mpegURL" />' +
                '</video>' 
            } else {
                var html = '<video controls preload="auto" width="420" height="280">' +
                ' <source src="' + url + '" />' +
                '</video>'
            }
            UE.getEditor('content_content_main').execCommand('insertHtml', html);
        });

        function generateGUID() {
         return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
            var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
            return v.toString(16);
         });
        }
});
</script>

video.js修改:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
重新插入m3u8视频:预览效果
在这里插入图片描述
到此,视频弹窗的预览效果实现了,不过还有一个问题,就是视频插入后,在富文本编辑器中还是不能播放m3u8的视频。

有什么好的方案欢迎给我留言。

补充:不用自定义预览和确认按钮,用原始的按钮也可以实现在预览时播放视频(上面优化的部分不用改,只做下面修改)

video.html:

<!--把div改下-->
<video-js id="preview" class="vjs-default-skin vjs-big-play-centered" controls preload="auto" width="420" height="280">

</video-js>

video.js:

       if (conUrl.substr(-3) == '3u8') {
            $("#preview").html('<source src="' + conUrl + '" type="application/x-mpegURL">');
                var vid = document.getElementById('preview');
                var player = videojs(vid);
        } else {
            $G("preview").innerHTML = '<video class="previewVideo video-js" controls="controls" src="'+conUrl+'" style="width:420;height:280 "></video>';
        }

在这里插入图片描述
实测也可以实现预览时播放m3u8视频:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/468004.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++vector的动态扩容,为何是1.5倍或者是2倍

1. vector如何进行扩容 当插入元素时&#xff0c;如果size capacity&#xff0c;触发扩容机制。 拷贝元素释放旧空间 2. 如何避免扩容导致效率低 在插入前&#xff0c;预估好vector的容量&#xff0c;通常使用reserve。如果没有reserve&#xff0c;边插边扩容&#xff0c;…

ROS学习7:ROS机器人导航仿真

【Autolabor初级教程】ROS机器人入门 1. 概述 在 ROS 中机器人导航 (Navigation) 由多个功能包组合实现&#xff0c;ROS 中又称之为导航功能包集&#xff0c;关于导航模块&#xff0c;官方介绍如下 一个二维导航堆栈&#xff0c;它接收来自里程计、传感器流和目标姿态的信息&a…

汽车智能化「出海」红利

在高阶智能座舱中&#xff0c;车载导航产品作为与用户体验息息相关的模块之一&#xff0c;同样也进入了升级迭代周期。 基于高精度地图渲染、高精度定位算法、AR等技术的车道级导航、AR导航等产品快速上车&#xff0c;但同时随着人机交互多模发展以及3D沉浸式用户体验需求趋势下…

DataX-在Windows上实现postgresql同步数据到mysql

场景 DataX-阿里开源离线同步工具在Windows上实现Sqlserver到Mysql全量同步和增量同步: DataX-阿里开源离线同步工具在Windows上实现Sqlserver到Mysql全量同步和增量同步_霸道流氓气质的博客-CSDN博客 在上面实现sqlserver到mysql的数据同步之后&#xff0c;如果要实现postg…

FPGA/Verilog HDL/AC620零基础入门学习——8*8同步FIFO实验

实验要求 该项目主要实现一个深度为8、位宽为8bit的同步FIFO存储单元。模块功能应包括读控制、写控制、同时读写控制、FIFO满状态、FIFO空状态等逻辑部分。 该项目由一个功能模块和一个testbench组成。其中功能模块的端口信号如下表所示。 提示&#xff1a; &#xff08;1&a…

Sqoop 从入门到精通

Sqoop Sqoop 架构解析 概述 Sqoop是Hadoop和关系数据库服务器之间传送数据的一种工具。它是用来从关系数据库如&#xff1a;MySQL&#xff0c;Oracle到Hadoop的HDFS&#xff0c;并从Hadoop的文件系统导出数据到关系数据库。 传统的应用管理系统&#xff0c;也就是与关系型数…

【微服务笔记24】微服务组件之Sleuth + Zipkin实现服务调用链路追踪功能

这篇文章&#xff0c;主要介绍微服务组件之Sleuth Zipkin实现服务调用链路追踪功能。 目录 一、Sleuth链路追踪 1.1、什么是Sleuth 1.2、Sleuth专业术语 &#xff08;1&#xff09;Span &#xff08;2&#xff09;Trace &#xff08;3&#xff09;工作原理 1.3、Sleuth…

月薪15K必会技术,如何从0到1学习性能测试,5个操作安排的明明白白

目录 【开幕】武林秘籍惊现江湖 【第一幕】该不该预测一个初始值&#xff1f; 【第二幕】从单线程开始 【第三幕】用命令行形式跑性能测试&#xff0c;然后观察机器性能。 【第四幕】控制吞吐&#xff01;控制吞吐&#xff01;控制吞吐&#xff01; 【第五幕】武林秘籍重…

10 dubbo源码学习_线程池

1. 线程模型&线程池介绍1.1 线程池1.2 线程模型 2. 线程池源码分析2.1 FixedThreadPool2.2 CachedThreadPool2.3 LimitedThreadPool 3. 线程模型源码3.1 AllDispatcher3.2 DirectDispatcher3.3 MessageOnlyDispatcher3.4 ExecutionDispatcher3.5 ConnectionOrderedDispatch…

Visual Studio C# WinForm开发入门(6):TreeView 控件使用

TreeView控件用树显示节点层次。 例如&#xff1a;顶级目录是根(C:)&#xff0c;C盘下的每个子目录都是子节点&#xff0c;而每个子目录又都有自己的子节点 TreeView属性和方法&#xff1a; 属性说明CheckBoxes表示节点旁边是否出现复选框ImageList指定一个包含节点图标的Imag…

Spring Cloud Gateway 服务网关的部署与使用详细介绍

为什么需要服务网关 传统的单体架构中只需要开放一个服务给客户端调用&#xff0c;但是微服务架构中是将一个系统拆分成多个微服务&#xff0c;如果没有网关&#xff0c;客户端只能在本地记录每个微服务的调用地址&#xff0c;当需要调用的微服务数量很多时&#xff0c;它需要…

【音视频第20天】wireshark+tcpdump

tcpdump抓 wireshark分析 目录 tcpdumpwireshark tcpdump tcpdump参数详解 网上一搜一大堆。最全的不是用tcpdump -h而是man tcpdump来查询手册。 tcpdump -i eth0 -p udp -xx -Xs 0 -w /root/test2.cap -i 针对eth0网卡的&#xff0c;ifconfig是查看有几个网卡 -i eth0 表示…

海睿思分享 | 终于有人把指标体系和标签体系说清楚了

当前&#xff0c;随着企业数字化转型如火如荼地开展&#xff0c;在企业经营管理数字化的数据建设过程中&#xff0c;经常会遇到指标和标签的使用场景。 指标体系到底是什么&#xff1f;标签体系又是什么&#xff1f;这些疑问导致在数据分析过程中效率低下、科学性不高&#xf…

回首来路多感概,最是奋斗动人心。

我们必需要在不同的时代有不同的领悟&#xff0c;才能充满生机地去迎接生命中每个新的开始。 文章目录 前言 初心 成长 收获 憧憬 出发 前言 今天是我成为csdn创作者一周年纪念日&#xff0c;我非常开心能够和大家分享我的写作之旅。在这一年里&#xff0c;我经历了许多挑…

ChatGPT实现数据集模拟生成,ChatGPT实现密码生成

数据集模拟生成 之前章节我们已经演示过ChatGPT 如何根据 prompt 编写文章或续写文章&#xff0c;文本生成的作用不仅仅在语文方面有用&#xff0c;本节我们演示另一种场景&#xff0c;利用 ChatGPT 来生成数据。看似作用差不多&#xff0c;其实这是目前开源社区非常常用的大语…

低代码和零代码二子争夺,你扶谁上位?

传统的软件研发方式目前并不能很好地满足企业的需求&#xff1a;人员成本高、研发时间长、运维复杂。这时低代码或零代码工具的出现为快速开发软件提供了更好的思路。对于不太了解两者的人来说&#xff0c;零代码和低代码是什么&#xff1f;又有什么联系与区别&#xff1f; 什么…

手把手教你安装telnet(离线方式+在线方式)

系列文章目录 文章目录 系列文章目录前言一、telnet是什么&#xff1f;二、安装步骤总结 前言 一、telnet是什么&#xff1f; Telnet协议是TCP/IP协议族中的一员&#xff0c;是Internet远程登录服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的能力…

[openwrt] valgrind定位内存泄漏

目录 要求 valgrind 简介 工具介绍 linux程序的内存布局 内存检查的原理 valgrind的使用 使用举例 内存泄漏 内存越界 内存覆盖 Linux分配虚拟内存&#xff08;申请内存&#xff09;的两种方式 brk和mmap 要求 被调试程序带有-g参数编译&#xff0c;携带debug参数…

二维码在数字化班组管理中的应用

为了更好地贯彻落实集团公司对班组安全建设的要求&#xff0c;可以运用“加法思维”&#xff0c;勇于直面当前安全班组建设中的突出问题&#xff0c;敢于创新和突破&#xff0c;自主搭建数字化班组管理平台&#xff0c;以进一步提升班组安全建设水平。 本文将详细介绍搭建设备…

腾讯云CDN的HTTPS服务是收费的?

腾讯云内容分发网络CDN的HTTPS请求数收费了&#xff0c;之前阿里云CDN是收费的&#xff0c;现在腾讯云HTTPS请求数也开始收费的&#xff0c;但是腾讯云还是很良心的每月300万次以内是不计费的&#xff0c;只有超出free额度的部分才另外收费&#xff0c;HTTPS请求数价格为0.05元…