在C#中实现HTTP Live Streaming,本质是把源视频按固定时长切分为若干ts文件,再生成一个m3u8索引文件描述这些切片的顺序与地址。实际项目中我们通常不直接写编码器,而是调用FFmpeg完成转码与切片,C#负责进程调度与结果处理。

一、准备FFmpeg环境
FFmpeg是处理音视频最通用的命令行工具,支持把mp4、avi等格式转为HLS所需的ts和m3u8。先在服务器或本地安装FFmpeg,并记录其可执行文件路径,例如 Windows 下为 ffmpeg.exe。
二、C#调用FFmpeg切片
使用 System.Diagnostics.Process 启动 FFmpeg,传入切片参数。以下代码演示将 input.mp4 切为每片10秒的HLS输出:
using System;
using System.Diagnostics;
class HlsSlicer
{
static void Main()
{
// FFmpeg可执行文件位置
string ffmpegPath = @"C:toolsffmpegbinffmpeg.exe";
// 源视频路径
string inputFile = @"D:videosinput.mp4";
// 输出m3u8路径,ts文件会生成在同目录
string outputM3u8 = @"D:outputplaylist.m3u8";
// 构建参数:-hls_time 10 表示每片10秒
string args = $"-i "{inputFile}" -codec: copy -hls_time 10 -hls_list_size 0 -f hls "{outputM3u8}"";
ProcessStartInfo psi = new ProcessStartInfo
{
FileName = ffmpegPath,
Arguments = args,
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = true,
CreateNoWindow = true
};
using (Process proc = Process.Start(psi))
{
// 读取日志便于排查
string err = proc.StandardError.ReadToEnd();
proc.WaitForExit();
Console.WriteLine("退出码:" + proc.ExitCode);
if (proc.ExitCode != 0)
{
Console.WriteLine("错误:" + err);
}
}
}
}
三、m3u8与ts文件结构
执行后输出目录会出现 playlist.m3u8 以及 playlist0.ts、playlist1.ts 等文件。m3u8内容类似:
#EXTM3U #EXT-X-VERSION:3 #EXT-X-TARGETDURATION:10 #EXTINF:10.0, playlist0.ts #EXTINF:10.0, playlist1.ts #EXT-X-ENDLIST
其中 #EXTINF 标明每个 ts 时长,#EXT-X-ENDLIST 表示点播列表结束。若是直播,则不会包含结束标签并持续更新。
四、在网页中播放
前端可使用 hls.js 或 Safari 原生支持加载 m3u8 地址。C# 后端只需把这些静态文件通过 HTTP 发布即可,注意 m3u8 的 MIME 类型设为 application/vnd.apple.mpegurl。
常见注意事项
- 源视频编码应为 H.264,音频 AAC,兼容性好
- 切片时长过短会增加请求数,过长影响seek精度
- 若需加密可加 -hls_key_info_file 参数
五、小结
用C#做HLS切片并不复杂,核心是利用FFmpeg的 hls 格式输出,C#通过进程调用并管理生成文件。掌握该方式后,可扩展为批量转码、定时直播切流等服务。