Skip to content

Commit a9539eb

Browse files
committed
HLS遇到I帧才切片:ZLMediaKit#226
1 parent 224a35d commit a9539eb

File tree

5 files changed

+28
-13
lines changed

5 files changed

+28
-13
lines changed

src/Record/HlsMaker.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,14 +75,16 @@ void HlsMaker::makeIndexFile(bool eof) {
7575
}
7676

7777

78-
void HlsMaker::inputData(void *data, uint32_t len, uint32_t timestamp) {
79-
//分片数据中断结束
78+
void HlsMaker::inputData(void *data, uint32_t len, uint32_t timestamp, bool is_idr_fast_packet) {
8079
if (data && len) {
81-
addNewSegment(timestamp);
80+
if(is_idr_fast_packet){
81+
addNewSegment(timestamp);
82+
}
8283
onWriteSegment((char *) data, len);
8384
//记录上次写入数据时间
8485
_ticker_last_data.resetTime();
8586
} else {
87+
//resetTracks时触发此逻辑
8688
flushLastSegment(true);
8789
}
8890
}

src/Record/HlsMaker.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,9 @@ class HlsMaker {
5252
* @param data 数据
5353
* @param len 数据长度
5454
* @param timestamp 毫秒时间戳
55+
* @param is_idr_fast_packet 是否为关键帧第一个包
5556
*/
56-
void inputData(void *data, uint32_t len, uint32_t timestamp);
57+
void inputData(void *data, uint32_t len, uint32_t timestamp, bool is_idr_fast_packet);
5758
protected:
5859
/**
5960
* 创建ts切片文件回调

src/Record/HlsRecorder.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,8 @@ class HlsRecorder
5656
}
5757
#if defined(ENABLE_HLS)
5858
protected:
59-
void onTs(const void *packet, int bytes,uint32_t timestamp,int flags) override {
60-
_hls->inputData((char *)packet,bytes,timestamp);
59+
void onTs(const void *packet, int bytes,uint32_t timestamp,bool is_idr_fast_packet) override {
60+
_hls->inputData((char *)packet,bytes,timestamp, is_idr_fast_packet);
6161
};
6262
#endif
6363
private:

src/Record/TsMuxer.cpp

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,16 +40,21 @@ TsMuxer::~TsMuxer() {
4040
}
4141

4242
void 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

103111
void 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){

src/Record/TsMuxer.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ class TsMuxer : public MediaSinkInterface {
4646
void resetTracks() override;
4747
void inputFrame(const Frame::Ptr &frame) override;
4848
protected:
49-
virtual void onTs(const void *packet, int bytes,uint32_t timestamp,int flags) = 0;
49+
virtual void onTs(const void *packet, int bytes,uint32_t timestamp,bool is_idr_fast_packet) = 0;
5050
private:
5151
void init();
5252
void uninit();
@@ -61,6 +61,8 @@ class TsMuxer : public MediaSinkInterface {
6161
};
6262
unordered_map<int,track_info> _codec_to_trackid;
6363
List<Frame::Ptr> _frameCached;
64+
bool _is_idr_fast_packet = false;
65+
bool _have_video = false;
6466
};
6567

6668
}//namespace mediakit

0 commit comments

Comments
 (0)