修复某些H264视频流缺少sps pps帧的问题 (#4050 #4047 )

This commit is contained in:
xiongguangjie
2024-12-04 10:46:37 +08:00
committed by GitHub
parent 2bf85eb8ff
commit 824be6cbd5
2 changed files with 14 additions and 6 deletions

View File

@@ -267,31 +267,32 @@ bool H264Track::inputFrame_l(const Frame::Ptr &frame) {
switch (type) {
case H264Frame::NAL_SPS: {
_sps = string(frame->data() + frame->prefixSize(), frame->size() - frame->prefixSize());
_latest_is_config_frame = true;
_latest_is_sps = true;
ret = VideoTrack::inputFrame(frame);
break;
}
case H264Frame::NAL_PPS: {
_pps = string(frame->data() + frame->prefixSize(), frame->size() - frame->prefixSize());
_latest_is_config_frame = true;
_latest_is_pps = true;
ret = VideoTrack::inputFrame(frame);
break;
}
default:
// 避免识别不出关键帧 [AUTO-TRANSLATED:8eb84679]
// Avoid not being able to recognize keyframes
if (_latest_is_config_frame && !frame->dropAble()) {
if (latestIsConfigFrame() && !frame->dropAble()) {
if (!frame->keyFrame()) {
const_cast<Frame::Ptr &>(frame) = std::make_shared<FrameCacheAble>(frame, true);
}
}
// 判断是否是I帧, 并且如果是,那判断前面是否插入过config帧, 如果插入过就不插入了 [AUTO-TRANSLATED:40733cd8]
// Determine if it is an I frame, and if it is, determine if a config frame has been inserted before, and if it has been inserted, do not insert it
if (frame->keyFrame() && !_latest_is_config_frame) {
if (frame->keyFrame() && !latestIsConfigFrame()) {
insertConfigFrame(frame);
}
if(!frame->dropAble()){
_latest_is_config_frame = false;
_latest_is_pps = false;
_latest_is_sps = false;
}
ret = VideoTrack::inputFrame(frame);
break;
@@ -313,6 +314,10 @@ void H264Track::insertConfigFrame(const Frame::Ptr &frame) {
}
}
bool H264Track::latestIsConfigFrame(){
return _latest_is_sps && _latest_is_pps;
}
class H264Sdp : public Sdp {
public:
H264Sdp(const string &strSPS, const string &strPPS, int payload_type, int bitrate) : Sdp(90000, payload_type) {

View File

@@ -146,8 +146,11 @@ private:
bool inputFrame_l(const Frame::Ptr &frame);
void insertConfigFrame(const Frame::Ptr &frame);
bool latestIsConfigFrame();
private:
bool _latest_is_config_frame = false;
bool _latest_is_pps = false;
bool _latest_is_sps = false;
int _width = 0;
int _height = 0;
float _fps = 0;