视频转码服务架构说明书

需求定义

视频转码服务,具备将高码率的视频转换为低码率的视频,和对不同编码格式的视频进行转换能力的后台服务;


规格定义

性能指标:


吞吐量和性能指标

4核 8G 1000M网卡

GeForce GT 1030 以上显卡

CPU 到 80%

网络占用率 到 70%

100路 720P 高清 2Mbps -> 640*480P 800kbps

50路 1080P 高清 4Mbps  -> 640*480P 800kbps


时延要求:转码服务对视频播放延时需要小于3S


支持的协议和编码类型:

协议类型

TCP/UDP

流媒体支持

RTP/PS/RTMP

视频类型

H264/VP8/VP9/H265

音频类型

AAC/OPUS/iLBC


架构设计

视频转码服务的模块框图如下图:


呱牛笔记

图1.整体框图


FFmpeg是可以进行多种格式的音频、视频解码、转换、流功能的多媒体开发框架,包含了libavcodec 用于多个项目中音频和视频的解码器库,libavformat进行音频与视频格式转换库,以及libavfilter用于做视频水印、叠加等特效处理的filter工具。同时,FFmpeg可通过使用Nvidia的GPU加速进行视频编解码,根据Nvidia网站上关于硬件编码和软件编码的性能对比,性能以每秒钟编码帧数为参考指标,质量以PSNR为参考指标,可看出性能方面Nvidia编码器是x264的2~5倍,质量方面对于fast stream场景来说Nvidia编码器优于x264。


ZLMediaKit是一个基于C++11的高性能、运营级、流媒体服务框架,支持多种流媒体协议(RTSP/RTMP/HLS/HTTP-FLV/WebSocket-FLV),支持协议间的互相转换,并对异步IO的网络编程模型进行了封装,是一个非常适合做转码服务器的流媒体服务框架。



线程模型


转码请求接收线程(监听固定3500端口)

接收媒体包线程

转码线程

发送线程

日志线程



类图设计

呱牛笔记

转码请求接收线程输入请求格式定义:


输入请求

{“dest_ip”:11.12.112.10,

“dest_port”:9000,

“socket_protocol”:”udp”,

“transport_protocol”:”rtp”,

“source_width”:1080,

“source_height”:1920,

“source_samplerate”:2000,

“source_media_type”:”rtp”,

“source_video_codec”:”h264”,

“source_audio_codec”:”aac”,

“dest_video_codec”:”h264”,

“dest_audio_codec”:”aac”,

“dest_width”:640,

“dest_height”:480,

“dest_samplerate”:800 }

输出

{“recv_packet_ip”:”11.12.112.10”, “recv_packet_port”:”9099”}



输出:目的IP、端口,网络协议, 源分辨率,源码率, 目标分辨率, 目标码率, 媒体类型(RTP/PS/RTMP/RTSP),视频格式,音频格式,目标视频格式, 目标音频格式

返回:监听的转码服务包接收IP/端口;


业务流程图

呱牛笔记

  1. 调用方先发送消息给视频转码服务后台的3500端口,配置转码相关信息,要求开始转码;

  2. 视频转码服务接收到调用方的请求后,判断是否具备转码所需要的服务能力,并将配置信息进行存储,返回接收转码包的监听IP和端口;

  3. 调用方监听目标视频的接收端口,并再接收到目标视频流后,转发给需要的客户端,也可以在第一步直接将客户端的IP和端口作为参数提交给转码服务,调用方不需要接收转码完成的视频流;

  4. 发送视频流到转码服务的接收IP和端口;

  5. 将转码完成的视频数据发送给接收IP和端口;

  6. 该步骤发送消息给3500端口结束转码


负载均衡支持

呱牛笔记

主节点和主节点之间存在心跳消息,主节点和子节点间存在心跳,子节点间不存在心跳;主节点需要负责子节点的转码任务分配,负责将请求转发到子节点,存储各子节点的任务数和吞吐量等服务器状态信息,负责子节点间的负载均衡;主节点和子节点可以分布式部署在不同的服务器上。具体的心跳消息和任务分配消息详细设计中体现。


本文为呱牛笔记原创文章,转载无需和我联系,但请注明来自呱牛笔记 ,it3q.com

请先登录后发表评论
  • 最新评论
  • 总共0条评论