目前市面上直播推流的软件有很多,拉流也很常见。近期因为业务需要,需要搭建一整套服务端推流,客户端拉流的程序。随即进行了展开研究,花了一个小时做了个基于winfrom桌面版的推拉流软件。另外稍微啰嗦两句,主要怕你们翻不到最下面。目前软件还是一个简化版的,但已足够日常使用,比如搭建一套餐馆的监控,据我了解,小餐馆装个监控一般3000—5000,如果自己稍微懂点软件知识,几百元买几个摄像头+一台电脑,搭建的监控不足千元,甚至一两百元足够搞定了。这是我研究这套软件的另外一个想法。
二、使用的技术栈:
1、nginx
2、ffmpeg
3、asp.net framework4.5 winfrom
4、开发工具vs2019
5、开发语言c#
关于以上技术大体做下说明,使用nginx做为代理节点服务器,基于ffmpeg做推流,asp.net framework4.5 winfrom 做为桌面应用。很多人比较陌生的可能是ffmpeg,把它理解为视频处理最常用的开源软件。关于它的更多详细文章可以去看阮一峰对它的介绍。“FFmpeg 视频处理入门教程”。
5.1启动nginx的核心代码
using MnNiuVideoApp.Common; using System; using System.Diagnostics; using System.IO; using System.Windows.Forms; namespace MnNiuVideoApp { public class NginxProcess { //nginx的进程名 public string _nginxFileName = "nginx"; public string _stop = "stop.bat"; public string _start = "start.bat"; //nginx的文件路径名 public string _nginxFilePath = string.Empty; //nginx的启动参数 public string _arguments = string.Empty; //nginx的工作目录 public string _workingDirectory = string.Empty; public int _processId = 0; public NginxProcess() { string basePath = FileHelper.LoadNginxPath(); string nginxPath = $@"{basePath}\nginx.exe"; _nginxFilePath = Path.GetFullPath(nginxPath); _workingDirectory = Path.GetDirectoryName(_nginxFilePath); _arguments = @" -c \conf\nginx-win.conf"; } //关掉所有nginx的进程,格式必须这样,有空格存在 taskkill /IM nginx.exe /F /// <summary> /// 启动服务 /// </summary> /// <returns></returns> public void StartService() { try { if (ProcessesHelper.IsCheckProcesses(_nginxFileName)) { LogHelper.WriteLog("nginx进程已经启动过了"); } else { var sinfo = new ProcessStartInfo { FileName = _nginxFilePath, Verb = "runas", WorkingDirectory = _workingDirectory, Arguments = _arguments }; #if DEBUG sinfo.UseShellExecute = true; sinfo.CreateNoWindow = false; #else sinfo.UseShellExecute = false; #endif using (var process = Process.Start(sinfo)) { //process?.WaitForExit(); _processId = process.Id; } } } catch (Exception e) { LogHelper.WriteLog(e.Message); MessageBox.Show(e.Message); } } /// <summary> /// 关闭nginx所有进程 /// </summary> /// <returns></returns> public void StopService() { ProcessesHelper.KillProcesses(_nginxFileName); } /// <summary> /// 需要以管理员身份调用才能起作用 /// </summary> public void KillAll() { try { ProcessStartInfo sinfo = new ProcessStartInfo(); #if DEBUG sinfo.UseShellExecute = true; // sinfo.CreateNoWindow = true; #else sinfo.UseShellExecute = false; #endif sinfo.FileName = _nginxFilePath; sinfo.Verb = "runas"; sinfo.WorkingDirectory = _workingDirectory; sinfo.Arguments = $@"{_workingDirectory}\taskkill /IM nginx.exe /F "; using (Process _process = Process.Start(sinfo)) { _processId = _process.Id; } } catch (Exception ex) { MessageBox.Show(ex.Message); } } } }