ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

.NET直播流媒体服务器Berry.Live实战:从部署到调优

.NET直播流媒体服务器Berry.Live实战:从部署到调优 做直播服务端选型这件事我前前后后折腾过不少方案。从最早用Nginx加RTMP模块自己拼到后来上SRS再到换Go写的轻量服务每个方案都有让人挠头的地方。最近一段时间我一直在用Berry.Live这套基于.NET的直播流媒体服务器算是把“开箱即用”这四个字体验明白了。如果你也在找一套能快速落地、不折腾底层协议、又能按需扩展的直播服务这篇文章应该能帮你省下不少弯路。我会从设计思路、部署步骤、核心实操到问题排查把能直接抄作业的内容都写出来。1. 整体设计思路与方案选型1.1 直播服务器到底解决什么问题很多人第一次接触直播服务端会以为只要把视频流推上去、能拉出来播放就算完事。真做起来才发现里面涉及的东西远比想象中多流接入协议要兼容RTMP、RTSP、SRT各有各的适用范围、转封装要处理把RTMP流转成HLS或HTTP-FLV、录制要考虑切片策略、播放要照顾不同端浏览器、移动端、小程序的兼容性还有鉴权、统计、多路并发下的稳定性。我刚入行那会儿大部分时间都耗在“修服务器”而不是“做业务”上。比如用Nginx-RTMP配置简单但扩展能力有限用SRS功能很强大但配置项多到需要专门研究一段时间自己基于FFmpeg写转码脚本又得处理进程管理、异常恢复这些脏活累活。当时团队里没有专门的流媒体工程师每次直播活动前大家都很紧张。Berry.Live这种基于.NET的流媒体服务器让我眼前一亮的原因不在于它比其他方案强大多少而在于它把“常用功能直接可用”这件事做到了极致。默认就能处理RTMP推流、HTTP-FLV拉流、HLS切片播放还能直接录制MP4这些在传统方案里分别对应三四个组件的活在这里一个进程就搞定了。1.2 为什么是.NET而不是其他方案选型这件事没有绝对的最好只有合不合适。如果你是纯视频业务团队团队里都是C或Go背景那SRS、MediaMTX可能更顺手。但如果你的团队本身就是.NET技术栈或者你对C#的生态比较熟悉Berry.Live的价值就很明显了。首先是语言层面的亲和力。直播服务端涉及大量并发连接和流数据处理.NET的异步编程模型async/await配合Channel、Pipe等写起来非常自然。之前用Node.js写类似服务时还得小心处理事件循环阻塞问题。另一个是部署运维的统一性。公司基础设施以Windows Server为主的话Berry.Live可以直接跑在IIS或Windows服务里不需要额外搭一套Linux环境。反过来它也能跨平台跑在Docker容器里不会把你绑死在某个操作系统上。还有一个很实际的好处出了问题好排查。流媒体服务器最怕黑盒SRS和Nginx-RTMP出问题时看一眼日志往往信息量不够得自己去追源码逻辑。Berry.Live因为是.NET系可以用dotnet-dump、dotnet-trace等工具直接抓现场配合VS调试器定位问题比在C项目里快得多。1.3 与其他主流方案的核心对比我把几个常见方案放在一起横向比过各有各的适用场景但如果你追求“部署简单代码可控社区活跃”Berry.Live的平衡点是最舒服的。方案语言生态部署复杂度功能完整度扩展方式Nginx-RTMPC中基础推拉流、录制配置为主二次开发成本高SRSC高全面海量配置项配置插件学习曲线陡MediaMTXGo低协议多但偏转发配置为主API较轻Berry.Live.NET低推拉流、HLS、录制、API完备C#直接扩展SDK友好这个表不是说SRS不好而是说如果你只需要稳定的直播流转发能力SRS那些强大的集群方案对你来说反而是负担。Berry.Live的定位很清晰它不是一个试图覆盖所有场景的庞然大物而是一个把常见直播场景做到开箱即用的轻量级平台。从实测数据看单机处理几百路并发拉流没有明显压力再往上走的话横向扩展加负载均衡也不是什么难事。2. 部署环境准备与基础配置2.1 运行环境与版本要求Berry.Live基于.NET 8构建所以部署环境的第一步就是把对应的运行时准备好。如果你要部署的机器是纯净系统可以直接从官方渠道下载.NET 8 SDK或Runtime。这里有个容易踩的坑在Windows Server上如果只装了.NET Framework 4.8而没装.NET Core/.NET 8的Runtime启动Berry.Live时会直接报“框架依赖缺失”之类的错误。历史上.NET Framework和.NET Core现在就叫.NET是两套东西前者主要面向传统Windows应用后者才是跨平台的主力。提示Berry.Live需要的是.NET 8或更高版本运行时不是.NET Framework 4.8。安装前可以用dotnet --info命令确认当前环境的版本避免装了运行库却版本不匹配的尴尬。跨平台部署也很方便Linux上可以下载对应的tar.gz包解压即用或者通过包管理器安装macOS上基本同样方式。出于生产环境稳定性的考虑我建议优先用Docker方式部署这样可以把运行时、依赖、配置都打进镜像避免“在我电脑上明明好的”这类环境不一致问题。2.2 Docker部署方式与镜像加速Docker部署Berry.Live的Dockerfile写起来很简单基础镜像用mcr.microsoft.com/dotnet/aspnet:8.0就行。但这里我要特别提醒一个很常见的问题很多人在拉取基础镜像时卡住报错信息长这样error response from daemon: get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection这个报错的原因是Docker默认从Docker Hub拉镜像但网络状况不佳时连接会超时或中断。解决办法是给Docker配置镜像加速器把registry-mirrors指到可用的镜像站点。在Linux上编辑/etc/docker/daemon.json在Windows Docker Desktop的Settings - Docker Engine里修改{ registry-mirrors: [ https://docker.mirrors.xxx.com ] }配置完重启Docker服务再重新拉镜像就不会卡住了。这类问题虽然不复杂但如果你第一次接触Docker很容易在这一步卡上半天还以为是自己代码写错了。2.3 基础配置项解析Berry.Live的配置文件是典型的JSON格式我习惯把配置拆成两类一类是启动时读取静态配置另一类是通过管理API动态调整。这里列一下最常用的基础配置{ Server: { HttpPort: 8080, RtmpPort: 1935, RtspPort: 554, HlsPort: 8080 }, Stream: { EnableRecord: true, RecordPath: ./records, HlsSegmentSeconds: 4, HlsListSize: 6 }, Auth: { EnablePushAuth: false, EnablePlayAuth: false, Secret: } }几个关键点说一下HttpPort是HTTP服务端口HTTP-FLV和HLS播放都走这个端口。RtmpPort是RTMP推流端口OBS等推流端默认往1935推。HlsSegmentSeconds是HLS切片时长通常取2到6秒之间。时长越短延迟越低但切片文件越多对磁盘IO的压力也越大。普通场景4秒是一个兼顾延迟和稳定性的中间值。RecordPath是录制文件保存目录注意磁盘空间规划。配置完成后启动服务基本就是一行命令的事。我在Windows上测试时dotnet Berry.Live.dll直接就起来了控制台日志会打印出各个协议的监听地址和端口看到RTMP server started on :1935这类字样就说明服务已经正常启动。2.4 从源码构建Berry.Live如果官方发布的二进制包不满足你的定制需求或者你想基于源码进行二次开发从源码构建也很直接。项目使用dotnet build即可完成编译但有几个细节值得留意。首先是用Git克隆代码后检查global.json文件是否指定了特定的SDK版本。如果本机SDK版本和它要求的版本不一致dotnet命令会报错提示找不到匹配的SDK而不是自动使用高版本这点很反直觉。此时要么安装指定的SDK版本要么把global.json删除或改成当前SDK版本号。其次是构建前需要还原NuGet依赖。国内网络环境下NuGet官方源有时会很慢建议在NuGet.config里配置多个源configuration packageSources add keynuget.org valuehttps://api.nuget.org/v3/index.json / add keycn valuehttps://mirrors.xxx.com/nuget / /packageSources /configuration构建命令如下dotnet restore dotnet build -c Release dotnet publish -c Release -r linux-x64 --self-contained false如果目标机器上没有安装.NET运行时可以把--self-contained改成true这样发布出来的包会带上运行时目标机不需要额外安装.NET不过包体积会大很多。发布完成后把publish目录整个拷贝到目标机器执行dotnet Berry.Live.dll或者直接运行生成的二进制文件self-contained模式下即可。3. 核心实操从推流到播放的完整链路3.1 推流端接入OBS和FFmpeg两条路服务端跑起来之后第一件事就是验证推拉流链路是否通畅。一般我会用OBS来测试界面直观、能实时看到画面。OBS推流设置如下设置 - 直播服务选“自定义...”服务器填rtmp://localhost:1935/live串流密钥填room1。这里的live是应用名可以自定义room1是流名称播放端需要用同一个名称来拼URL。点开始直播后如果服务端日志出现publish stream: room1类似的记录说明推流成功了。如果你是命令行的忠实用户或者需要在自动化脚本里测试推流FFmpeg更方便ffmpeg -re -i test.mp4 -c copy -f flv rtmp://localhost:1935/live/room1加-re参数是为了按视频原始帧率进行读取和推送不加速推流。-c copy表示直接复制音视频编码不做转码适合源文件编码格式本来就是H.264AAC的情况。如果源文件编码不匹配比如是HEVC视频就需要先转码再推命令会复杂一些后面会讲到。3.2 拉流播放三种协议怎么选推流成功后拉流的协议选择决定了你的应用场景。Berry.Live支持常见的HTTP-FLV、HLS和RTMP拉流这三种协议各有各的适用场景。HTTP-FLV延迟低一般在1到3秒内兼容性不错浏览器端配合flv.js可以直接播放。适合直播互动场景比如在线课堂、连麦PK。HLS延迟相对高一点通常5到15秒但兼容性最好iOS Safari可以直接播放小程序也支持。适合对实时性要求不高但要求播放稳定的场景。RTMP拉流主要用于传统播放器或对接第三方平台如果推流端是RTMP拉流端也用RTMP最省事延迟也比较低。我在实际项目里如果客户要求低延迟会优先推荐HTTP-FLV如果客户要求全平台兼容就直接上HLS。前端播放地址示例如下HTTP-FLV: http://localhost:8080/live/room1.flv HLS: http://localhost:8080/live/room1.m3u8用VLC验证的话直接打开网络串流粘贴上面的URL就能播放。这里有一个细节HLS流因为切片列表的更新时间播放器首次打开可能需要等几秒才能出画面这不代表服务有问题而是协议本身的机制。3.3 低延迟场景下的参数调优如果你要做的是在线答题、拍卖直播这类对延迟敏感的场景默认配置可能需要调整。我实测下来把HLS切片时长降到2秒同时拉流端使用HTTP-FLV可以做到端到端延迟在2秒左右不包含推流端上传延迟。{ Stream: { HlsSegmentSeconds: 2, HlsListSize: 3, GopCache: true } }GopCache这个参数很关键它表示开启GOP缓存。简单解释一下视频流是由I帧关键帧和P帧预测帧组成的播放器必须从I帧开始才能解码。如果播放器在直播中途接入而服务端不做缓存它只能等下一个I帧到达后才能开始播放这个等待时间可能是2秒也可能是10秒取决于GOP长度。开启GOP缓存后服务端会缓存最近一个I帧之后的数据新播放器接入时能立即从I帧开始拉流大大缩短首帧时间。3.4 录制、转码与多路流复用直播录制是很多业务场景的刚需不管是做课程回放还是活动留档。Berry.Live默认支持录制为FLV或MP4格式。FLV录制方式对服务器性能开销很小但后期剪辑和播放不如MP4方便。如果直接录制MP4需要服务端在录制结束后做一次封装处理所以我的建议是长期存储用MP4临时留档用FLV。配置文件里这样开启录制{ Stream: { EnableRecord: true, RecordFormat: mp4, RecordPath: /data/records } }录制文件会自动按流名称和时间命名方便检索。需要注意磁盘空间管理一路720p直播每小时大约产生1到2GB的录制文件取决于码率如果长期录制多路直播一定要做定期清理或转存对象存储否则磁盘很快就满了。转码方面Berry.Live支持多种码率和分辨率的转码这一点对移动端观看很实用。如果你的推流端是1080p/4Mbps而手机端网络条件不好直接把原流推给手机显然不现实。通过转码配置服务端可以同时输出多档清晰度播放端根据网络情况自动选择或由用户手动切换。转码功能的配置需要指定FFmpeg的路径Berry.Live内部会调用FFmpeg做转码然后配置多档转码模板{ Transcode: { FfmpegPath: /usr/bin/ffmpeg, Profiles: [ { Name: sd, Width: 640, Height: 360, Bitrate: 800, Fps: 25 }, { Name: hd, Width: 1280, Height: 720, Bitrate: 1800, Fps: 30 } ] } }转码会消耗CPU资源一台8核机器同时转3到4路1080p到720p问题不大如果再高就需要评估硬件转码或GPU加速了。我这里说的都是纯软转码的情况实际生产环境如果转码路数多建议还是让GPU干活。3.5 鉴权与防盗链直播服务只要公网可访问就一定会面临地址被扫描、流被恶意拉取的问题。解决手段有两个层面推流鉴权和播放鉴权。推流鉴权最简单的方式是设置推流密钥Stream Key只有知道密钥的人才能推流。在Berry.Live里推流地址可以带上签名参数rtmp://localhost:1935/live/room1?tokenxxxxxx播放鉴权更复杂一些通常采用“URL签名”的方式服务端生成一个带过期时间的播放签名播放端用这个签名去拉流过期后签名无效。这种方案在防盗链场景下非常好用配置密钥后播放地址必须携带正确的签名和时间戳才能拉流成功。如果你要对接自己的业务系统Berry.Live的管理API可以直接用来查询在线流列表、踢流、检查某个流的状态。我把常用的API记录一下GET /api/streams GET /api/streams/{name} POST /api/streams/{name}/kick这些API对做直播后台管理系统非常有帮助。我做过一个项目后台需要实时展示当前有多少路直播在线、每路的观看人数和码率就是通过这套API实现的。4. 常见报错与排查经验实录4.1 播放端浏览器报错排查清单用浏览器播放流媒体时经常遇到各种net::开头的报错。这里把我踩过的坑和排查思路整理成一份速查表报错信息常见原因处理方式net::ERR_CONNECTION_TIMED_OUT服务器端口不通或防火墙拦截检查播放端口是否放行telnet验证端口连通性net::ERR_SSL_PROTOCOL_ERRORHTTP播放地址写成了HTTPS或证书链问题确认协议一致如果是HTTPS播放检查证书有效性net::ERR_INCOMPLETE_CHUNKED_ENCODING 200服务端Response被中断多是因为连接被重置检查反向代理超时配置调大proxy_read_timeoutnet::ERR_HTTP2_PROTOCOL_ERROR 206 (PARTIAL CONTENT)HLS切片分片加载时HTTP/2的Range请求处理异常临时关闭HTTP/2或让播放器改用HTTP/1.1net::ERR_CERT_COMMON_NAME_INVALID证书域名和访问域名不匹配更换证书或确保域名匹配第一条的“端口不通”经常被忽略。很多云服务器默认安全组只开放80和443你给8080端口开了服务外部却死活访问不了排查一圈发现是安全组没放行。建议部署时把所有需要对外开放的端口整理成一张清单在云控制台和安全组里一次性放行。第二条里的HTTPS问题也很典型。我在一个项目里配置了Nginx反向代理给Berry.Live加HTTPS播放地址用https://xxx/live/room1.flv但因为证书是自签名的浏览器直接拦截导致播放失败。这种情况在开发环境可以临时让浏览器忽略证书错误但生产环境一定要用正规证书。4.2 服务端日志与定位思路服务端出了问题第一件事是看日志而不是瞎猜。Berry.Live的日志可以通过Serilog等组件输出到控制台和文件日志级别也支持动态调整。建议生产环境把日志级别设置为Information而不要设置为Debug否则日志刷得太快反而找不到关键信息。日志里最常出现的几类信息[INF] Start publisher stream: room1, type: rtmp [INF] Start player stream: room1, protocol: http-flv [WRN] HLS segment create failed: /data/hls/room1-0001.ts [ERR] RTMP handshake error: client 192.168.1.10RTMP handshake error这类错误通常不是服务端的问题而是推流端协议不兼容或者网络丢包严重。如果使用FFmpeg推流报这个错可以先试试换OBS推流如果OBS正常说明FFmpeg版本或参数有问题如果两者都报错就要检查网络链路比如防火墙是否限制了RTMP端口。HLS切片创建失败多半是目录权限问题。我遇到过服务以普通用户运行但录制或切片目录是root创建的导致写不进去。解决办法很简单给服务运行用户授权或者修改目录属主。4.3 Docker部署常见的三个坑我在这部分吃过不少亏列出来给大家避坑第一个坑容器内部的端口映射搞混。容器里Berry.Live监听1935和8080端口但宿主机对外只映射了8080导致外部用RTMP地址推流时一直连不上。正确做法是启动容器时做完整的端口映射docker run -d \ -p 1935:1935 \ -p 8080:8080 \ -v /data/records:/app/records \ -v /data/hls:/app/hls \ --name berry-live \ berry.live:latest第二个坑容器重启后数据丢失。如果录制文件和HLS切片写在容器内部路径容器一删除就全没了。所以必须用-v参数把数据目录挂载到宿主机养成“容器无状态、数据持久化”的习惯。第三个坑防火墙和SELinux拦截。在CentOS或Rocky Linux上部署时即使端口映射正确宿主机防火墙也可能拦截外部流量。需要把对应端口添加到防火墙放行列表遇到SELinux强制模式时可能还需要调整相关策略或临时关闭SELinux不推荐生产环境这样做治标不治本。4.4 大并发拉流导致的OOM问题有一次做一场线上直播活动推流端只有一路但观看端因为某个渠道出了BUG瞬间拉起了上千路HTTP-FLV连接。结果服务器直接从8G内存飙升到7.8G最后触发OOM Killer把进程杀掉了。这个问题的根源在于我没有对每个拉流会话做内存限制让每个连接都缓存了太多数据。解决办法有两个方向。第一从源头限制连接数和服务端缓冲{ Server: { MaxPlayers: 5000, WriteBufferSize: 65536, FlushIntervalMs: 100 } }WriteBufferSize是每个连接的写缓冲区大小默认值通常够用但如果并发太高可以调小一点来降低内存占用。FlushIntervalMs是服务端把缓冲数据推送出去的间隔间隔越大延迟越高但CPU和内存压力更小。第二从架构层面用CDN或负载均衡分流。如果观看并发长期超过单机能力就要考虑基于Nginx或其他网关做流媒体负载均衡。把HTTP-FLV和HLS的播放请求分散到多台Berry.Live实例每台只承担一部分拉流压力。这也是生产环境里最常见的高并发方案。5. 性能调优与生产环境落地建议5.1 影响流媒体性能的关键参数流媒体服务器的性能瓶颈主要在三个方面网络带宽、磁盘IO、CPU/内存。每一个都需要针对性地调优否则单独增加某一项资源解决不了根本问题。网络带宽是最容易被低估的瓶颈。假设你是1Gbps带宽的服务器一路1080P视频按4Mbps算满带宽也只能支持大约250路并发拉流。这个数字看着不大实际业务里一个热门直播间几分钟就能打满。所以在做容量规划时一定先算清楚“带宽够不够”再谈服务器配置。磁盘IO方面HLS切片会不断地往磁盘写小文件每路流每2到4秒就生成一个ts切片文件。如果磁盘IO能力弱切片写得太慢播放端就经常出现缓冲。另外一个隐藏的问题是文件碎片化长时间运行后磁盘碎片增多也会影响读写性能。我建议录制和切片目录使用独立的SSD盘避免和系统盘抢IO。CPU资源在纯转发场景下消耗不大除非开启了转码功能。转码是纯计算密集型的活一路720P转码大约需要1到2核的CPU资源1080P转码则更多。如果业务确实需要多路转码不要硬扛软转码优先考虑NVIDIA NVENC或Intel QSV这类硬件加速方案。5.2 缓存、集群与CDN分发单台服务器的承载能力终究有限做直播业务大概率会遇到“怎么把服务能力水平扩展”的问题。比较简单的办法是通过Nginx等反向代理作为流媒体网关把不同的播放请求分发到不同的Berry.Live实例。不过流媒体和普通HTTP服务不一样拉流连接通常持续时间长负载均衡策略需要考虑会话保持不然播放器在拉流过程中被切到另一台实例没有对应流数据就直接中断了。更进一步的方案是使用CDN做边缘分发。把Berry.Live部署在源站CDN节点回源拉流并缓存分发用户在边缘节点就近获取视频流既降低了源站压力也提升了不同地区用户的播放体验。目前主流的云厂商都有直播CDN产品配置时要注意回源协议和鉴权参数确保CDN节点能正常回源。还有一个折中的方案多实例推流。同一路视频流同时推送到多个Berry.Live实例播放端按区域选择最近的实例拉流。缺点是推流端会额外消耗上行带宽优点是不依赖CDN服务商架构相对简单可控。我在内部测试环境就是这么干的几台机器同时推流压测效果还不错。5.3 前端播放器的选择与对接服务端再稳定最终用户看到的还是播放器。如果播放器选型没做好前面所有努力都有可能白费。我常用的组合是场景播放器方案备注浏览器播放HTTP-FLVflv.js video.jsflv.js处理FLV解析video.js做UI封装浏览器播放HLShls.js原生Safari可直接播放无需hls.js移动端AppIJKPlayer / ExoPlayer支持RTMP和HLS协议小程序官方live-player组件支持RTMP和HLS播放浏览器播放HTTP-FLV时有一个非常容易踩的坑如果是HTTPS页面播放HTTP的流地址会被浏览器默认阻止报NET::ERR_SSL_PROTOCOL_ERROR或Mixed Content错误。解决办法是让整个页面和流地址都使用HTTPS把流媒体服务放到Nginx等反向代理后面统一用HTTPS对外提供。另外播放器还要处理断流重连的问题。直播过程中推流端断网或服务端重启都会导致播放中断播放器要监听error和ended事件做自动重连。我的经验是不要一失败就立刻重连设置递增的退避时间比如第一次1秒第二次2秒最多延迟10秒避免服务端还在恢复中播放器就疯狂重连把它压垮。5.4 监控告警与日志采集流媒体服务不像普通Web服务可以十分钟不看一眼日志直播过程中断了就是事故。一定要配监控告警尤其是下面这几个指标在线流数量如果一段时间内突然归零大概率是服务出问题了。拉流并发数持续偏高时要关注带宽和内存水位。推流码率和帧率异常波动往往意味着推流端有问题。录制和切片成功率失败时需要立刻处理否则视频残缺。监控指标可以暴露成Prometheus格式配合Grafana做可视化面板。告警规则建议只对“影响用户观看”的事件告警比如在线流数量归零、播放成功率下降超过阈值等减少无效告警带来的“狼来了”效应。日志采集方面建议把Berry.Live的日志直接输出到JSON格式用Filebeat或Promtail采集再交给Elasticsearch或Loki做集中检索。这样排查问题时可以在日志平台里按时间轴搜索比登录每台服务器翻日志高效得多。5.5 生产环境落地的几个补充经验最后再分享几个比较容易忽略的细节。第一时间同步问题。直播服务里HLS切片的文件名和播放列表都和时间相关如果服务器时间不准客户端拿到的切片列表可能会对不上造成播放中断。在生产环境中一定要配置NTP时间同步。第二域名规划。不要把流媒体地址直接暴露IP统一用域名对外提供服务后续做负载均衡、CDN分发都会方便很多。推荐用独立的流媒体域名比如live.example.com别和官网混在一起因为直播域名的证书、带宽和缓存策略往往不一样。第三安全组和防火墙的端口管理。推流端口如1935通常是面向内部的播放端口如8080才需要对外开放。如果你同时使用了HTTPS反向代理对外可能只需要开放443端口内部再通过反向代理转发到流媒体服务端口。这样暴露面更小安全风险也会降低。第四别忘了做压测。上线前用模拟推流和模拟拉流做一轮简单的压力测试能发现很多平时注意不到的问题。我当时压测时就发现高并发下HTTP-FLV连接数一上去文件描述符不够用了。解决办法是调大系统文件描述符限制用ulimit -n或在容器启动参数里加--ulimit nofile65535:65535。Berry.Live这套方案我个人在实际使用中最大的感受是它把直播服务端的门槛降得很低。以前用SRS或Nginx-RTMP调一个参数要查半天文档、跑好几轮测试而用Berry.Live从部署到跑通第一路流基本半天之内就能搞定。如果你也是.NET技术栈的团队或者正在寻找一个轻量、可控、扩展性好的直播流媒体服务器非常值得试一下。先把推流和播放跑通再逐步加上录制、转码和鉴权你会发现做一套直播平台并没有想象中那么复杂。
返回列表