完成对enhanced rtmp videocodecid的兼容 (#2718)

请查阅: https://github.com/veovera/enhanced-rtmp/issues/8
This commit is contained in:
夏楚 2023-07-29 23:03:28 +08:00 committed by GitHub
parent bd8ad2eabf
commit 5a2bf8d196
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 17 additions and 29 deletions

View File

@ -204,7 +204,10 @@ static CodecId getVideoCodecIdByAmf(const AMFValue &val){
auto type_id = (RtmpVideoCodec)val.as_integer(); auto type_id = (RtmpVideoCodec)val.as_integer();
switch (type_id) { switch (type_id) {
case RtmpVideoCodec::h264: return CodecH264; case RtmpVideoCodec::h264: return CodecH264;
case RtmpVideoCodec::fourcc_hevc:
case RtmpVideoCodec::h265: return CodecH265; case RtmpVideoCodec::h265: return CodecH265;
case RtmpVideoCodec::fourcc_av1: return CodecAV1;
case RtmpVideoCodec::fourcc_vp9: return CodecVP9;
default: WarnL << "暂不支持该视频Amf:" << (int)type_id; return CodecInvalid; default: WarnL << "暂不支持该视频Amf:" << (int)type_id; return CodecInvalid;
} }
} }

View File

@ -301,10 +301,10 @@ CodecId parseVideoRtmpPacket(const uint8_t *data, size_t size, RtmpPacketInfo *i
info->video.frame_type = (RtmpFrameType)(enhanced_header->frame_type); info->video.frame_type = (RtmpFrameType)(enhanced_header->frame_type);
info->video.pkt_type = (RtmpPacketType)(enhanced_header->pkt_type); info->video.pkt_type = (RtmpPacketType)(enhanced_header->pkt_type);
switch (ntohl(enhanced_header->fourcc)) { switch ((RtmpVideoCodec)ntohl(enhanced_header->fourcc)) {
case fourcc_av1: info->codec = CodecAV1; break; case RtmpVideoCodec::fourcc_av1: info->codec = CodecAV1; break;
case fourcc_vp9: info->codec = CodecVP9; break; case RtmpVideoCodec::fourcc_vp9: info->codec = CodecVP9; break;
case fourcc_hevc: info->codec = CodecH265; break; case RtmpVideoCodec::fourcc_hevc: info->codec = CodecH265; break;
default: WarnL << "Rtmp video codec not supported: " << std::string((char *)data + 1, 4); default: WarnL << "Rtmp video codec not supported: " << std::string((char *)data + 1, 4);
} }
} else { } else {

View File

@ -264,7 +264,7 @@ enum class RtmpFrameType : uint8_t {
}; };
// UB [4]; Codec Identifier. // UB [4]; Codec Identifier.
enum class RtmpVideoCodec : uint8_t { enum class RtmpVideoCodec : uint32_t {
h263 = 2, // Sorenson H.263 h263 = 2, // Sorenson H.263
screen_video = 3, // Screen video screen_video = 3, // Screen video
vp6 = 4, // On2 VP6 vp6 = 4, // On2 VP6
@ -272,6 +272,11 @@ enum class RtmpVideoCodec : uint8_t {
screen_video2 = 6, // Screen video version 2 screen_video2 = 6, // Screen video version 2
h264 = 7, // avc h264 = 7, // avc
h265 = 12, // 国内扩展 h265 = 12, // 国内扩展
// 增强型rtmp FourCC
fourcc_vp9 = 'vp09',
fourcc_av1 = 'av01',
fourcc_hevc = 'hvc1'
}; };
// UI8; // UI8;
@ -357,12 +362,6 @@ struct RtmpPacketInfo {
}; };
}; };
// https://github.com/veovera/enhanced-rtmp // https://github.com/veovera/enhanced-rtmp
// 增强型rtmp FourCC
static constexpr uint32_t fourcc_vp9 = 'vp09';
static constexpr uint32_t fourcc_av1 = 'av01';
static constexpr uint32_t fourcc_hevc = 'hvc1';
CodecId parseVideoRtmpPacket(const uint8_t *data, size_t size, RtmpPacketInfo *info = nullptr); CodecId parseVideoRtmpPacket(const uint8_t *data, size_t size, RtmpPacketInfo *info = nullptr);
}//namespace mediakit }//namespace mediakit

View File

@ -75,19 +75,13 @@ bool RtmpDemuxer::loadMetaData(const AMFValue &val) {
} }
if (key == "videodatarate") { if (key == "videodatarate") {
videodatarate = val.as_integer(); videodatarate = val.as_integer();
_videodatarate = videodatarate * 1024;
return; return;
} }
}); });
if (videocodecid) { if (videocodecid) {
// 有视频 // 有视频
ret = true; ret = true;
if (videocodecid->type() == AMF_NUMBER && videocodecid->as_integer() == (int)RtmpVideoCodec::h264) { makeVideoTrack(*videocodecid, videodatarate * 1024);
// https://github.com/veovera/enhanced-rtmp/issues/8
_complete_delay = true;
} else {
makeVideoTrack(*videocodecid, videodatarate * 1024);
}
} }
if (audiocodecid) { if (audiocodecid) {
// 有音频 // 有音频
@ -98,7 +92,7 @@ bool RtmpDemuxer::loadMetaData(const AMFValue &val) {
WarnL << ex.what(); WarnL << ex.what();
} }
if (ret && !_complete_delay) { if (ret) {
// metadata中存在track相关的描述那么我们根据metadata判断有多少个track // metadata中存在track相关的描述那么我们根据metadata判断有多少个track
addTrackCompleted(); addTrackCompleted();
} }
@ -114,14 +108,8 @@ void RtmpDemuxer::inputRtmp(const RtmpPacket::Ptr &pkt) {
case MSG_VIDEO: { case MSG_VIDEO: {
if (!_try_get_video_track) { if (!_try_get_video_track) {
_try_get_video_track = true; _try_get_video_track = true;
RtmpPacketInfo info; auto codec_id = parseVideoRtmpPacket((uint8_t *)pkt->data(), pkt->size());
auto codec_id = parseVideoRtmpPacket((uint8_t *)pkt->data(), pkt->size(), &info); makeVideoTrack(Factory::getTrackByCodecId(codec_id), 0);
if (codec_id != CodecInvalid) {
makeVideoTrack(Factory::getTrackByCodecId(codec_id), _videodatarate);
if (_complete_delay) {
addTrackCompleted();
}
}
} }
if (_video_rtmp_decoder) { if (_video_rtmp_decoder) {
_video_rtmp_decoder->inputRtmp(pkt); _video_rtmp_decoder->inputRtmp(pkt);

View File

@ -51,9 +51,7 @@ private:
private: private:
bool _try_get_video_track = false; bool _try_get_video_track = false;
bool _try_get_audio_track = false; bool _try_get_audio_track = false;
bool _complete_delay = false;
float _duration = 0; float _duration = 0;
int _videodatarate = 0;
AudioTrack::Ptr _audio_track; AudioTrack::Ptr _audio_track;
VideoTrack::Ptr _video_track; VideoTrack::Ptr _video_track;
RtmpCodec::Ptr _audio_rtmp_decoder; RtmpCodec::Ptr _audio_rtmp_decoder;