核心思路

无论使用哪种技术,核心的 HTML 标签都是 <video>,我们的任务主要是在 ASP.NET 后端(C#)准备好视频文件的路径,然后将其传递给前端的 HTML 标签。

asp.net网页中播放视频代码
(图片来源网络,侵删)

使用 HTML5 <video> 标签(最常用、最推荐)

这是最标准、最灵活的方式,无需任何第三方服务器控件,它利用了现代浏览器的原生视频播放能力。

步骤 1:准备工作

  1. 创建项目:在 Visual Studio 中创建一个 ASP.NET Web 应用程序(.NET Framework 或 .NET Core/5+ 都可以)。
  2. 添加视频文件
    • 在你的项目中创建一个文件夹,~/Videos/
    • 将你的视频文件(my_video.mp4)放入这个文件夹。
    • 重要:在解决方案资源管理器中右键点击 Videos 文件夹 -> 属性 -> 将 “复制到输出目录” 设置为 “如果较新则复制”“始终复制”,这确保了视频文件在编译后能被正确部署到 bin 目录或 publish 目录下。

步骤 2:前端代码(.aspx 或 .cshtml)

在你的页面中,直接使用 HTML5 的 <video>

示例 1:使用硬编码路径(不推荐,但最简单)

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebApplication1.WebForm1" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">视频播放示例</title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <!-- 
                controls: 显示播放控件(播放/暂停、进度条、音量等)
                width/height: 设置播放器尺寸
                autoplay: 自动播放(部分浏览器可能不允许)
                muted: 静音后自动播放(通常允许)
            -->
            <video width="800" height="450" controls="controls">
                <!-- 
                    推荐使用 <source> 标签,可以提供多种格式的视频,
                    浏览器会自动选择它支持的第一种格式。
                -->
                <source src="Videos/my_video.mp4" type="video/mp4" />
                您的浏览器不支持 HTML5 视频播放。
            </video>
        </div>
    </form>
</body>
</html>

示例 2:从后端动态获取路径(推荐做法)

这种方式更灵活,因为视频路径可以来自数据库、配置文件或根据用户选择动态变化。

asp.net网页中播放视频代码
(图片来源网络,侵删)

WebForm1.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebApplication1.WebForm1" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">动态视频路径</title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <!-- 使用 ASP.NET 的 <%= %> 语法在服务器端执行代码并输出结果 -->
            <video width="800" height="450" controls="controls">
                <source src="<%= GetVideoPath() %>" type="video/mp4" />
                您的浏览器不支持 HTML5 视频播放。
            </video>
        </div>
    </form>
</body>
</html>

WebForm1.aspx.cs (后端代码)

using System;
using System.Web.UI;
namespace WebApplication1
{
    public partial class WebForm1 : Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            // 页面加载时执行的操作
        }
        /// <summary>
        /// 从后端获取视频文件的完整路径
        /// </summary>
        /// <returns>视频文件的 URL</returns>
        public string GetVideoPath()
        {
            // Server.MapPath 将虚拟路径转换为服务器上的物理路径
            // ~/Videos/my_video.mp4 -> C:\...\WebApplication1\Videos\my_video.mp4
            // 为了在 HTML 中使用,我们需要将其转换为可公开访问的 URL 路径
            // Request.ApplicationPath 获取应用程序的根路径,如 "/"
            // 我们将物理路径转换为相对于应用程序根的虚拟路径
            string virtualPath = "~/Videos/my_video.mp4";
            // 使用 ResolveUrl 方法将带有 ~ 的路径转换为完整的、可用的 URL
            // 这是最安全、最推荐的方式
            return ResolveUrl(virtualPath);
            // 或者手动拼接(不推荐,因为处理了根路径等情况)
            // return Request.ApplicationPath + virtualPath.TrimStart('~');
        }
    }
}

使用 ASP.NET Video 服务器控件

这是 ASP.NET 提供的一个服务器端控件,它最终会渲染成标准的 HTML5 <video> 标签,对于习惯使用服务器控件的开发者来说,这种方式可能更直观。

步骤 1:准备工作

与方案一相同,确保视频文件在 ~/Videos/ 目录下,复制到输出目录”的属性已正确设置。

asp.net网页中播放视频代码
(图片来源网络,侵删)

步骤 2:前端和后端代码

WebForm2.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs" Inherits="WebApplication1.WebForm2" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">ASP.NET Video 控件</title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <!-- 
                asp:Video 控件
                runat="server": 表示这是一个服务器控件
            -->
            <asp:Video ID="VideoPlayer" runat="server" Width="800" Height="450" 
                      AutoPlay="False" AutoStart="False" 
                      Controls="True" 
                      EnableCrossDomain="False">
            </asp:Video>
        </div>
    </form>
</body>
</html>

WebForm2.aspx.cs (后端代码)

