优化ertmp对opus的支持

This commit is contained in:
xia-chu
2025-10-16 19:40:49 +08:00
parent b003eb3eec
commit 8b6aa37b87
5 changed files with 34 additions and 30 deletions

View File

@@ -25,7 +25,7 @@ void OpusRtmpDecoder::inputRtmp(const RtmpPacket::Ptr &pkt) {
auto codec = (RtmpAudioCodec)(flags >> 4);
auto type = flags & 0x0F;
data++; size--;
if (codec == RtmpAudioCodec::FOURCC) {
if (codec == RtmpAudioCodec::ex_header) {
// @todo parse enhance audio header and check fourcc
data += 4;
size -= 4;
@@ -51,9 +51,10 @@ OpusRtmpEncoder::OpusRtmpEncoder(const Track::Ptr &track) : RtmpCodec(track) {
bool OpusRtmpEncoder::inputFrame(const Frame::Ptr &frame) {
auto packet = RtmpPacket::create();
if (_enhanced) {
uint8_t flags = ((uint8_t)RtmpAudioCodec::FOURCC << 4) | (uint8_t)RtmpPacketType::PacketTypeCodedFrames;
uint8_t flags = ((uint8_t)RtmpAudioCodec::ex_header << 4) | (uint8_t)RtmpPacketType::PacketTypeCodedFrames;
packet->buffer.push_back(flags);
packet->buffer.append("Opus", 4);
uint32_t fourcc = static_cast<uint32_t>(RtmpAudioCodec::fourcc_opus);
packet->buffer.append(reinterpret_cast<char *>(&fourcc), 4);
} else {
uint8_t flags = getAudioRtmpFlags(getTrack());
packet->buffer.push_back(flags);
@@ -75,9 +76,10 @@ void OpusRtmpEncoder::makeConfigPacket() {
return;
auto pkt = RtmpPacket::create();
if (_enhanced) {
uint8_t flags = ((uint8_t)RtmpAudioCodec::FOURCC << 4) | (uint8_t)RtmpPacketType::PacketTypeSequenceStart;
uint8_t flags = ((uint8_t)RtmpAudioCodec::ex_header << 4) | (uint8_t)RtmpPacketType::PacketTypeSequenceStart;
pkt->buffer.push_back(flags);
pkt->buffer.append("Opus", 4);
uint32_t fourcc = static_cast<uint32_t>(RtmpAudioCodec::fourcc_opus);
pkt->buffer.append(reinterpret_cast<char *>(&fourcc), 4);
} else {
uint8_t flags = getAudioRtmpFlags(getTrack());
pkt->buffer.push_back(flags);

View File

@@ -160,7 +160,8 @@ static CodecId getAudioCodecIdByAmf(const AMFValue &val) {
case RtmpAudioCodec::adpcm: return CodecADPCM;
case RtmpAudioCodec::g711a: return CodecG711A;
case RtmpAudioCodec::g711u: return CodecG711U;
case RtmpAudioCodec::opus: return CodecOpus;
case RtmpAudioCodec::opus:
case RtmpAudioCodec::fourcc_opus: return CodecOpus;
default: WarnL << "Unsupported codec: " << (int)type_id; return CodecInvalid;
}
}
@@ -202,7 +203,7 @@ AMFValue Factory::getAmfByCodecId(CodecId codecId) {
case CodecH265: return enhanced ? AMFValue((int)RtmpVideoCodec::fourcc_hevc) : AMFValue((int)RtmpVideoCodec::h265);
case CodecG711A: return AMFValue((int)RtmpAudioCodec::g711a);
case CodecG711U: return AMFValue((int)RtmpAudioCodec::g711u);
case CodecOpus: return AMFValue((int)RtmpAudioCodec::opus);
case CodecOpus: return enhanced ? AMFValue((int)RtmpAudioCodec::fourcc_opus) : AMFValue((int)RtmpAudioCodec::opus);
case CodecADPCM: return AMFValue((int)RtmpAudioCodec::adpcm);
case CodecMP3: return AMFValue((int)RtmpAudioCodec::mp3);
case CodecAV1: return enhanced ? AMFValue((int)RtmpVideoCodec::fourcc_av1) : AMFValue((int)RtmpVideoCodec::av1);

View File

@@ -306,9 +306,9 @@ enum class RtmpVideoCodec : uint32_t {
screen_video2 = 6, // Screen video version 2
h264 = 7, // avc
h265 = 12, // 国内扩展
av1 = 13,
vp8 = 14,
vp9 = 15,
av1 = 13, // 国内扩展
vp8 = 14, // 国内扩展
vp9 = 15, // 国内扩展
// 增强型rtmp FourCC [AUTO-TRANSLATED:442b77fb]
// Enhanced rtmp FourCC
fourcc_vp8 = MKBETAG('v', 'p', '0', '8'),
@@ -358,7 +358,7 @@ enum class RtmpPacketType : uint8_t {
//https://rtmp.veriskope.com/pdf/video_file_format_spec_v10_1.pdf
// UB [4]; Format of SoundData
enum class RtmpAudioCodec : uint8_t {
enum class RtmpAudioCodec : uint32_t {
/**
0 = Linear PCM, platform endian
1 = ADPCM
@@ -379,9 +379,10 @@ enum class RtmpAudioCodec : uint8_t {
mp3 = 2,
g711a = 7,
g711u = 8,
FOURCC = 9, // Enhanced audio
ex_header = 9, // Enhanced audio; new, used to signal FOURCC mode
aac = 10,
opus = 13 // 国内扩展
opus = 13, // 国内扩展
fourcc_opus = MKBETAG('O', 'p', 'u', 's')
};
// UI8;