mirror of
https://github.com/ZLMediaKit/ZLMediaKit.git
synced 2024-10-30 16:27:36 +08:00
完成对enhanced rtmp videocodecid的兼容 (#2718)
请查阅: https://github.com/veovera/enhanced-rtmp/issues/8
This commit is contained in:
parent
bd8ad2eabf
commit
5a2bf8d196
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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 {
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user