ASP.NET Mvc+FFmpeg+Video实现视频转码

目录

首先,做了视频上传的页面:

 FFmpeg:视频转码

FFmpegHelper工作类:

后台控制器代码: 

前端视图代码:

 参考文章:


首先,做了视频上传的页面:

借鉴了这篇文章

ASP.NET MVC+LayUI视频上传 - 追逐时光者 - 博客园 (cnblogs.com)

其中的(maxRequestLength和maxAllowedContentLength)设置我是这样设置的

<system.web><compilation debug="true" targetFramework="4.6.2" /><httpRuntime targetFramework="4.6.2" maxRequestLength="2147483647" executionTimeout="600" />
</system.web><system.webServer>
<security><requestFiltering><requestLimits maxAllowedContentLength="2147483647"/></requestFiltering>
</security></system.webServer>

layUI相关的报引用的是最新版的:发现最新版的只需要引用layui不需要layer

2.后续发现Video标签只支持以下几种格式就涉及到视频转码了:

格式IEFirefoxOperaChromeSafari
OggNo3.5+10.5+5.0+No
MPEG 49.0+NoNo5.0+3.0+
WebMNo4.0+10.6+6.0+No

 FFmpeg:视频转码

第一步首先在网上下载ffmpeg.exe程序,并保存到工程目录中

ffmpeg安装教程(windows版)_ffmpeg windows安装-CSDN博客

FFmpegHelper工作类:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Web;namespace Player.Helper
{public 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>/// 执行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;}}}}
}

后台控制器代码: 

