Commit 80eef693 by ziyue

精确mp4录制时长:#1795

parent bbdcc44e
...@@ -61,6 +61,16 @@ bool MP4MuxerInterface::haveVideo() const { ...@@ -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: ...@@ -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: ...@@ -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() { ...@@ -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);
}); });
} }
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论