需求说明
视频转码服务,具备将高码率的视频转换为低码率的视频,和对不同编码格式的视频进行转换能力的后台服务;
规格定义
性能指标:
| 吞吐量和性能指标 |
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/端口;
- 调用方先发送消息给视频转码服务后台的3500端口,配置转码相关信息,要求开始转码;
- 视频转码服务接收到调用方的请求后,判断是否具备转码所需要的服务能力,并将配置信息进行存储,返回接收转码包的监听IP和端口;
- 调用方监听目标视频的接收端口,并再接收到目标视频流后,转发给需要的客户端,也可以在第一步直接将客户端的IP和端口作为参数提交给转码服务,调用方不需要接收转码完成的视频流;
- 发送视频流到转码服务的接收IP和端口;
- 将转码完成的视频数据发送给接收IP和端口;
- 该步骤发送消息给3500端口结束转码
主节点和主节点之间存在心跳消息,主节点和子节点间存在心跳,子节点间不存在心跳;主节点需要负责子节点的转码任务分配,负责将请求转发到子节点,存储各子节点的任务数和吞吐量等服务器状态信息,负责子节点间的负载均衡;主节点和子节点可以分布式部署在不同的服务器上。具体的心跳消息和任务分配消息详细设计中体现。