for frame merge must has vlc(video codec layer) data and flush rtmp a frame must has vcl

This commit is contained in:
xiongguangjie
2021-06-19 01:27:13 +08:00
parent 2335043cdf
commit a28aeb2148
4 changed files with 49 additions and 4 deletions

View File

@@ -267,11 +267,44 @@ bool FrameMerger::shouldDrop(const Frame::Ptr &frame) const{
}
return false;
}
bool FrameMerger::frameCacheHasVCL(List<Frame::Ptr> &frameCached) const{
bool hasVCL = false;
bool isH264OrH265 = false;
frameCached.for_each([&hasVCL,&isH264OrH265](const Frame::Ptr &frame){
switch (frame->getCodecId()) {
case CodecH264:{
auto type = H264_TYPE(frame->data()[frame->prefixSize()]);
if(type >=H264Frame::NAL_B_P && type <= H264Frame::NAL_IDR){
//有编码数据
hasVCL=true;
}
isH264OrH265 = true;
break;
}
case CodecH265: {
//如果是新的一帧,前面的缓存需要输出
auto type = H265_TYPE(frame->data()[frame->prefixSize()]);
if(type>=H265Frame::NAL_TRAIL_R &&type<= H265Frame::NAL_RSV_IRAP_VCL23){
//有编码数据
hasVCL=true;
}
isH264OrH265 = true;
break;
}
default: break;
}
});
if(isH264OrH265){
return hasVCL;
}
return true;
}
void FrameMerger::inputFrame(const Frame::Ptr &frame, const onOutput &cb) {
if(shouldDrop(frame)){
return;
}
if (willFlush(frame)) {
if (willFlush(frame) && frameCacheHasVCL(_frameCached)) {
Frame::Ptr back = _frameCached.back();
Buffer::Ptr merged_frame = back;
bool have_idr = back->keyFrame();