mirror of
https://github.com/ZLMediaKit/ZLMediaKit.git
synced 2026-07-06 19:58:10 +08:00
feat: 增加webrtc代理拉流 (#4389)
- 增加客户端模式,支持主动拉流、推流: - addStreamProxy接口新增支持whep主动拉流,拉流地址目前只兼容zlm的whep url。 - addStreamPusherProxy接口新增支持whip主动推流,推流地址目前只兼容zlm的whip url。 - 以上推流url格式为webrtc[s]://server_host:server_port/app/stream_id?key=value, 内部会自动转换为http[s]://server_host:server_port/index/api/[whip/whep]?app=app&stream=stream_id&key=value。 - 增加WebRtc p2p 模式: - 增加 ICE FULL模式。 - 增加STUN/TURN 服务器。 - 增加websocket 信令。 - 增加P2P代理拉流。 --------- Co-authored-by: xia-chu <771730766@qq.com> Co-authored-by: mtdxc <mtdxc@126.com> Co-authored-by: cqm <cqm@97kid.com>
This commit is contained in:
210
webrtc/RtpMap.h
Normal file
210
webrtc/RtpMap.h
Normal file
@@ -0,0 +1,210 @@
|
||||
/*
|
||||
* Copyright (c) 2016-present The ZLMediaKit project authors. All Rights Reserved.
|
||||
*
|
||||
* This file is part of ZLMediaKit(https://github.com/ZLMediaKit/ZLMediaKit).
|
||||
*
|
||||
* Use of this source code is governed by MIT-like license that can be found in the
|
||||
* LICENSE file in the root of the source tree. All contributing project authors
|
||||
* may be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#ifndef ZLMEDIAKIT_RTPMAP_H
|
||||
#define ZLMEDIAKIT_RTPMAP_H
|
||||
|
||||
#include <set>
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <memory>
|
||||
#include <iostream>
|
||||
#include <iomanip>
|
||||
#include <cassert>
|
||||
#include "Extension/Frame.h"
|
||||
|
||||
namespace mediakit {
|
||||
|
||||
class RtpMap {
|
||||
public:
|
||||
using Ptr = std::shared_ptr<RtpMap>;
|
||||
RtpMap(std::string code_name, uint8_t payload, uint32_t clock_rate)
|
||||
: _code_name(std::move(code_name))
|
||||
, _payload(payload)
|
||||
, _clock_rate(clock_rate) {}
|
||||
virtual ~RtpMap() = default;
|
||||
|
||||
virtual TrackType getType() = 0;
|
||||
|
||||
const std::map<std::string /*key*/, std::string /*value*/> &getFmtp() const { return _fmtp; }
|
||||
|
||||
const std::string &getCodeName() const { return _code_name; }
|
||||
uint8_t getPayload() const { return _payload; }
|
||||
uint32_t getClockRate() const { return _clock_rate; }
|
||||
|
||||
protected:
|
||||
std::map<std::string /*key*/, std::string /*value*/> _fmtp;
|
||||
std::string _code_name;
|
||||
uint8_t _payload;
|
||||
uint32_t _clock_rate;
|
||||
};
|
||||
|
||||
class VideoRtpMap : public RtpMap {
|
||||
public:
|
||||
VideoRtpMap(std::string code_name, uint8_t payload, uint32_t clock_rate)
|
||||
: RtpMap(std::move(code_name), payload, clock_rate) {};
|
||||
|
||||
TrackType getType() override { return TrackVideo; }
|
||||
};
|
||||
|
||||
class AudioRtpMap : public RtpMap {
|
||||
public:
|
||||
AudioRtpMap( std::string code_name, uint8_t payload, uint32_t clock_rate)
|
||||
: RtpMap(std::move(code_name), payload, clock_rate) {};
|
||||
|
||||
TrackType getType() override { return TrackAudio; };
|
||||
};
|
||||
|
||||
#define H264_PROFILE_IDC_MAP(XX) \
|
||||
XX(PROFILE_H264_BASELINE, 66, "baseline") \
|
||||
XX(PROFILE_H264_MAIN, 77, "main") \
|
||||
XX(PROFILE_H264_HIGH, 100, "high") \
|
||||
XX(PROFILE_H264_HIGH10, 110, "high10") \
|
||||
XX(PROFILE_H264_HIGH422, 122, "high422") \
|
||||
XX(PROFILE_H264_HIGH444, 244, "high444") \
|
||||
|
||||
typedef enum {
|
||||
H264ProfileIdcInvalid = -1,
|
||||
#define XX(name, value, str) name = value,
|
||||
H264_PROFILE_IDC_MAP(XX)
|
||||
#undef XX
|
||||
H264ProfileIdcMax
|
||||
} H264ProfileIdc;
|
||||
|
||||
#define H264_PROFILE_LEVEL_MAP(XX) \
|
||||
XX(10) \
|
||||
XX(20) \
|
||||
XX(30) \
|
||||
XX(31) \
|
||||
XX(40) \
|
||||
XX(41) \
|
||||
XX(50) \
|
||||
XX(51)
|
||||
|
||||
typedef enum {
|
||||
H264ProfileLevelInvalid = -1,
|
||||
#define XX(value) H264_PROFILE_LEVEL_##value = value,
|
||||
H264_PROFILE_LEVEL_MAP(XX)
|
||||
#undef XX
|
||||
H264ProfileLevelMax
|
||||
} H264ProfileLevel;
|
||||
|
||||
class H264RtpMap : public VideoRtpMap {
|
||||
public:
|
||||
H264RtpMap(uint8_t payload, uint32_t clock_rate, H264ProfileIdc profile_idc)
|
||||
: VideoRtpMap("H264", payload, clock_rate)
|
||||
, _profile_idc(profile_idc) {
|
||||
_fmtp.emplace("level-asymmetry-allowed", "1");
|
||||
_fmtp.emplace("packetization-mode", "1");
|
||||
|
||||
toolkit::_StrPrinter printer;
|
||||
printer << std::setw(2) << std::setfill('0') << std::hex << _profile_idc;
|
||||
printer << std::setw(2) << std::setfill('0') << std::hex << _profile_iop;
|
||||
printer << std::setw(2) << std::setfill('0') << std::hex << _profile_level;
|
||||
_fmtp.emplace("profile-level-id", printer);
|
||||
};
|
||||
|
||||
private:
|
||||
H264ProfileIdc _profile_idc;
|
||||
int _profile_iop = 0;
|
||||
H264ProfileLevel _profile_level = H264_PROFILE_LEVEL_31;
|
||||
};
|
||||
|
||||
#define H265_PROFILE_IDC_MAP(XX) \
|
||||
XX(PROFILE_H265_MAIN, 1, "main") \
|
||||
XX(PROFILE_H265_MAIN10, 2, "main10") \
|
||||
XX(PROFILE_H265_MAINSTILL, 3, "mainstill") \
|
||||
XX(PROFILE_H265_RANGE_EXTS, 4, "RangeExtensions") \
|
||||
XX(PROFILE_H265_HIGH_THROUGHPUT, 5, "HighThroughput") \
|
||||
XX(PROFILE_H265_MULTIVIEW, 6, "MultiviewMain") \
|
||||
XX(PROFILE_H265_SCALABLE_MAIN, 7, "ScalableMain") \
|
||||
XX(PROFILE_H265_3DMAIN, 8, "3dMain") \
|
||||
XX(PROFILE_H265_SCREEN, 9, "ScreenContentCoding") \
|
||||
XX(PROFILE_H265_SCALABLE_RANGE_EXTENSIONS, 10, "ScalableRangeExtensions") \
|
||||
XX(PROFILE_H265_HIGH_SCREEN, 11, "HighThroughputScreenContentCoding")
|
||||
|
||||
typedef enum {
|
||||
H265ProfileIdcInvalid = -1,
|
||||
#define XX(name, value, str) name = value,
|
||||
H265_PROFILE_IDC_MAP(XX)
|
||||
#undef XX
|
||||
H265ProfileIdcMax
|
||||
} H265ProfileIdc;
|
||||
|
||||
#define H265_PROFILE_LEVEL_MAP(XX) \
|
||||
XX(30) \
|
||||
XX(60) \
|
||||
XX(63) \
|
||||
XX(90) \
|
||||
XX(93) \
|
||||
XX(120) \
|
||||
XX(123) \
|
||||
XX(150) \
|
||||
XX(153) \
|
||||
XX(156) \
|
||||
XX(180) \
|
||||
XX(183) \
|
||||
XX(186)
|
||||
|
||||
typedef enum {
|
||||
H265ProfileLevelInvalid = -1,
|
||||
#define XX(value) H265_PROFILE_LEVEL_##value = value,
|
||||
H265_PROFILE_LEVEL_MAP(XX)
|
||||
#undef XX
|
||||
H265ProfileLevelMax
|
||||
} H265ProfileLevel;
|
||||
|
||||
class H265RtpMap : public VideoRtpMap {
|
||||
public:
|
||||
H265RtpMap(uint8_t payload, uint32_t clock_rate, H265ProfileIdc profile_idc)
|
||||
: VideoRtpMap("H265", payload, clock_rate)
|
||||
, _profile_idc(profile_idc) {
|
||||
_fmtp.emplace("level-asymmetry-allowed", "1");
|
||||
_fmtp.emplace("packetization-mode", "1");
|
||||
|
||||
_fmtp.emplace("profile-id", std::to_string(_profile_idc));
|
||||
_fmtp.emplace("tier-flag", std::to_string(_tier_flag));
|
||||
_fmtp.emplace("level-id", std::to_string(_profile_level));
|
||||
}
|
||||
|
||||
private:
|
||||
H265ProfileIdc _profile_idc;
|
||||
int _tier_flag = 0; // 0: main tier; 1: high tier
|
||||
H265ProfileLevel _profile_level = H265_PROFILE_LEVEL_30;
|
||||
};
|
||||
|
||||
class VP9RtpMap : public VideoRtpMap {
|
||||
public:
|
||||
VP9RtpMap(uint8_t payload, uint32_t clock_rate, int profile_id)
|
||||
: VideoRtpMap("VP9", payload, clock_rate)
|
||||
, _profile_id(profile_id) {
|
||||
_fmtp.emplace("profile-id", std::to_string(_profile_id));
|
||||
};
|
||||
|
||||
private:
|
||||
int _profile_id = 1; // 0-3
|
||||
};
|
||||
|
||||
class AV1RtpMap : public VideoRtpMap {
|
||||
public:
|
||||
AV1RtpMap(uint8_t payload, uint32_t clock_rate, int profile_id)
|
||||
: VideoRtpMap("AV1", payload, clock_rate)
|
||||
, _profile_id(profile_id) {
|
||||
// a=fmtp:45 level-idx=5;profile=0;tier=0
|
||||
_fmtp.emplace("profile-id", std::to_string(_profile_id));
|
||||
};
|
||||
|
||||
private:
|
||||
int _profile_id = 0; // 0-2
|
||||
};
|
||||
} // namespace mediakit
|
||||
|
||||
#endif // ZLMEDIAKIT_RTPMAP_H
|
||||
Reference in New Issue
Block a user