各协议全面支持vp8/vp9/av1编码,ertmp新增支持opus编码 (#4498)

实现功能:
- rtp 增加vp8,vp9和av1编码支持
- 实现MP4录像所需的extra_data接口
- 扩展rtmp增加对opus、vp8、vp9和av1的支持

已知问题:
- 开启enhance rtmp后,ffmpeg暂时不支持播放vp8编码格式,其他格式的支持
- vp9和av1开始播放时容易遇到卡顿情况,过几秒后好了,原因暂时未知

---------

Co-authored-by: xia-chu <771730766@qq.com>
This commit is contained in:
mtdxc
2025-10-16 19:26:46 +08:00
committed by GitHub
parent 046bdecd1e
commit b003eb3eec
26 changed files with 1609 additions and 69 deletions

View File

@@ -13,18 +13,35 @@
#include "Extension/Factory.h"
#include "Extension/CommonRtp.h"
#include "Extension/CommonRtmp.h"
#include "riff-acm.h"
using namespace std;
using namespace toolkit;
namespace mediakit {
Track::Ptr G711Track::clone() const {
return std::make_shared<G711Track>(*this);
Buffer::Ptr G711Track::getExtraData() const {
struct wave_format_t wav = {0};
wav.wFormatTag = getCodecId() == CodecG711A ? WAVE_FORMAT_ALAW : WAVE_FORMAT_MULAW;
wav.nChannels = getAudioChannel();
wav.nSamplesPerSec = getAudioSampleRate();
wav.nAvgBytesPerSec = 8000;
wav.nBlockAlign = 1;
wav.wBitsPerSample = 8;
auto buff = BufferRaw::create(18 + wav.cbSize);
wave_format_save(&wav, (uint8_t*)buff->data(), buff->size());
return buff;
}
Sdp::Ptr G711Track::getSdp(uint8_t payload_type) const {
return std::make_shared<DefaultSdp>(payload_type, *this);
void G711Track::setExtraData(const uint8_t *data, size_t size) {
struct wave_format_t wav;
if (wave_format_load(data, size, &wav) > 0) {
// Successfully parsed Opus header
_sample_rate = wav.nSamplesPerSec;
_channels = wav.nChannels;
_codecid = (wav.wFormatTag == WAVE_FORMAT_ALAW) ? CodecG711A : CodecG711U;
} else {
WarnL << "Failed to parse G711 extra data";
}
}
namespace {