Commit a9539eb6 by xiongziliang

HLS遇到I帧才切片:#226

parent 224a35db
...@@ -75,14 +75,16 @@ void HlsMaker::makeIndexFile(bool eof) { ...@@ -75,14 +75,16 @@ void HlsMaker::makeIndexFile(bool eof) {
} }
void HlsMaker::inputData(void *data, uint32_t len, uint32_t timestamp) { void HlsMaker::inputData(void *data, uint32_t len, uint32_t timestamp, bool is_idr_fast_packet) {
//分片数据中断结束
if (data && len) { if (data && len) {
addNewSegment(timestamp); if(is_idr_fast_packet){
addNewSegment(timestamp);
}
onWriteSegment((char *) data, len); onWriteSegment((char *) data, len);
//记录上次写入数据时间 //记录上次写入数据时间
_ticker_last_data.resetTime(); _ticker_last_data.resetTime();
} else { } else {
//resetTracks时触发此逻辑
flushLastSegment(true); flushLastSegment(true);
} }
} }
......
...@@ -52,8 +52,9 @@ public: ...@@ -52,8 +52,9 @@ public:
* @param data 数据 * @param data 数据
* @param len 数据长度 * @param len 数据长度
* @param timestamp 毫秒时间戳 * @param timestamp 毫秒时间戳
* @param is_idr_fast_packet 是否为关键帧第一个包
*/ */
void inputData(void *data, uint32_t len, uint32_t timestamp); void inputData(void *data, uint32_t len, uint32_t timestamp, bool is_idr_fast_packet);
protected: protected:
/** /**
* 创建ts切片文件回调 * 创建ts切片文件回调
......
...@@ -56,8 +56,8 @@ public: ...@@ -56,8 +56,8 @@ public:
} }
#if defined(ENABLE_HLS) #if defined(ENABLE_HLS)
protected: protected:
void onTs(const void *packet, int bytes,uint32_t timestamp,int flags) override { void onTs(const void *packet, int bytes,uint32_t timestamp,bool is_idr_fast_packet) override {
_hls->inputData((char *)packet,bytes,timestamp); _hls->inputData((char *)packet,bytes,timestamp, is_idr_fast_packet);
}; };
#endif #endif
private: private:
......
...@@ -40,16 +40,21 @@ TsMuxer::~TsMuxer() { ...@@ -40,16 +40,21 @@ TsMuxer::~TsMuxer() {
} }
void TsMuxer::addTrack(const Track::Ptr &track) { void TsMuxer::addTrack(const Track::Ptr &track) {
switch (track->getCodecId()){ switch (track->getCodecId()) {
case CodecH264: { case CodecH264: {
_have_video = true;
_codec_to_trackid[track->getCodecId()].track_id = mpeg_ts_add_stream(_context, PSI_STREAM_H264, nullptr, 0); _codec_to_trackid[track->getCodecId()].track_id = mpeg_ts_add_stream(_context, PSI_STREAM_H264, nullptr, 0);
} break; }
break;
case CodecH265: { case CodecH265: {
_have_video = true;
_codec_to_trackid[track->getCodecId()].track_id = mpeg_ts_add_stream(_context, PSI_STREAM_H265, nullptr, 0); _codec_to_trackid[track->getCodecId()].track_id = mpeg_ts_add_stream(_context, PSI_STREAM_H265, nullptr, 0);
}break; }
break;
case CodecAAC: { case CodecAAC: {
_codec_to_trackid[track->getCodecId()].track_id = mpeg_ts_add_stream(_context, PSI_STREAM_AAC, nullptr, 0); _codec_to_trackid[track->getCodecId()].track_id = mpeg_ts_add_stream(_context, PSI_STREAM_AAC, nullptr, 0);
}break; }
break;
default: default:
break; break;
} }
...@@ -63,7 +68,7 @@ void TsMuxer::inputFrame(const Frame::Ptr &frame) { ...@@ -63,7 +68,7 @@ void TsMuxer::inputFrame(const Frame::Ptr &frame) {
//mp4文件时间戳需要从0开始 //mp4文件时间戳需要从0开始
auto &track_info = it->second; auto &track_info = it->second;
int64_t dts_out, pts_out; int64_t dts_out, pts_out;
_is_idr_fast_packet = !_have_video;
switch (frame->getCodecId()){ switch (frame->getCodecId()){
case CodecH265: case CodecH265:
case CodecH264: { case CodecH264: {
...@@ -80,6 +85,9 @@ void TsMuxer::inputFrame(const Frame::Ptr &frame) { ...@@ -80,6 +85,9 @@ void TsMuxer::inputFrame(const Frame::Ptr &frame) {
merged.append("\x00\x00\x00\x01",4); merged.append("\x00\x00\x00\x01",4);
merged.append(frame->data(),frame->size()); merged.append(frame->data(),frame->size());
} }
if(frame->keyFrame()){
_is_idr_fast_packet = true;
}
}); });
merged_frame = std::make_shared<BufferString>(std::move(merged)); merged_frame = std::make_shared<BufferString>(std::move(merged));
} }
...@@ -101,6 +109,7 @@ void TsMuxer::inputFrame(const Frame::Ptr &frame) { ...@@ -101,6 +109,7 @@ void TsMuxer::inputFrame(const Frame::Ptr &frame) {
} }
void TsMuxer::resetTracks() { void TsMuxer::resetTracks() {
_have_video = false;
//通知片段中断 //通知片段中断
onTs(nullptr, 0, 0, 0); onTs(nullptr, 0, 0, 0);
uninit(); uninit();
...@@ -119,7 +128,8 @@ void TsMuxer::init() { ...@@ -119,7 +128,8 @@ void TsMuxer::init() {
}, },
[](void* param, const void* packet, size_t bytes){ [](void* param, const void* packet, size_t bytes){
TsMuxer *muxer = (TsMuxer *)param; TsMuxer *muxer = (TsMuxer *)param;
muxer->onTs(packet, bytes,muxer->_timestamp,0); muxer->onTs(packet, bytes,muxer->_timestamp,muxer->_is_idr_fast_packet);
muxer->_is_idr_fast_packet = false;
} }
}; };
if(_context == nullptr){ if(_context == nullptr){
......
...@@ -46,7 +46,7 @@ public: ...@@ -46,7 +46,7 @@ public:
void resetTracks() override; void resetTracks() override;
void inputFrame(const Frame::Ptr &frame) override; void inputFrame(const Frame::Ptr &frame) override;
protected: protected:
virtual void onTs(const void *packet, int bytes,uint32_t timestamp,int flags) = 0; virtual void onTs(const void *packet, int bytes,uint32_t timestamp,bool is_idr_fast_packet) = 0;
private: private:
void init(); void init();
void uninit(); void uninit();
...@@ -61,6 +61,8 @@ private: ...@@ -61,6 +61,8 @@ private:
}; };
unordered_map<int,track_info> _codec_to_trackid; unordered_map<int,track_info> _codec_to_trackid;
List<Frame::Ptr> _frameCached; List<Frame::Ptr> _frameCached;
bool _is_idr_fast_packet = false;
bool _have_video = false;
}; };
}//namespace mediakit }//namespace mediakit
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论