Skip to content

Commit

Permalink
新增若干音视频编码类型的默认实现
Browse files Browse the repository at this point in the history
部分支持VP8/VP9/AV1/JPEG/MP3/H266/ADPCM/SVAC/G722/G723/G729
  • Loading branch information
xia-chu committed Nov 30, 2024
1 parent 87b42ab commit 892108d
Show file tree
Hide file tree
Showing 19 changed files with 202 additions and 266 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
- [谁在使用zlmediakit?](https://github.com/ZLMediaKit/ZLMediaKit/issues/511)
- 全面支持ipv6网络
- 支持多轨道模式(一个流中多个视频/音频)
- 全协议支持H264/H265/AAC/G711/OPUS,部分支持VP8/VP9/AV1/JPEG/MP3/H266/ADPCM/SVAC/G722/G723/G729

## 项目定位

Expand Down
4 changes: 0 additions & 4 deletions ext-codec/AAC.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -373,10 +373,6 @@ Track::Ptr AACTrack::clone() const {
}

Sdp::Ptr AACTrack::getSdp(uint8_t payload_type) const {
if (!ready()) {
WarnL << getCodecName() << " Track未准备好";
return nullptr;
}
return std::make_shared<AACSdp>(getExtraData()->toString(), payload_type, getAudioSampleRate(), getAudioChannel(), getBitRate() >> 10);
}

Expand Down
58 changes: 1 addition & 57 deletions ext-codec/G711.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,70 +19,14 @@ using namespace toolkit;

namespace mediakit {

/**
* G711类型SDP
* G711 type SDP
* [AUTO-TRANSLATED:ea72d60a]
*/
class G711Sdp : public Sdp {
public:
/**
* G711采样率固定为8000
* @param codecId G711A G711U
* @param payload_type rtp payload type
* @param sample_rate 音频采样率
* @param channels 通道数
* @param bitrate 比特率
* G711 sampling rate is fixed at 8000
* @param codecId G711A G711U
* @param payload_type rtp payload type
* @param sample_rate audio sampling rate
* @param channels number of channels
* @param bitrate bitrate
* [AUTO-TRANSLATED:5ea4b771]
*/
G711Sdp(CodecId codecId, int payload_type, int sample_rate, int channels, int bitrate)
: Sdp(sample_rate, payload_type) {
_printer << "m=audio 0 RTP/AVP " << payload_type << "\r\n";
if (bitrate) {
_printer << "b=AS:" << bitrate << "\r\n";
}
_printer << "a=rtpmap:" << payload_type << " " << getCodecName(codecId) << "/" << sample_rate << "/" << channels << "\r\n";
}

string getSdp() const override {
return _printer;
}

private:
_StrPrinter _printer;
};

Track::Ptr G711Track::clone() const {
return std::make_shared<G711Track>(*this);
}

Sdp::Ptr G711Track::getSdp(uint8_t payload_type) const {
if (!ready()) {
WarnL << getCodecName() << " Track未准备好";
return nullptr;
}

const auto codec = getCodecId();
const auto sample_rate = getAudioSampleRate();
const auto audio_channel = getAudioChannel();
const auto bitrate = getBitRate() >> 10;
if (sample_rate == 8000 && audio_channel == 1) {
// https://datatracker.ietf.org/doc/html/rfc3551#section-6
payload_type = (codec == CodecG711U) ? Rtsp::PT_PCMU : Rtsp::PT_PCMA;
}

return std::make_shared<G711Sdp>(codec, payload_type, sample_rate, audio_channel, bitrate);
return std::make_shared<DefaultSdp>(payload_type, *this);
}


namespace {

CodecId getCodecA() {
Expand Down
4 changes: 0 additions & 4 deletions ext-codec/H264.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -357,10 +357,6 @@ class H264Sdp : public Sdp {
};

Sdp::Ptr H264Track::getSdp(uint8_t payload_type) const {
if (!ready()) {
WarnL << getCodecName() << " Track未准备好";
return nullptr;
}
return std::make_shared<H264Sdp>(_sps, _pps, payload_type, getBitRate() >> 10);
}

Expand Down
4 changes: 0 additions & 4 deletions ext-codec/H265.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -263,10 +263,6 @@ class H265Sdp : public Sdp {
};

Sdp::Ptr H265Track::getSdp(uint8_t payload_type) const {
if (!ready()) {
WarnL << getCodecName() << " Track未准备好";
return nullptr;
}
return std::make_shared<H265Sdp>(_vps, _sps, _pps, payload_type, getBitRate() >> 10);
}

Expand Down
20 changes: 2 additions & 18 deletions ext-codec/JPEG.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,26 +31,10 @@ void JPEGTrack::getVideoResolution(const uint8_t *buf, int len) {
}
}

class JPEGSdp : public Sdp {
public:
JPEGSdp(int bitrate) : Sdp(90000, Rtsp::PT_JPEG) {
_printer << "m=video 0 RTP/AVP " << (int)getPayloadType() << "\r\n";
if (bitrate) {
_printer << "b=AS:" << bitrate << "\r\n";
}
}

std::string getSdp() const { return _printer; }

private:
_StrPrinter _printer;
};

Sdp::Ptr JPEGTrack::getSdp(uint8_t) const {
return std::make_shared<JPEGSdp>(getBitRate() >> 10);
Sdp::Ptr JPEGTrack::getSdp(uint8_t pt) const {
return std::make_shared<DefaultSdp>(pt, *this);
}


namespace {

CodecId getCodec() {
Expand Down
44 changes: 1 addition & 43 deletions ext-codec/L16.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,50 +18,8 @@ using namespace toolkit;

namespace mediakit {

/**
* L16类型SDP
* L16 type SDP
* [AUTO-TRANSLATED:11b1196d]
*/
class L16Sdp : public Sdp {
public:
/**
* L16采样位数固定为16位
* @param payload_type rtp payload type
* @param channels 通道数
* @param sample_rate 音频采样率
* @param bitrate 比特率
* L16 sampling bit width is fixed to 16 bits
* @param payload_type rtp payload type
* @param channels number of channels
* @param sample_rate audio sampling rate
* @param bitrate bitrate
* [AUTO-TRANSLATED:7a08a400]
*/
L16Sdp(int payload_type, int sample_rate, int channels, int bitrate) : Sdp(sample_rate, payload_type) {
_printer << "m=audio 0 RTP/AVP " << payload_type << "\r\n";
if (bitrate) {
_printer << "b=AS:" << bitrate << "\r\n";
}
_printer << "a=rtpmap:" << payload_type << " " << getCodecName(CodecL16) << "/" << sample_rate << "/" << channels << "\r\n";
}

string getSdp() const override { return _printer; }

private:
_StrPrinter _printer;
};

Sdp::Ptr L16Track::getSdp(uint8_t payload_type) const {
WarnL << "Enter L16Track::getSdp function";
if (!ready()) {
WarnL << getCodecName() << " Track未准备好";
return nullptr;
}
return std::make_shared<L16Sdp>(payload_type, getAudioSampleRate(), getAudioChannel(), getBitRate() >> 10);
return std::make_shared<DefaultSdp>(payload_type, *this);
}

Track::Ptr L16Track::clone() const {
Expand Down
44 changes: 1 addition & 43 deletions ext-codec/Opus.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,51 +18,9 @@ using namespace toolkit;

namespace mediakit {

/**
* Opus类型SDP
* Opus type SDP
* [AUTO-TRANSLATED:6c0a72ed]
*/
class OpusSdp : public Sdp {
public:
/**
* 构造opus sdp
* @param payload_type rtp payload type
* @param sample_rate 音频采样率
* @param channels 通道数
* @param bitrate 比特率
* Construct opus sdp
* @param payload_type rtp payload type
* @param sample_rate audio sample rate
* @param channels number of channels
* @param bitrate bitrate
* [AUTO-TRANSLATED:40713e9d]
*/
OpusSdp(int payload_type, int sample_rate, int channels, int bitrate) : Sdp(sample_rate, payload_type) {
_printer << "m=audio 0 RTP/AVP " << payload_type << "\r\n";
if (bitrate) {
_printer << "b=AS:" << bitrate << "\r\n";
}
_printer << "a=rtpmap:" << payload_type << " " << getCodecName(CodecOpus) << "/" << sample_rate << "/" << channels << "\r\n";
}

string getSdp() const override {
return _printer;
}

private:
_StrPrinter _printer;
};

Sdp::Ptr OpusTrack::getSdp(uint8_t payload_type) const {
if (!ready()) {
WarnL << getCodecName() << " Track未准备好";
return nullptr;
}
return std::make_shared<OpusSdp>(payload_type, getAudioSampleRate(), getAudioChannel(), getBitRate() >> 10);
return std::make_shared<DefaultSdp>(payload_type, *this);
}

namespace {
Expand Down
Loading

0 comments on commit 892108d

Please sign in to comment.