using Player.Helper;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.Mvc;
using static System.Net.WebRequestMethods;namespace Player.Controllers
{public class FileUploadController : Controller{// GET: FileUploadpublic ActionResult Index(){return View();}/// <summary>/// 对验证和处理 HTML 窗体中的输入数据所需的信息进行封装,如FromData拼接而成的文件[图片,视频,文档等文件上传]/// </summary>/// <param name="context">FemContext对验证和处理html窗体中输入的数据进行封装</param>/// <returns></returns>[AcceptVerbs(HttpVerbs.Post)]public ActionResult FileLoad(FormContext context)//FemContext对验证和处理html窗体中输入的数据进行封装{HttpPostedFileBase httpPostedFileBase = Request.Files[0];//获取文件流if (httpPostedFileBase != null){try{ControllerContext.HttpContext.Request.ContentEncoding = Encoding.GetEncoding("UTF-8");ControllerContext.HttpContext.Response.Charset = "UTF-8";string fileName = Path.GetFileName(httpPostedFileBase.FileName);//原始文件名称string fileExtension = Path.GetExtension(fileName);//文件扩展名byte[] fileData = ReadFileBytes(httpPostedFileBase);//文件流转化为二进制字节string result = SaveFile(fileExtension, fileData);//文件保存return string.IsNullOrEmpty(result) ? Json(new { code = 0, path = "", msg = "网络异常,文件上传失败.~" }) : Json(new { code = 1, path = result, msg = "文件上传成功" });}catch (Exception ex){return Json(new { code = 0, msg = ex.Message, path = "" });}}else{return Json(new { code = 0, path = "", msg = "网络异常,文件上传失败!~" });}}/// <summary>/// 将文件流转化为二进制字节/// </summary>/// <param name="fileData">图片文件流</param>/// <returns></returns>private byte[] ReadFileBytes(HttpPostedFileBase fileData){byte[] data;using (var inputStream = fileData.InputStream){if (!(inputStream is MemoryStream memoryStream)){memoryStream = new MemoryStream();inputStream.CopyTo(memoryStream);}data = memoryStream.ToArray();}return data;}/// <summary>/// 保存文件/// </summary>/// <param name="fileExtension">文件扩展名</param>/// <param name="fileData">图片二进制文件信息</param>/// <returns></returns>private string SaveFile(string fileExtension, byte[] fileData){string result;string saveName = Guid.NewGuid().ToString() + fileExtension; //保存文件名称string basePath = "UploadFile";string saveDir = DateTime.Now.ToString("yyyy-MM-dd");// 文件上传后的保存路径string serverDir = Path.Combine(Server.MapPath("~/"), basePath, saveDir);string fileNme = Path.Combine(serverDir, saveName);//保存文件完整路径try{var savePath = Path.Combine(saveDir, saveName);//项目中是否存在文件夹,不存在创建if (!Directory.Exists(serverDir)){Directory.CreateDirectory(serverDir);}System.IO.File.WriteAllBytes(fileNme, fileData);//WriteAllBytes创建一个新的文件,按照对应的文件流写入,假如已存在则覆盖//返回前端项目文件地址result = "/" + basePath + "/" + saveDir + "/" + saveName;//进行视频转换var mp4Name = Guid.NewGuid().ToString() + ".mp4";string tsUrl = Path.Combine(serverDir, mp4Name);FFmpegHelper.VideoToTs(fileNme, tsUrl);//检测是否已生成ts文件if (!System.IO.File.Exists(tsUrl)){//删除源文件System.IO.File.Delete(fileNme);return null;}//删除MP4源文件System.IO.File.Delete(fileNme);result = "/" + basePath + "/" + saveDir + "/" + mp4Name;}catch (Exception ex){result = "发生错误" + ex.Message;}return result;}}}

前端视图代码:

<!DOCTYPE html><head><meta charset="utf-8" /><!--最高级模式渲染文档--><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><title></title><link href="~/Content/Layui/css/layui.css" rel="stylesheet" />
</head>
<body><div class="jumbotron" style="margin-top: 200px;"><div class="row" style="margin-top: 20px;"><div class="form-group znStyle"><div class="col-sm-6"><div id="upload_all_file"><div class="layui-upload"><button type="button" class="layui-btn" id="VideoBtn"><i class="layui-icon">&#xe67c;</i>上传视频</button><input type="hidden" name="Video" id="Video" /><div class="layui-upload-list" id="videoPlay"></div></div></div></div></div></div></div><script src="~/Content/Layui/layui.js"></script><!--layer.js视频上传--><script type="text/javascript">var upload;//上传图片layui.use('upload', function () {upload = layui.upload;upload.render({before: function () {layer.msg('视频努力上传中,请耐心等待...', { icon: 16, shade: 0.8, time: false });},elem: '#VideoBtn', url: '@Url.Action("FileLoad","FileUpload")', accept: 'video' //视频, exts: 'mp4|mov|wmv|flv|avi|avchd|webm|mkv|m4v'//只允许上传的后缀(mp4文件), done: function (res) {console.log(res);layer.closeAll();layer.msg(res.msg);if (res.code == 1) {$("#Video").val(res.path);$("#videoPlay").html('<video controls="controls" id="currentVideo" style="width:400px;"><source src="' + res.path + '" type="video/mp4" /><source src="' + res.path + '" type="video/webm" /><source src="' + res.path + '" type="audio/ogg" /></video>');$("#videoPlay").show();// 自动播放$("#currentVideo")[0].play();}}});$(".layui-upload-list").on("click", "i", function () {$(this).parent().remove();});});</script>
</body>

 参考文章:

Request Limits <requestLimits> | Microsoft Learn

httpRuntime代码放在web.config哪里?深度了解httpRuntime - ASP.NET编程_卡卡网

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

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

相关文章

【Miniconda】基于conda列出当前环境下所有已创建的虚拟环境

【Miniconda】基于conda列出当前环境下所有已创建的虚拟环境 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望得到您的…

代理IP速度变慢的原因是什么,要如何解决?

许多用户在使用代理IP时都可能会遇到网络速度变慢的问题&#xff0c;这和我们很多人使用代理IP的初衷背道而驰了&#xff0c;所以&#xff0c;代理IP的网络延迟到底是什么原因造成的&#xff0c;我们又要如何解决这个问题呢&#xff1f;今天就和大家一起来探讨探讨。 一、原因 …

C#,图论与图算法,无向图断开点(Articulation Points)的算法与源代码

1 无向图断开点 如果移除无向连通图中的顶点(以及穿过该顶点的边)会断开该图,则该顶点是一个连接点(或切割顶点Cutting Point)。连接点表示连接网络中的漏洞–单点故障会将网络拆分为两个或多个组件。它们对于设计可靠的网络很有用。 对于断开连接的无向图,连接点是顶点…

SSM SpringBoot vue智能手机参数分析平台

SSM SpringBoot vue智能手机参数分析平台 系统功能 首页 图片轮播 新闻资讯 手机信息 手机百科 登录注册 个人中心 后台管理 登录注册 个人中心 手机百科管理 用户管理 手机对比管理 配置管理 新闻资讯管理 手机信息管理 对比信息管理 我的收藏管理 开发环境和技术 开发语言…

【New Release】PostgreSQL小版本(16.2, 15.6, 14.11, 13.14,12.18) 发布了

前言 PostgreSQL遵循小版本的发布规律&#xff0c;这一个季度的小版本又发布了。可以算作是2024年第一个季度的版本发布。如果总结其规律&#xff1a;大概就是2月、5月、8月、11月的样子。通常因为11月配合大版本的发布&#xff0c;它是起点&#xff0c;也有可能就是终点。起点…

KKVIEW远程控制: 比TODESK好用的软件

比ToDesk更好用的软件&#xff1a;探索远程桌面工具的新选择 在数字化时代&#xff0c;远程桌面工具已经成为许多个人和企业用户不可或缺的一部分。这类工具使得用户可以从一个设备远程控制另一个设备&#xff0c;无论它们相隔多远。其中&#xff0c;ToDesk是一款广受欢迎的远…

微信小程序--开启下拉刷新页面

1、下拉刷新获取数据enablePullDownRefresh 开启下拉刷新&#xff1a; enablePullDownRefreshbooleanfalse是否开启当前页面下拉刷新 案例&#xff1a; 下拉刷新&#xff0c;获取新的列表数据,其实就是进行一次新的网络请求&#xff1a; 第一步&#xff1a;在.json文件中开…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:ListItem)

用来展示列表具体item&#xff0c;必须配合List来使用。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。该组件的父组件只能是List或者ListItemGroup。 子组件 可以包含单个子组件。 接口 从API…

Elasticsearch:从 Java High Level Rest Client 切换到新的 Java API Client

作者&#xff1a;David Pilato 我经常在讨论中看到与 Java API 客户端使用相关的问题。 为此&#xff0c;我在 2019 年启动了一个 GitHub 存储库&#xff0c;以提供一些实际有效的代码示例并回答社区提出的问题。 从那时起&#xff0c;高级 Rest 客户端 (High Level Rest Clie…

一个能够自我游戏的贪吃蛇(pygame与搜索算法)

贪吃蛇小游戏再经典不过了&#xff0c;作为编程爱好者&#xff0c;代码编译的贪吃蛇&#xff0c;又能有怎样的成绩呢&#xff1f; 带着好奇&#xff0c;开始&#xff01; 先做一个普通的贪吃蛇游戏 引入相关package import pygame 定义相关配置变量 # 定义字体 font pyg…

工匠的发展与兴衰趋势-机器人篇

这是一篇纯纯调侃的博客&#xff0c;如有雷同纯属意外。 之前&#xff0c;写过&#xff1a; 从2050回顾2020&#xff0c;职业规划与技术路径&#xff08;节选&#xff09; 从2050回顾2020&#xff0c;职业规划与技术路径&#xff08;节选&#xff09;补充 未来以“工”为主的…

MediaBox音视频终端SDK已适配鸿蒙星河版(HarmonyOS NEXT)

2024年1月&#xff0c;HarmonyOS NEXT 鸿蒙星河版系统开发者预览版开放申请&#xff0c;该系统将只能安装为鸿蒙开发的原生应用&#xff0c;而不再兼容安卓应用。对此&#xff0c;阿里云MediaBox音视频终端SDK产品已实现功能的鸿蒙化迁移和重构&#xff0c;全面适配鸿蒙系统Har…