using System;
using System.Web.UI;
namespace WebApplication1
{
    public partial class WebForm2 : Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                // 设置视频源
                // Video 控件的 Source 属性需要一个 URL
                string videoPath = "~/Videos/my_video.mp4";
                VideoPlayer.Source = ResolveUrl(videoPath);
            }
        }
    }
}

从数据库中读取视频并流式传输(高级场景)

如果视频文件非常大,或者视频内容(如标题、描述)存储在数据库中,直接提供文件链接可能不是最佳选择,这时,你可以使用 ASP.NET Generic Handler (.ashx) 来从数据库读取视频数据并将其流式传输给浏览器。

步骤 1:创建 Generic Handler

在项目中添加一个新项,选择 “一般处理程序”,命名为 VideoHandler.ashx

VideoHandler.ashx.cs

using System;
using System.Data;
using System.Data.SqlClient;
using System.Web;
namespace WebApplication1
{
    /// <summary>
    /// 从数据库获取视频并流式传输的处理器
    /// </summary>
    public class VideoHandler : IHttpHandler
    {
        public void ProcessRequest(HttpContext context)
        {
            // 1. 从 URL 参数中获取视频ID
            string videoId = context.Request.QueryString["id"];
            if (string.IsNullOrEmpty(videoId))
            {
                context.Response.StatusCode = 400; // Bad Request
                context.Response.Write("Video ID is required.");
                return;
            }
            // 2. 从数据库获取视频信息(这里用伪代码代替实际数据库连接)
            // 假设你的数据库表结构为: Videos (VideoID int, VideoData varbinary(MAX), VideoName nvarchar(255), ContentType nvarchar(50))
            byte[] videoData = null;
            string contentType = "video/mp4"; // 默认类型,应根据实际视频设置
            string videoName = "video.mp4";
            // --- 伪数据库查询 ---
            // using (SqlConnection con = new SqlConnection("Your_Connection_String"))
            // {
            //     string query = "SELECT VideoData, ContentType, VideoName FROM Videos WHERE VideoID = @VideoID";
            //     SqlCommand cmd = new SqlCommand(query, con);
            //     cmd.Parameters.AddWithValue("@VideoID", int.Parse(videoId));
            //     con.Open();
            //     using (SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess))
            //     {
            //         if (reader.Read())
            //         {
            //             videoData = (byte[])reader["VideoData"];
            //             contentType = reader["ContentType"].ToString();
            //             videoName = reader["VideoName"].ToString();
            //         }
            //     }
            // }
            // --- 伪数据库查询结束 ---
            // 为了演示,我们假设找到了一个视频文件并读取为字节数组
            // 在实际应用中,videoData 将来自数据库查询
            string filePath = context.Server.MapPath("~/Videos/my_video.mp4");
            videoData = System.IO.File.ReadAllBytes(filePath);
            if (videoData == null)
            {
                context.Response.StatusCode = 404; // Not Found
                context.Response.Write("Video not found.");
                return;
            }
            // 3. 设置响应头,告诉浏览器这是一个视频流
            context.Response.Buffer = false; // 不缓冲,适合大文件流式传输
            context.Response.Clear();
            context.Response.ContentType = contentType;
            context.Response.AddHeader("Content-Disposition", $"inline; filename=\"{videoName}\"");
            context.Response.AddHeader("Content-Length", videoData.Length.ToString());
            // 4. 将视频数据写入响应输出流
            context.Response.BinaryWrite(videoData);
            context.Response.Flush();
        }
        public bool IsReusable
        {
            get { return false; }
        }
    }
}

步骤 2:在前端页面调用 Handler

WebForm3.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm3.aspx.cs" Inherits="WebApplication1.WebForm3" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">从数据库流式传输视频</title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <!-- 
                视频的 src 指向我们的 Generic Handler,
                并通过查询字符串传递视频 ID
            -->
            <video width="800" height="450" controls="controls">
                <source src="VideoHandler.ashx?id=123" type="video/mp4" />
                您的浏览器不支持 HTML5 视频播放。
            </video>
        </div>
    </form>
</body>
</html>

总结与对比

方案 优点 缺点 适用场景
HTML5 <video> 标准、灵活、性能好,与后端技术无关。 需要手动处理路径拼接。 绝大多数场景,特别是静态视频文件。
ASP.NET Video 控件 对 ASP.NET 开发者友好,属性化配置。 封装性稍强,不如原生 <video> 标签灵活。 喜欢使用服务器控件,项目已大量使用 ASP.NET 控件。
Generic Handler (.ashx) 安全性高(可控制访问权限),适合大文件流式传输,可结合数据库动态管理视频。 实现复杂,需要额外处理程序。 视频存储在数据库、需要用户权限验证、或视频文件非常大的情况。

对于初学者和大多数应用,方案一(HTML5 <video> 标签 + 后端动态路径)是最佳选择,因为它简单、高效且是行业标准。