Live555 是業界廣泛使用的開源 RTSP/RTP 媒體流庫,由四大核心靜態庫組成:libUsageEnvironment、libliveMedia、libgroupsock、libBasicUsageEnvironment。本文展示如何在 VC++2010 中整合這些庫,構建一個基於 RTP 多播的 MPEG-TS 直播推流端,配合 VLC、FFplay 等播放器驗證。
TaskScheduler* scheduler = BasicTaskScheduler::createNew();
env = BasicUsageEnvironment::createNew(*scheduler);
// 多播地址與端口(SSM/ASM 可切換)
char const* destinationAddressStr = "239.255.42.42"; // ASM 多播組
const unsigned short rtpPortNum = 1234;
const unsigned short rtcpPortNum = rtpPortNum + 1;
const unsigned char ttl = 7; // 穿越 7 層路由
struct in_addr destinationAddress;
destinationAddress.s_addr = our_inet_addr(destinationAddressStr);
Groupsock rtpGroupsock(*env, destinationAddress, Port(rtpPortNum), ttl);
Groupsock rtcpGroupsock(*env, destinationAddress, Port(rtcpPortNum), ttl);
// Payload Type 33 為 MPEG2-TS,時鐘頻率 90000 Hz
videoSink = SimpleRTPSink::createNew(*env, &rtpGroupsock,
33, 90000, "video", "mp2t", 1, True, False);
// RTCP 實例:用於 QoS 監控與同步
RTCPInstance::createNew(*env, &rtcpGroupsock,
5000, // 預估帶寬 kbps
CNAME, videoSink, NULL, isSSM);
通過定義 IMPLEMENT_RTSP_SERVER 宏可啟用內嵌 RTSP Server,允許客戶端通過 rtsp://ip:port/testStream 拉流,而非僅限 RTP 多播。
void play() {
// 以 TS 包大小 (188 bytes) * 7 為讀取塊大小
ByteStreamFileSource* fileSource = ByteStreamFileSource::createNew(*env, "test.ts", 1316);
videoSource = MPEG2TransportStreamFramer::createNew(*env, fileSource);
// 開始推流,播放結束回調 afterPlaying 實現循環播放
videoSink->startPlaying(*videoSource, afterPlaying, videoSink);
}
test.ts 必須為標準 MPEG-TS 格式(含 PAT/PMT/PCR 等表)rtp://239.255.42.42:1234 即可觀看MPEG2TransportStreamFramer 為 H264VideoStreamFramer 支持 H.264 ES 推流RTSPServer 實現點播、暫停、拖拽等交互控制本文轉載自 “leixiaohua1020視音頻技術” 博客,原文地址:https://leixiaohua1020.blog.51cto.com/3974648/1303876