mpeg/ts打包支持多track
This commit is contained in:
parent
5b95cd1f5a
commit
92589f4cda
|
|
@ -71,7 +71,7 @@ private:
|
||||||
MP4FileDisk::Ptr _mp4_file;
|
MP4FileDisk::Ptr _mp4_file;
|
||||||
MP4FileDisk::Reader _mov_reader;
|
MP4FileDisk::Reader _mov_reader;
|
||||||
uint64_t _duration_ms = 0;
|
uint64_t _duration_ms = 0;
|
||||||
std::map<int, Track::Ptr> _track_to_codec;
|
std::unordered_map<int, Track::Ptr> _track_to_codec;
|
||||||
toolkit::ResourcePool<toolkit::BufferRaw> _buffer_pool;
|
toolkit::ResourcePool<toolkit::BufferRaw> _buffer_pool;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -40,27 +40,27 @@ bool MpegMuxer::addTrack(const Track::Ptr &track) {
|
||||||
if (track->getTrackType() == TrackVideo) {
|
if (track->getTrackType() == TrackVideo) {
|
||||||
_have_video = true;
|
_have_video = true;
|
||||||
}
|
}
|
||||||
_codec_to_trackid[track->getCodecId()] = mpeg_muxer_add_stream((::mpeg_muxer_t *)_context, mpeg_id, nullptr, 0);
|
_tracks[track->getIndex()].track_id = mpeg_muxer_add_stream((::mpeg_muxer_t *)_context, mpeg_id, nullptr, 0);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MpegMuxer::inputFrame(const Frame::Ptr &frame) {
|
bool MpegMuxer::inputFrame(const Frame::Ptr &frame) {
|
||||||
auto it = _codec_to_trackid.find(frame->getCodecId());
|
auto it = _tracks.find(frame->getIndex());
|
||||||
if (it == _codec_to_trackid.end()) {
|
if (it == _tracks.end()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
auto track_id = it->second;
|
auto &track = it->second;
|
||||||
_key_pos = !_have_video;
|
_key_pos = !_have_video;
|
||||||
switch (frame->getCodecId()) {
|
switch (frame->getCodecId()) {
|
||||||
case CodecH264:
|
case CodecH264:
|
||||||
case CodecH265: {
|
case CodecH265: {
|
||||||
// 这里的代码逻辑是让SPS、PPS、IDR这些时间戳相同的帧打包到一起当做一个帧处理,
|
// 这里的代码逻辑是让SPS、PPS、IDR这些时间戳相同的帧打包到一起当做一个帧处理,
|
||||||
return _frame_merger.inputFrame(frame,[this, track_id](uint64_t dts, uint64_t pts, const Buffer::Ptr &buffer, bool have_idr) {
|
return track.merger.inputFrame(frame, [&](uint64_t dts, uint64_t pts, const Buffer::Ptr &buffer, bool have_idr) {
|
||||||
_key_pos = have_idr;
|
_key_pos = have_idr;
|
||||||
// 取视频时间戳为TS的时间戳
|
// 取视频时间戳为TS的时间戳
|
||||||
_timestamp = dts;
|
_timestamp = dts;
|
||||||
_max_cache_size = 512 + 1.2 * buffer->size();
|
_max_cache_size = 512 + 1.2 * buffer->size();
|
||||||
mpeg_muxer_input((::mpeg_muxer_t *)_context, track_id, have_idr ? 0x0001 : 0, pts * 90LL,dts * 90LL, buffer->data(), buffer->size());
|
mpeg_muxer_input((::mpeg_muxer_t *)_context, track.track_id, have_idr ? 0x0001 : 0, pts * 90LL, dts * 90LL, buffer->data(), buffer->size());
|
||||||
flushCache();
|
flushCache();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
@ -80,7 +80,7 @@ bool MpegMuxer::inputFrame(const Frame::Ptr &frame) {
|
||||||
_timestamp = frame->dts();
|
_timestamp = frame->dts();
|
||||||
}
|
}
|
||||||
_max_cache_size = 512 + 1.2 * frame->size();
|
_max_cache_size = 512 + 1.2 * frame->size();
|
||||||
mpeg_muxer_input((::mpeg_muxer_t *)_context, track_id, frame->keyFrame() ? 0x0001 : 0, frame->pts() * 90LL, frame->dts() * 90LL, frame->data(), frame->size());
|
mpeg_muxer_input((::mpeg_muxer_t *)_context, track.track_id, frame->keyFrame() ? 0x0001 : 0, frame->pts() * 90LL, frame->dts() * 90LL, frame->data(), frame->size());
|
||||||
flushCache();
|
flushCache();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
@ -103,7 +103,6 @@ void MpegMuxer::createContext() {
|
||||||
if (!thiz->_current_buffer
|
if (!thiz->_current_buffer
|
||||||
|| thiz->_current_buffer->size() + bytes > thiz->_current_buffer->getCapacity()) {
|
|| thiz->_current_buffer->size() + bytes > thiz->_current_buffer->getCapacity()) {
|
||||||
if (thiz->_current_buffer) {
|
if (thiz->_current_buffer) {
|
||||||
//WarnL << "need realloc mpeg buffer" << thiz->_current_buffer->size() + bytes << " > " << thiz->_current_buffer->getCapacity();
|
|
||||||
thiz->flushCache();
|
thiz->flushCache();
|
||||||
}
|
}
|
||||||
thiz->_current_buffer = thiz->_buffer_pool.obtain2();
|
thiz->_current_buffer = thiz->_buffer_pool.obtain2();
|
||||||
|
|
@ -143,12 +142,13 @@ void MpegMuxer::releaseContext() {
|
||||||
mpeg_muxer_destroy((::mpeg_muxer_t *)_context);
|
mpeg_muxer_destroy((::mpeg_muxer_t *)_context);
|
||||||
_context = nullptr;
|
_context = nullptr;
|
||||||
}
|
}
|
||||||
_codec_to_trackid.clear();
|
_tracks.clear();
|
||||||
_frame_merger.clear();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MpegMuxer::flush() {
|
void MpegMuxer::flush() {
|
||||||
_frame_merger.flush();
|
for (auto &pr : _tracks) {
|
||||||
|
pr.second.merger.flush();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}//mediakit
|
}//mediakit
|
||||||
|
|
|
||||||
|
|
@ -70,8 +70,17 @@ private:
|
||||||
uint32_t _max_cache_size = 0;
|
uint32_t _max_cache_size = 0;
|
||||||
uint64_t _timestamp = 0;
|
uint64_t _timestamp = 0;
|
||||||
struct mpeg_muxer_t *_context = nullptr;
|
struct mpeg_muxer_t *_context = nullptr;
|
||||||
std::unordered_map<int, int/*track_id*/> _codec_to_trackid;
|
|
||||||
FrameMerger _frame_merger{FrameMerger::h264_prefix};
|
class FrameMergerImp : public FrameMerger {
|
||||||
|
public:
|
||||||
|
FrameMergerImp() : FrameMerger(FrameMerger::h264_prefix) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct MP4Track {
|
||||||
|
int track_id = -1;
|
||||||
|
FrameMergerImp merger;
|
||||||
|
};
|
||||||
|
std::unordered_map<int, MP4Track> _tracks;
|
||||||
toolkit::BufferRaw::Ptr _current_buffer;
|
toolkit::BufferRaw::Ptr _current_buffer;
|
||||||
toolkit::ResourcePool<toolkit::BufferRaw> _buffer_pool;
|
toolkit::ResourcePool<toolkit::BufferRaw> _buffer_pool;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,6 @@
|
||||||
#ifndef ZLMEDIAKIT_DECODER_H
|
#ifndef ZLMEDIAKIT_DECODER_H
|
||||||
#define ZLMEDIAKIT_DECODER_H
|
#define ZLMEDIAKIT_DECODER_H
|
||||||
|
|
||||||
#include <map>
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <functional>
|
#include <functional>
|
||||||
|
|
@ -65,7 +64,7 @@ private:
|
||||||
public:
|
public:
|
||||||
FrameMergerImp() : FrameMerger(FrameMerger::none) {}
|
FrameMergerImp() : FrameMerger(FrameMerger::none) {}
|
||||||
};
|
};
|
||||||
std::map<int, std::pair<Track::Ptr, FrameMergerImp> > _tracks;
|
std::unordered_map<int, std::pair<Track::Ptr, FrameMergerImp> > _tracks;
|
||||||
};
|
};
|
||||||
|
|
||||||
}//namespace mediakit
|
}//namespace mediakit
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue