需求說明
視頻轉碼服務,具備將高碼率的視頻轉換爲低碼率的視頻,和對不同編碼格式的視頻進行轉換能力的後臺服務;
規格定義
性能指標:
|
吞吐量和性能指標 |
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端口結束轉碼
主節點和主節點之間存在心跳消息,主節點和子節點間存在心跳,子節點間不存在心跳;主節點需要負責子節點的轉碼任務分配,負責將請求轉發到子節點,存儲各子節點的任務數和吞吐量等服務器狀態信息,負責子節點間的負載均衡;主節點和子節點可以分佈式部署在不同的服務器上。具體的心跳消息和任務分配消息詳細設計中體現。