@@ -40,16 +40,21 @@ TsMuxer::~TsMuxer() {
4040}
4141
4242void TsMuxer::addTrack (const Track::Ptr &track) {
43- switch (track->getCodecId ()){
43+ switch (track->getCodecId ()) {
4444 case CodecH264: {
45+ _have_video = true ;
4546 _codec_to_trackid[track->getCodecId ()].track_id = mpeg_ts_add_stream (_context, PSI_STREAM_H264, nullptr , 0 );
46- } break ;
47+ }
48+ break ;
4749 case CodecH265: {
50+ _have_video = true ;
4851 _codec_to_trackid[track->getCodecId ()].track_id = mpeg_ts_add_stream (_context, PSI_STREAM_H265, nullptr , 0 );
49- }break ;
52+ }
53+ break ;
5054 case CodecAAC: {
5155 _codec_to_trackid[track->getCodecId ()].track_id = mpeg_ts_add_stream (_context, PSI_STREAM_AAC, nullptr , 0 );
52- }break ;
56+ }
57+ break ;
5358 default :
5459 break ;
5560 }
@@ -63,7 +68,7 @@ void TsMuxer::inputFrame(const Frame::Ptr &frame) {
6368 // mp4文件时间戳需要从0开始
6469 auto &track_info = it->second ;
6570 int64_t dts_out, pts_out;
66-
71+ _is_idr_fast_packet = !_have_video;
6772 switch (frame->getCodecId ()){
6873 case CodecH265:
6974 case CodecH264: {
@@ -80,6 +85,9 @@ void TsMuxer::inputFrame(const Frame::Ptr &frame) {
8085 merged.append (" \x00\x00\x00\x01 " ,4 );
8186 merged.append (frame->data (),frame->size ());
8287 }
88+ if (frame->keyFrame ()){
89+ _is_idr_fast_packet = true ;
90+ }
8391 });
8492 merged_frame = std::make_shared<BufferString>(std::move (merged));
8593 }
@@ -101,6 +109,7 @@ void TsMuxer::inputFrame(const Frame::Ptr &frame) {
101109}
102110
103111void TsMuxer::resetTracks () {
112+ _have_video = false ;
104113 // 通知片段中断
105114 onTs (nullptr , 0 , 0 , 0 );
106115 uninit ();
@@ -119,7 +128,8 @@ void TsMuxer::init() {
119128 },
120129 [](void * param, const void * packet, size_t bytes){
121130 TsMuxer *muxer = (TsMuxer *)param;
122- muxer->onTs (packet, bytes,muxer->_timestamp ,0 );
131+ muxer->onTs (packet, bytes,muxer->_timestamp ,muxer->_is_idr_fast_packet );
132+ muxer->_is_idr_fast_packet = false ;
123133 }
124134 };
125135 if (_context == nullptr ){
0 commit comments