mirror of
https://github.com/ZLMediaKit/ZLMediaKit.git
synced 2026-07-06 19:58:10 +08:00
完善ertmp相关代码 (#4505)
增加多种Codec支持,并修复一些bug: - opus 非标准实现,不输出config frame,与旧的实现保持一致 - 添加RTMP_CODEC_MAP宏,精简代码
This commit is contained in:
@@ -55,6 +55,33 @@ AudioMeta::AudioMeta(const AudioTrack::Ptr &audio) {
|
||||
_metadata.set("audiocodecid", Factory::getAmfByCodecId(audio->getCodecId()));
|
||||
}
|
||||
|
||||
uint8_t getCodecFlags(CodecId cid) {
|
||||
switch(cid) {
|
||||
#define XX(a, b, c) case a: return static_cast<uint8_t>(b);
|
||||
RTMP_CODEC_MAP(XX)
|
||||
#undef XX
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint32_t getCodecFourCC(CodecId cid) {
|
||||
switch(cid) {
|
||||
#define XX(a, b, c) case a: return static_cast<uint32_t>(c);
|
||||
RTMP_CODEC_MAP(XX)
|
||||
#undef XX
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
CodecId getFourccCodec(uint32_t id) {
|
||||
switch(id) {
|
||||
#define XX(a, b, c) case (uint32_t)c: return a;
|
||||
RTMP_CODEC_MAP(XX)
|
||||
#undef XX
|
||||
}
|
||||
return CodecInvalid;
|
||||
}
|
||||
|
||||
uint8_t getAudioRtmpFlags(const Track::Ptr &track) {
|
||||
track->update();
|
||||
switch (track->getTrackType()) {
|
||||
@@ -167,7 +194,13 @@ bool RtmpPacket::isVideoKeyFrame() const {
|
||||
bool RtmpPacket::isConfigFrame() const {
|
||||
switch (type_id) {
|
||||
case MSG_AUDIO: {
|
||||
return (RtmpAudioCodec)getRtmpCodecId() == RtmpAudioCodec::aac && (RtmpAACPacketType)buffer[1] == RtmpAACPacketType::aac_config_header;
|
||||
switch ((RtmpAudioCodec)getRtmpCodecId()) {
|
||||
case RtmpAudioCodec::aac:
|
||||
return (RtmpAACPacketType)buffer[1] == RtmpAACPacketType::aac_config_header;
|
||||
case RtmpAudioCodec::ex_header:
|
||||
return (RtmpPacketType)(buffer[0] & 0x0f) == RtmpPacketType::PacketTypeSequenceStart;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
case MSG_VIDEO: {
|
||||
if (!isVideoKeyFrame()) {
|
||||
|
||||
@@ -382,9 +382,27 @@ enum class RtmpAudioCodec : uint32_t {
|
||||
ex_header = 9, // Enhanced audio; new, used to signal FOURCC mode
|
||||
aac = 10,
|
||||
opus = 13, // 国内扩展
|
||||
fourcc_opus = MKBETAG('O', 'p', 'u', 's')
|
||||
fourcc_opus = MKBETAG('O', 'p', 'u', 's'),
|
||||
fourcc_mp3 = MKBETAG('.', 'm', 'p', '3'),
|
||||
fourcc_aac = MKBETAG('m', 'p', '4', 'a'),
|
||||
fourcc_ac3 = MKBETAG('a', 'c', '-', '3'),
|
||||
fourcc_flac = MKBETAG('f', 'L', 'a', 'C'),
|
||||
|
||||
};
|
||||
|
||||
#define RTMP_CODEC_MAP(XX) \
|
||||
XX(CodecH264, RtmpVideoCodec::h264, RtmpVideoCodec::fourcc_avc1) \
|
||||
XX(CodecH265, RtmpVideoCodec::h265, RtmpVideoCodec::fourcc_hevc) \
|
||||
XX(CodecVP8, RtmpVideoCodec::vp8, RtmpVideoCodec::fourcc_vp8) \
|
||||
XX(CodecVP9, RtmpVideoCodec::vp9, RtmpVideoCodec::fourcc_vp9) \
|
||||
XX(CodecAV1, RtmpVideoCodec::av1, RtmpVideoCodec::fourcc_av1) \
|
||||
XX(CodecAAC, RtmpAudioCodec::aac, RtmpAudioCodec::fourcc_aac) \
|
||||
XX(CodecMP3, RtmpAudioCodec::mp3, RtmpAudioCodec::fourcc_mp3) \
|
||||
XX(CodecOpus, RtmpAudioCodec::opus, RtmpAudioCodec::fourcc_opus)
|
||||
uint32_t getCodecFourCC(CodecId cid);
|
||||
CodecId getFourccCodec(uint32_t id);
|
||||
uint8_t getCodecFlags(CodecId cid);
|
||||
|
||||
// UI8;
|
||||
enum class RtmpAACPacketType : uint8_t {
|
||||
aac_config_header = 0, // AAC sequence header
|
||||
|
||||
Reference in New Issue
Block a user