mirror of
https://github.com/ZLMediaKit/ZLMediaKit.git
synced 2024-11-26 04:31:37 +08:00
精确mp4录制时长:#1795
This commit is contained in:
parent
bbdcc44eb0
commit
80eef693c6
@ -61,6 +61,16 @@ bool MP4MuxerInterface::haveVideo() const {
|
|||||||
return _have_video;
|
return _have_video;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint64_t MP4MuxerInterface::getDuration() const {
|
||||||
|
uint64_t ret = 0;
|
||||||
|
for (auto &pr : _codec_to_trackid) {
|
||||||
|
if (pr.second.stamp.getRelativeStamp() > ret) {
|
||||||
|
ret = pr.second.stamp.getRelativeStamp();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
void MP4MuxerInterface::resetTracks() {
|
void MP4MuxerInterface::resetTracks() {
|
||||||
_started = false;
|
_started = false;
|
||||||
_have_video = false;
|
_have_video = false;
|
||||||
|
@ -58,6 +58,11 @@ public:
|
|||||||
*/
|
*/
|
||||||
void initSegment();
|
void initSegment();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取mp4时长,单位毫秒
|
||||||
|
*/
|
||||||
|
uint64_t getDuration() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual MP4FileIO::Writer createWriter() = 0;
|
virtual MP4FileIO::Writer createWriter() = 0;
|
||||||
|
|
||||||
@ -73,7 +78,7 @@ private:
|
|||||||
Stamp stamp;
|
Stamp stamp;
|
||||||
};
|
};
|
||||||
std::unordered_map<int, track_info> _codec_to_trackid;
|
std::unordered_map<int, track_info> _codec_to_trackid;
|
||||||
FrameMerger _frame_merger{FrameMerger::mp4_nal_size};
|
FrameMerger _frame_merger { FrameMerger::mp4_nal_size };
|
||||||
};
|
};
|
||||||
|
|
||||||
class MP4Muxer : public MP4MuxerInterface{
|
class MP4Muxer : public MP4MuxerInterface{
|
||||||
|
@ -70,24 +70,21 @@ void MP4Recorder::asyncClose() {
|
|||||||
auto full_path = _full_path;
|
auto full_path = _full_path;
|
||||||
auto info = _info;
|
auto info = _info;
|
||||||
WorkThreadPool::Instance().getExecutor()->async([muxer, full_path_tmp, full_path, info]() mutable {
|
WorkThreadPool::Instance().getExecutor()->async([muxer, full_path_tmp, full_path, info]() mutable {
|
||||||
//获取文件录制时间,放在关闭mp4之前是为了忽略关闭mp4执行时间
|
info.time_len = muxer->getDuration() / 1000.0f;
|
||||||
info.time_len = (float) (::time(NULL) - info.start_time);
|
// 关闭mp4可能非常耗时,所以要放在后台线程执行
|
||||||
//关闭mp4非常耗时,所以要放在后台线程执行
|
|
||||||
muxer->closeMP4();
|
muxer->closeMP4();
|
||||||
|
if (!full_path_tmp.empty()) {
|
||||||
if(!full_path_tmp.empty()) {
|
// 获取文件大小
|
||||||
//获取文件大小
|
|
||||||
info.file_size = File::fileSize(full_path_tmp.data());
|
info.file_size = File::fileSize(full_path_tmp.data());
|
||||||
if (info.file_size < 1024) {
|
if (info.file_size < 1024) {
|
||||||
//录像文件太小,删除之
|
// 录像文件太小,删除之
|
||||||
File::delete_file(full_path_tmp.data());
|
File::delete_file(full_path_tmp.data());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
//临时文件名改成正式文件名,防止mp4未完成时被访问
|
// 临时文件名改成正式文件名,防止mp4未完成时被访问
|
||||||
rename(full_path_tmp.data(), full_path.data());
|
rename(full_path_tmp.data(), full_path.data());
|
||||||
}
|
}
|
||||||
|
//触发mp4录制切片生成事件
|
||||||
/////record 业务逻辑//////
|
|
||||||
NoticeCenter::Instance().emitEvent(Broadcast::kBroadcastRecordMP4, info);
|
NoticeCenter::Instance().emitEvent(Broadcast::kBroadcastRecordMP4, info);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user