前言
我也只是个初学ZLMediaKit的,遇到什么我就写什么,但是Windows平台的使用确实让我觉得有些难为情,我就记录了下来
一、下载源码
前提条件:安装git
#国内用户推荐从同步镜像网站gitee下载
git clone --depth 1 https://gitee.com/xia-chu/ZLMediaKit
#下载cmake编译的包(完整更新文件)
cd ZLMediaKit
git submodule update --init
二、下载编译器
windows使用cmake来构建项目,需要下载cmake客户端进行创建VS的sln文件
下载地址:cmake-gui
下载完成后解压文件,打开bin目录下
三、cmake-gui的使用
XXXX\ZLMediaKit-----这个是cmake需要编译的项目文件路径
选择的编译的版本记得选择vs2017,不要问我为是什么!
四、下载Openssl
下载地址:Win32/Win64 OpenSSL Installer for Windows
记得下载32位的,不要问我为什么!
无脑下一步,安装完成后配置环境变量:
环境变量的值是安装之后的bin目录
五、构建和编译项目
在编译时选择编译Release 版本.
打开项目(需要VS2017及以上),直接编译会报错,需要将C:\Program Files (x86)\OpenSSL-Win32\lib\VC\static目录下的文件复制到C:\Program Files (x86)\OpenSSL-Win32\lib下
此处有坑,VS2019版本的代码默认会去找64位的openssl,但是,,,就算有它也找不到,vs2017就会找32位的,能顺利编译成功
打开文件生成目录XXXX\ZLM\ZLMediaKit\release\windows\Debug\Release
全部生成完成之后进行测试
六、安装FFmpeg
FFmpeg官网:FFmpeg
之后会跳转界面到这个网站:Builds - CODEX FFMPEG @ gyan.dev
找到构建好的安装包地址:
下载完成之后将文件复制到你想复制的地方:
添加环境变量:
测试安装完成
打开cmd
输入 ffmpeg -version
完成安装
七、FFmpeg基本推流测试
找到之前编译好的文件,启动MediaServer服务,在cmd控制台启动服务
MediaServer start
出现这个代表服务启动OK
启动ffmpeg进行视频流推送,同样是在cmd窗口执行命令
ffmpeg -re -i "D:\MyFiles\FFOutput\[高清 1080P+] 正义联盟:扎克·施奈德版.mp4" -vcodec h264 -acodec aac -f rtp_mpegts rtp://127.0.0.1:10000
rtp://127.0.0.1:10000是推送到的地址
rtp:视频推送方式
h264:是视频的视频编码格式
访问推送出来的视频流
在ffmpeg服务启动后,MediaServer服务的命令窗口会出现这些信息,EBDB747C就是推送出的文件名
视频访问路径:
http://127.0.0.1/rtp/EBDB747C.flv
这就完成了一个最基础的视频推流
具体操作ffmpeg请查看文档
FFmpeg文档(V4.0 2018/05/15) (itiit.cn)
八、一个基础的测试程序
一个正儿八经用的程序不可能还要自己敲命令(滑稽)
这里用了一个大佬写的基于.Net Core3.1的RESTful客户端的lib库
MingZhuLiu/ZLMediaKit.DotNetCore.Sdk: 一个基于ZLMediaKit的.NetCoreSDK (github.com)
使用Git下载
用Vs2019打开项目
原本的的调试项目是为了显示APi可调用的方法,并不能直接使用
稍微修改一下,只保留拉流方法
cmd启动MediaServer的程序(其实好像直接双击也可以。。。)
将STRealVideo.Control设置为启动项目,启动调试程序
在CMD的窗口会有key的信息,代表程序调用成功
此时可以访问http://127.0.0.1/live/2.live.ts,查看你所推流的视频(具体访问url规则,查看wiki播放url规则 · ZLMediaKit/ZLMediaKit Wiki (github.com))
那有没得办法不用先打开MediaServer的程序偷懒呢,有!
using System.Diagnostics; private static Process app; /// <summary> /// 启动MediaServer /// </summary> public static bool InitZLM() { if (app == null) { app = new Process(); var ServerUrl = ConfigHelper.GetJsonConfig("ServerUrl"); //"C:/Users/28636/Desktop/ZLM/MediaServer/MediaServer.exe" if (!File.Exists(ServerUrl)) { Console.WriteLine("MediaServer未成功启动"); Console.WriteLine("请配置ServerUrl后重新启动"); return false; } app.StartInfo.FileName = ServerUrl; app.StartInfo.UseShellExecute = false; app.StartInfo.RedirectStandardOutput = false; app.StartInfo.WindowStyle = ProcessWindowStyle.Minimized; app.Start(); } else { if (app.HasExited) //是否正在运行 { app.Start(); } } return true; } public static void Closed() { Process[] pProcess; pProcess = Process.GetProcesses(); for (int i = 1; i <= pProcess.Length - 1; i++) { if (pProcess[i].ProcessName == "MediaServer") //任务管理器应用程序的名 { pProcess[i].Kill(); break; } } app.Close(); //app.Kill(); }
添加这个方法,直接启动MediaServer,然后在调整一下代码
然后就能在控制台直接输入指定操作进行MediaServer的Api调用
(其实大概就是MediaServer调用ffmpeg,RESTful客户端去调用MediaServer,套娃。。。)
九、使用中遇到的问题
1、cpu的负载有些高
这个问题其实是因为在MediaSever的配置文件中ffmpeg默认是用cpu去进行编码的,只需要在MediaSever的配置文件中去修改命令的模板,将libx264修改为h264_qsv就是调用核显进行编码了,独显同理,不过发现独显还是厉害,画质更好,性能更强。 libx264(cpu) h264_qsv 核显编码(输出)----英特尔 h264_cuvid 独显解码 h264_nvenc 编码 ----英伟达
2、字符的编码格式问题,大佬提供的这个库,无论怎么都会出现中文乱码
大佬提供的这个库 默认采用的是utf-8,但是,,,
问题来了,就算在MediaServer的配置文件中使用utf-8,但是这个只是用于http的通信,MediaServer程序默认去读和写的操作还是用的GB2312的编码格式
你如果调用 `getServerConfig()`
就会导致你读到的中文怎么都会是乱码,没得办法,不太会C++,只能改这个.NETCore 写的 RESTful客户端, 在所有用到`DefaultEncoding`
的地方全部改为这个
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); var en = Encoding.GetEncoding("GB2312");
这样就不会出现中文乱码了
十、直接使用VS2019编译项目不使用CMake进行项目构建
时间来到2021.10.22,好像zlm的开发者优化了下什么东西,然后cmake就会报错
这个错误我也不太懂是怎么出现的,所幸直接使用VS2017以上的高版本直接进行编译
这是WIKI 的编译说明:
先下载完项目后
打开文件夹后,会进入一个等待,VS会自动执行CMAKE的一个构建工作
选择如图文件:这个是Cmake的编译说明文件
选中后,下拉选择管理配置,下方配置类型选择Release
生成的文件会在XXXX\ZLMediaKit\release\windows64\Release的文件夹下