html和winform webBrowser控件交互并播放视频(包含转码)

1、 为了使网页能够与winform交互 将com的可访问性设置为真
   

[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")][System.Runtime.InteropServices.ComVisibleAttribute(true)]

2、在webBrowser控件中设置可被html页面调用的类即:webBrowser1.ObjectForScripting = this;前端即可通过window.external访问this对象

3、html页面调用后台方法:window.external.方法名(); 此处的window.external相当于webBrowser1.ObjectForScripting

设计:

 后台代码:

注意:视频地址需要修改

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
using DevExpress.XtraEditors;
using WebKit;
using System.IO;
using DXApplication1.Helper;namespace DXApplication1
{//为了使网页能够与winform交互 将com的可访问性设置为真[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")][System.Runtime.InteropServices.ComVisibleAttribute(true)]public partial class webBrowser : DevExpress.XtraEditors.XtraForm{public webBrowser(){InitializeComponent();}private void webBrowser_Load(object sender, EventArgs e){webBrowser1.ScriptErrorsSuppressed = true;//消除脚本错误 webBrowser1.Navigate(@"C:\source\repos\DXApplication1\DXApplication1\Html\HTMLPage2.html");webBrowser1.ObjectForScripting = this;}public string FileLode(string url){//返回路径string result = url;if (!string.IsNullOrEmpty(url)){//保存文件名称string saveName = Guid.NewGuid().ToString() + ".mp4"; string basePath = "UploadFile";string saveDir = DateTime.Now.ToString("yyyy-MM-dd");//获取应用程序的当前工作目录string MapPath = Directory.GetCurrentDirectory();// 文件上传后的保存路径string serverDir = Path.Combine(MapPath, basePath, saveDir);//保存文件完整路径string fileNme = Path.Combine(serverDir, saveName);//项目中是否存在文件夹,不存在创建                                                                                        if (!Directory.Exists(serverDir)) {Directory.CreateDirectory(serverDir);}//进行视频转换FFmpegHelper.VideoToTs( url, fileNme);result = fileNme;}return result;}/// <summary>/// 前台调用后台返回数据/// 注意:前台调用的方法不能:static/// </summary>/// <param name="a"></param>/// <returns></returns>public string videoLine(int  a){var result = string.Empty;switch (a){case 1:result = "http:/UploadFile/2024-03-12/17577f56-d999-4bbe-b67a-2156e241170d.mp4";break;case 2:result = "http:/UploadFile/2024-03-12/af67f8d3-ac79-4bd1-aa41-0743015ef9a4.m4v";break;default:result= "C:\\source\\repos\\DXApplication1\\DXApplication1\\video\\231127.m4v";break;}return result;}private void simpleButton1_Click(object sender, EventArgs e){var url=textBox1.Text;if (!string.IsNullOrEmpty(url)){webBrowser1.ScriptErrorsSuppressed = true;webBrowser1.Navigate(url);webBrowser1.ObjectForScripting = this;}}private void simpleButton2_Click(object sender, EventArgs e){//调用前台js方法webBrowser1.Document.InvokeScript("handinitLine", new object[] { "后台调用js方法1" });}}
}

Html代码:

<!DOCTYPE html><head><meta charset="utf-8" /><!--最高级模式渲染文档--><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><title></title><link href="layui-v2.9.7/css/layui.css" rel="stylesheet" />
</head>
<body><!--<div id="player">--><!--播放本地视频--><!--<video controls width="500" height="300" src="../video/1699408632422.m4v"></video>--><!--播放网络视频--><!--<video controls width="500" height="300" src="http:/UploadFile/2024-03-12/b7962018-26b3-43c1-83ad-aa2c14149f58.m4v"></video>--><!--</div>--><div><input type="file" class="layui-btn layui-btn-primary" id="videoUpload" accept="video/*"></div><div class="layui-form-item"><div class="layui-input-group"><div class="layui-input-split layui-input-prefix"></div><input type="text" placeholder="" class="layui-input" id="textvideo"><div class="layui-input-suffix"><button class="layui-btn layui-btn-primary" id="videoLine" value="前台调用后台方法" onclick="vide()">前台调用后台方法</button></div></div></div><script src="layui-v2.9.7/layui.js"></script><script>document.getElementById('videoUpload').addEventListener('change', handleVideoUpload, false);function handleVideoUpload(event) {var url = document.getElementById('videoUpload').value;//获取file选择文件物理路径方法url = window.external.FileLode(url)//var file = event.target.files[0]; // 获取用户选择的文件//var videoURL = URL.createObjectURL(file); // 创建一个指向视频文件的 URLdocument.getElementById('videoUpload').value = url;//判断是否存在video标签if (document.getElementById('videofile')) {var element = document.getElementById("videofile");element.parentNode.removeChild(element);}// 创建一个 video 元素,用于播放视频var video = document.createElement('video');video.src = url;//videoURL; // 设置 video 元素的 src 属性为视频文件的 URLvideo.controls = true; // 显示视频控制器,如播放/暂停按钮等video.width = "500";video.height = "300";video.id = "videofile";video.play(); // 自动播放视频// 将 video 元素添加到页面中document.body.appendChild(video);}function handinitLine(text) {alert(text);}function vide() {var a = document.getElementById('textvideo').value;var url = window.external.videoLine(a);//判断是否存在video标签if (document.getElementById('videofile')) {var element = document.getElementById("videofile");element.parentNode.removeChild(element);}// 创建一个 video 元素,用于播放视频var video = document.createElement('video');video.src = url; // 设置 video 元素的 src 属性为视频文件的 URLvideo.controls = true; // 显示视频控制器,如播放/暂停按钮等video.width = "500";video.height = "300";video.id = "videofile";video.play(); // 自动播放视频// 将 video 元素添加到页面中document.body.appendChild(video);}function strbol(str) {if (str.indexOf('http') == 0) {//开头包含httpreturn false;}return true;}</script>
</body>

FFmpegHelper类:视频转码类

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace DXApplication1.Helper
{class FFmpegHelper{//安装的ffmpeg的路径 写在配置文件的 你也可以直接写你的路径 D:\ffmpeg\bin\ffmpeg.exe//static string FFmpegPath = System.Configuration.ConfigurationManager.AppSettings["ffmepg"];/// <summary>/// 视频转码为mp4文件/// </summary>/// <param name="videoUrl"></param>/// <param name="targetUrl"></param>public static void VideoToTs(string videoUrl, string targetUrl){//视频转码指令string cmd = string.Format("ffmpeg  -i \"{0}\" -y -ab 32 -ar 22050 -b 800000 -s 480*360 \"{1}\"", videoUrl, targetUrl);RunMyProcess(cmd);}/// <summary>/// 将ts文件转换为mu3u8文件/// </summary>/// <param name="tsUrl"></param>/// <param name="m3u8Url">这个路径不要带扩展名</param>/// <param name="videoLength">视频切片时长,默认5秒</param>public static void TsToM3u8(string tsUrl, string m3u8Url, int videoLength = 5){//这里是关键点,一般平时切视频都是用FFmpeg -i  地址 -c这样,但是在服务器时,这样调用可能找不到ffmpeg的路径 所以这里直接用ffmpeg.exe来执行命令//string cmd = $@"{FFmpegPath} -i {tsUrl} -c copy -map 0 -f segment -segment_list {m3u8Url}.m3u8 -segment_time 5 {m3u8Url}%03d.ts";string cmd = string.Format("ffmpeg -i \"{0}\" -c copy -map 0 -f segment -segment_list \"{1}.mp4\" -segment_time {2} \"{1}%03d.ts\"", tsUrl, m3u8Url, videoLength);RunMyProcess(cmd);}/// <summary>/// 生成MP4频的缩略图/// </summary>/// <param name="videoUrl">视频文件地址</param>/// <param name="imgUrl">视频缩略图地址</param>/// <param name="imgSize">宽和高参数,如:240*180</param>/// <param name="Second">ss后跟的时间单位为秒</param>/// <returns></returns>public static string CatchImg(string videoUrl, string imgUrl, int Second = 8, string imgSize = "1280x720"){try{//转换文件格式的同时抓缩微图: //ffmpeg - i "test.avi" - y - f image2 - ss 8 - t 0.001 - s 350x240 'test.jpg'//- ss后跟的时间单位为秒string cmd = string.Format("ffmpeg -i \"{0}\" -y -f image2 -ss {1} -t 0.001 -s {2} \"{3}\"", videoUrl, Second, imgSize, imgUrl);RunMyProcess(cmd);//注意:图片截取成功后,数据由内存缓存写到磁盘需要时间较长,大概在3,4秒甚至更长;//System.Threading.Thread.Sleep(500);if (System.IO.File.Exists(imgUrl)){return imgUrl;}return "";}catch{return "";}}/// <summary>/// 执行cmd指令/// </summary>/// <param name="Parameters"></param>public static void RunMyProcess(string Parameters){using (Process p = new Process()){try{p.StartInfo.FileName = "cmd.exe";p.StartInfo.UseShellExecute = false;//是否使用操作系统shell启动p.StartInfo.RedirectStandardInput = true;//接受来自调用程序的输入信息p.StartInfo.RedirectStandardOutput = true;//由调用程序获取输出信息p.StartInfo.RedirectStandardError = true;//重定向标准错误输出p.StartInfo.CreateNoWindow = false;//不创建进程窗口                                                p.Start();//启动线程p.StandardInput.WriteLine(Parameters + "&&exit"); //向cmd窗口发送输入信息p.StandardInput.AutoFlush = true;p.StandardInput.Close();//获取cmd窗口的输出信息string output = p.StandardError.ReadToEnd(); //可以输出output查看具体报错原因p.WaitForExit();//等待完成p.Close();//关闭进程p.Dispose();//释放资源}catch (Exception ex){throw ex;}}}}
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【算法与数据结构】深入解析二叉树(二)之堆结构实现

文章目录 &#x1f4dd;二叉树的顺序结构及实现&#x1f320; 二叉树的顺序结构&#x1f320; 堆的实现&#x1f320; 堆的实现&#x1f309;堆向下调整算法&#x1f309;堆的创建&#x1f309;建堆时间复杂度&#x1f309;堆的插入&#x1f309;堆的删除 &#x1f320;堆向上调…

网络解析知识

网络解析 1.TCP三次握手和四次挥手 1.TCP的传输过程&#xff1a; Seq 序列号 保障传输过程可靠。 ACK &#xff08;确认消息&#xff09; SYN &#xff08;在建立TCP连接的时候使用&#xff09; FIN &#xff08;在关闭TCP连接的时候使用&#xff09;3.TCP建立连接…

Caffeine缓存

本地缓存基于本地环境的内存&#xff0c;访问速度非常快&#xff0c;对于一些变更频率低、实时性要求低的数据&#xff0c;可以放在本地缓存中&#xff0c;提升访问速度 使用本地缓存能够减少和Redis类的远程缓存间的数据交互&#xff0c;减少网络 I/O 开销&#xff0c;降低这…

【AIGC调研系列】通义灵码与copilot的对比

通义灵码与GitHub Copilot的对比主要集中在几个方面&#xff1a;代码编写能力、免费性、操作界面和适配性。 首先&#xff0c;在代码编写能力上&#xff0c;虽然GitHub Copilot在整体上要强于通义灵码&#xff0c;但通义灵码的能力也不算弱&#xff0c;并且在某些特定的小类任…

双线性插值缩放算法原理以及matlab与verilog的实现(二)

系列文章目录 双线性插值缩放算法原理以及matlab与verilog的实现&#xff08;一&#xff09; 文章目录 系列文章目录前言一、前提回顾二、FPGA实现步骤2.1 找到源图像四个像素点求目标像素点2.2 FPGA实现步骤2.3 总体框架2.4 ROM缓存模块2.5 VGA模块2.6 双线性算法模块 三、下…

PlantUML + VS Code

PlantUML 使用实例 文章目录 PlantUML 使用实例1. PlantUML简介1.1 什么是PlantUML1.2 PlantUML优势在哪 2. 怎么用2.1 环境依赖2.2 VS Code组件安装 3. 常用语法3.1 标记开始结束3.2 声明参与者3.3 声明关系3.4 对消息序列编号3.5 组合消息 4. 实例 1. PlantUML简介 1.1 什么…

deepin23beta中SQLite3数据库安装与使用

SQLite 是一个嵌入式 SQL 数据库引擎&#xff0c;它实现了一个自包含、无服务器、零配置、事务性 SQL 数据库引擎。 SQLite 的代码属于公共领域&#xff0c;因此可以免费用于任何商业或私人目的。 SQLite 是世界上部署最广泛的数据库&#xff0c;其应用程序数量之多&#xff0c…

SQLiteC/C++接口详细介绍之sqlite3类(三)

快速跳转文章列表&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;二&#xff09; 下一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;四&#xff09; 6.sqlite3_create_module与sqlite3_create_module_v2函数…

数据库不应放在容器中?- B站Kubernetes有状态服务实践(Elasticsearch/Clickhouse)

本期作者 前言 云原生时代下&#xff0c; Kubernetes已成为容器技术的事实标准&#xff0c; 使得基础设施领域应用下自动化运维管理与编排成为可能。对于无状态服务而言&#xff0c; 业界早已落地数套成熟且较完美的解决方案。可对于有状态的服务&#xff0c; 方案的复杂度就以…

电视盒子解析安装包失败,安卓4.4安装不了kodi的解决方法,如何安装kodi

有些安卓电视或者电视盒子的安卓系统版本太低、自身架构或者屏蔽了安装其他应用的功能&#xff0c;下载的Kodi apk安装包提示无法安装&#xff0c;解析程序包时出现问题、解析出错无法安装、[INSTALL_FAILED_OLDER_SDK]、此应用与您的电视不兼容。 解决方法&#xff1a; 1、3…

学习Android的第二十八天

目录 Android Service (服务) 线程 Service (服务) Service 相关方法 Android 非绑定 Service startService() 启动 Service 验证 startService() 启动 Service 的调用顺序 Android 绑定 Service bindService() 启动 Service 验证 BindService 启动 Service 的顺序 …

【AI】如何创建自己的自定义ChatGPT

如何创建自己的自定义ChatGPT 目录 如何创建自己的自定义ChatGPT大型语言模型(LLM)GPT模型ChatGPTOpenAI APILlamaIndexLangChain参考推荐超级课程: Docker快速入门到精通Kubernetes入门到大师通关课本文将记录如何使用OpenAI GPT-3.5模型、LlamaIndex和LangChain创建自己的…

DirectShowPlayerService::doSetUrlSource: Unresolved error code 0x800c000d

报出这个问题&#xff0c;应该是对给的url解析不正确&#xff0c;我给的是rtsp的视频流地址&#xff0c;应该是对该格式解析异常。 所以参考两篇文&#xff1a; QT无法播放视频&#xff1a;报错&#xff1a;DirectShowPlayerService::doRender: Unresolved error code 0x8004…

vue3项目随笔1

1,Eslint Prettier 报错情况&#xff1a; 解决办法&#xff1a; &#xff08;1&#xff09;下载Prettier - code formatter &#xff08;2&#xff09;配置setting.json文件 文件 -> 首选项 -> 设置 -> 用户 -> Eslint "editor.defaultFormatter":…

拖动排序与置顶的Java实现

文章目录 1、需求分析2、表设计3、接口设计4、业务层5、数据层 整理个需求的实现思路。 1、需求分析 列表展示了一系列产品&#xff0c;现要支持通过拖动来给产品排序&#xff0c;也要支持单个产品的置顶、删除。类似CSDN的专栏文章管理。 2、表设计 现要支持对列表的产品进…

融入Facebook的世界:探索数字化社交的魅力

融入Facebook的世界&#xff0c;是一场数字化社交的奇妙之旅。在这个广袤的虚拟社交空间中&#xff0c;人们可以尽情展现自己、分享生活&#xff0c;与全球朋友、家人和同事保持紧密联系&#xff0c;共同探索社交互动的乐趣与魅力。让我们深入了解这个世界的魅力所在&#xff1…

ASP.NET-Server.HtmlEncode

目录 背景: 1.转义特殊字符&#xff1a; 2.防止跨站脚本攻击&#xff08;XSS&#xff09;&#xff1a; 3.确保输出安全性&#xff1a; 4.保留原始文本形式&#xff1a; 5.与用户输入交互安全&#xff1a; 实例说明: 不用Server.HtmlEncode 效果展示: 用Server.HtmlEnc…

多场成像,快速提高机器视觉检测能力--51camera

多阵列CMOS传感器与芯片级涂层二向色滤光片相结合&#xff0c;可在单次扫描中同时捕获明场、暗场和背光图像。 多场成像是一种新的成像技术&#xff0c;它可以在不同的光照条件下同时捕获多幅图像。再加上时间延迟积分(TDI)&#xff0c;这种新兴的成像技术可以克服许多限制的传…

【敬伟ps教程】视频动画

文章目录 视频文档视频时间轴帧动画视频文档 工作区需由[基本功能]切换为[动感] 可以看到我们需从时间的维度来编辑动态视觉图像 时间轴:从时间的维度来编辑动态视觉图像 PS提供的时间轴有两种:1、视频时间轴;2、动画时间轴 新建视频文档,点击新建或Ctrl+N,预设选择“胶…

springboot276基于JS的个人云盘管理系统的设计与实现

个人云盘管理系统设计与实现 摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装个人云盘管理系统软件来发挥其…