From 8b6aa37b8767d208ddc18e8dfcf6a3468b66d64b Mon Sep 17 00:00:00 2001 From: xia-chu <771730766@qq.com> Date: Thu, 16 Oct 2025 19:40:49 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96ertmp=E5=AF=B9opus=E7=9A=84?= =?UTF-8?q?=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 3rdpart/ZLToolKit | 2 +- ext-codec/OpusRtmp.cpp | 12 +++++++----- ext-codec/VpxRtmp.cpp | 32 ++++++++++++++++---------------- src/Extension/Factory.cpp | 5 +++-- src/Rtmp/Rtmp.h | 13 +++++++------ 5 files changed, 34 insertions(+), 30 deletions(-) diff --git a/3rdpart/ZLToolKit b/3rdpart/ZLToolKit index 6e727443..94af13d4 160000 --- a/3rdpart/ZLToolKit +++ b/3rdpart/ZLToolKit @@ -1 +1 @@ -Subproject commit 6e727443e6ca41af91f0cc2736b7a3bea971fedf +Subproject commit 94af13d4d008f5e6465d2cbe2741229738322881 diff --git a/ext-codec/OpusRtmp.cpp b/ext-codec/OpusRtmp.cpp index 3551dab7..19e29be1 100644 --- a/ext-codec/OpusRtmp.cpp +++ b/ext-codec/OpusRtmp.cpp @@ -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(RtmpAudioCodec::fourcc_opus); + packet->buffer.append(reinterpret_cast(&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(RtmpAudioCodec::fourcc_opus); + pkt->buffer.append(reinterpret_cast(&fourcc), 4); } else { uint8_t flags = getAudioRtmpFlags(getTrack()); pkt->buffer.push_back(flags); diff --git a/ext-codec/VpxRtmp.cpp b/ext-codec/VpxRtmp.cpp index e17c1657..da96ad74 100644 --- a/ext-codec/VpxRtmp.cpp +++ b/ext-codec/VpxRtmp.cpp @@ -88,10 +88,10 @@ bool VpxRtmpEncoder::inputFrame(const Frame::Ptr &frame) { header->enhanced = 1; header->frame_type = frame->keyFrame() ? (int)RtmpFrameType::key_frame : (int)RtmpFrameType::inter_frame; switch (frame->getCodecId()) { - case CodecVP8: header->fourcc = htonl((uint32_t)RtmpVideoCodec::fourcc_vp8); break; - case CodecVP9: header->fourcc = htonl((uint32_t)RtmpVideoCodec::fourcc_vp9); break; - case CodecAV1: header->fourcc = htonl((uint32_t)RtmpVideoCodec::fourcc_av1); break; - default: break; + case CodecVP8: header->fourcc = htonl((uint32_t)RtmpVideoCodec::fourcc_vp8); break; + case CodecVP9: header->fourcc = htonl((uint32_t)RtmpVideoCodec::fourcc_vp9); break; + case CodecAV1: header->fourcc = htonl((uint32_t)RtmpVideoCodec::fourcc_av1); break; + default: break; } buff += RtmpPacketInfo::kEnhancedRtmpHeaderSize; if (cts) { @@ -105,10 +105,10 @@ bool VpxRtmpEncoder::inputFrame(const Frame::Ptr &frame) { // flags uint8_t flags = 0; switch (getTrack()->getCodecId()) { - case CodecVP8: flags = (uint8_t)RtmpVideoCodec::vp8; break; - case CodecVP9: flags = (uint8_t)RtmpVideoCodec::vp9; break; - case CodecAV1: flags = (uint8_t)RtmpVideoCodec::av1; break; - default: break; + case CodecVP8: flags = (uint8_t)RtmpVideoCodec::vp8; break; + case CodecVP9: flags = (uint8_t)RtmpVideoCodec::vp9; break; + case CodecAV1: flags = (uint8_t)RtmpVideoCodec::av1; break; + default: break; } flags |= (uint8_t)(frame->keyFrame() ? RtmpFrameType::key_frame : RtmpFrameType::inter_frame) << 4; @@ -145,18 +145,18 @@ void VpxRtmpEncoder::makeConfigPacket() { header->pkt_type = (int)RtmpPacketType::PacketTypeSequenceStart; header->frame_type = (int)RtmpFrameType::key_frame; switch (getTrack()->getCodecId()) { - case CodecVP8: header->fourcc = htonl((uint32_t)RtmpVideoCodec::fourcc_vp8); break; - case CodecVP9: header->fourcc = htonl((uint32_t)RtmpVideoCodec::fourcc_vp9); break; - case CodecAV1: header->fourcc = htonl((uint32_t)RtmpVideoCodec::fourcc_av1); break; - default: break; + case CodecVP8: header->fourcc = htonl((uint32_t)RtmpVideoCodec::fourcc_vp8); break; + case CodecVP9: header->fourcc = htonl((uint32_t)RtmpVideoCodec::fourcc_vp9); break; + case CodecAV1: header->fourcc = htonl((uint32_t)RtmpVideoCodec::fourcc_av1); break; + default: break; } } else { uint8_t flags = 0; switch (getTrack()->getCodecId()) { - case CodecVP8: flags = (uint8_t)RtmpVideoCodec::vp8; break; - case CodecVP9: flags = (uint8_t)RtmpVideoCodec::vp9; break; - case CodecAV1: flags = (uint8_t)RtmpVideoCodec::av1; break; - default: break; + case CodecVP8: flags = (uint8_t)RtmpVideoCodec::vp8; break; + case CodecVP9: flags = (uint8_t)RtmpVideoCodec::vp9; break; + case CodecAV1: flags = (uint8_t)RtmpVideoCodec::av1; break; + default: break; } flags |= ((uint8_t)RtmpFrameType::key_frame << 4); buff[0] = flags; diff --git a/src/Extension/Factory.cpp b/src/Extension/Factory.cpp index f5def0e0..4bec196b 100644 --- a/src/Extension/Factory.cpp +++ b/src/Extension/Factory.cpp @@ -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); diff --git a/src/Rtmp/Rtmp.h b/src/Rtmp/Rtmp.h index c5e8afac..13b39e85 100644 --- a/src/Rtmp/Rtmp.h +++ b/src/Rtmp/Rtmp.h @@ -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;