优化已录制时长的计算方式
This commit is contained in:
parent
c9ced6571c
commit
c8e44202bd
|
@ -36,9 +36,11 @@ namespace N_m3u8DL_RE.DownloadManager
|
||||||
DateTime? PublishDateTime;
|
DateTime? PublishDateTime;
|
||||||
bool STOP_FLAG = false;
|
bool STOP_FLAG = false;
|
||||||
int WAIT_SEC = 0; //刷新间隔
|
int WAIT_SEC = 0; //刷新间隔
|
||||||
ConcurrentDictionary<int, int> RecordingDurDic = new(); //已录制时长
|
ConcurrentDictionary<int, int> RecordedDurDic = new(); //已录制时长
|
||||||
|
ConcurrentDictionary<int, int> RefreshedDurDic = new(); //已刷新出的时长
|
||||||
ConcurrentDictionary<int, BufferBlock<List<MediaSegment>>> BlockDic = new(); //各流的Block
|
ConcurrentDictionary<int, BufferBlock<List<MediaSegment>>> BlockDic = new(); //各流的Block
|
||||||
ConcurrentDictionary<int, bool> SamePathDic = new(); //各流是否allSamePath
|
ConcurrentDictionary<int, bool> SamePathDic = new(); //各流是否allSamePath
|
||||||
|
ConcurrentDictionary<int, bool> RecordLimitReachedDic = new(); //各流是否达到上限
|
||||||
ConcurrentDictionary<int, string> LastFileNameDic = new(); //上次下载的文件名
|
ConcurrentDictionary<int, string> LastFileNameDic = new(); //上次下载的文件名
|
||||||
ConcurrentDictionary<int, long> MaxIndexDic = new(); //最大Index
|
ConcurrentDictionary<int, long> MaxIndexDic = new(); //最大Index
|
||||||
ConcurrentDictionary<int, long> DateTimeDic = new(); //上次下载的dateTime
|
ConcurrentDictionary<int, long> DateTimeDic = new(); //上次下载的dateTime
|
||||||
|
@ -194,7 +196,7 @@ namespace N_m3u8DL_RE.DownloadManager
|
||||||
if (!Directory.Exists(tmpDir)) Directory.CreateDirectory(tmpDir);
|
if (!Directory.Exists(tmpDir)) Directory.CreateDirectory(tmpDir);
|
||||||
if (!Directory.Exists(saveDir)) Directory.CreateDirectory(saveDir);
|
if (!Directory.Exists(saveDir)) Directory.CreateDirectory(saveDir);
|
||||||
|
|
||||||
while (!STOP_FLAG && await source.OutputAvailableAsync())
|
while (true && await source.OutputAvailableAsync())
|
||||||
{
|
{
|
||||||
//接收新片段 且总是拿全部未处理的片段
|
//接收新片段 且总是拿全部未处理的片段
|
||||||
//有时每次只有很少的片段,但是之前的片段下载慢,导致后面还没下载的片段都失效了
|
//有时每次只有很少的片段,但是之前的片段下载慢,导致后面还没下载的片段都失效了
|
||||||
|
@ -450,7 +452,7 @@ namespace N_m3u8DL_RE.DownloadManager
|
||||||
//手动计算MPEGTS
|
//手动计算MPEGTS
|
||||||
if (currentVtt.MpegtsTimestamp == 0 && vtt.MpegtsTimestamp == 0)
|
if (currentVtt.MpegtsTimestamp == 0 && vtt.MpegtsTimestamp == 0)
|
||||||
{
|
{
|
||||||
vtt.MpegtsTimestamp = 90000 * (RecordingDurDic[task.Id] + (long)keys.Where(s => s.Index < seg.Index).Sum(s => s.Duration));
|
vtt.MpegtsTimestamp = 90000 * (RecordedDurDic[task.Id] + (long)keys.Where(s => s.Index < seg.Index).Sum(s => s.Duration));
|
||||||
}
|
}
|
||||||
currentVtt.AddCuesFromOne(vtt);
|
currentVtt.AddCuesFromOne(vtt);
|
||||||
}
|
}
|
||||||
|
@ -496,14 +498,14 @@ namespace N_m3u8DL_RE.DownloadManager
|
||||||
//手动计算MPEGTS
|
//手动计算MPEGTS
|
||||||
if (currentVtt.MpegtsTimestamp == 0 && vtt.MpegtsTimestamp == 0)
|
if (currentVtt.MpegtsTimestamp == 0 && vtt.MpegtsTimestamp == 0)
|
||||||
{
|
{
|
||||||
vtt.MpegtsTimestamp = 90000 * (RecordingDurDic[task.Id] + (long)keys.Where(s => s.Index < seg.Index).Sum(s => s.Duration));
|
vtt.MpegtsTimestamp = 90000 * (RecordedDurDic[task.Id] + (long)keys.Where(s => s.Index < seg.Index).Sum(s => s.Duration));
|
||||||
}
|
}
|
||||||
currentVtt.AddCuesFromOne(vtt);
|
currentVtt.AddCuesFromOne(vtt);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
RecordingDurDic[task.Id] += (int)segmentsDuration;
|
RecordedDurDic[task.Id] += (int)segmentsDuration;
|
||||||
|
|
||||||
/*//写出m3u8
|
/*//写出m3u8
|
||||||
if (DownloaderConfig.MyOptions.LiveWriteHLS)
|
if (DownloaderConfig.MyOptions.LiveWriteHLS)
|
||||||
|
@ -639,13 +641,8 @@ namespace N_m3u8DL_RE.DownloadManager
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//检测时长限制
|
if (STOP_FLAG)
|
||||||
if (!STOP_FLAG && RecordingDurDic.All(d => d.Value >= DownloaderConfig.MyOptions.LiveRecordLimit?.TotalSeconds))
|
break;
|
||||||
{
|
|
||||||
Logger.WarnMarkUp($"[darkorange3_1]{ResString.liveLimitReached}[/]");
|
|
||||||
STOP_FLAG = true;
|
|
||||||
CancellationTokenSource.Cancel();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fileOutputStream != null)
|
if (fileOutputStream != null)
|
||||||
|
@ -683,6 +680,11 @@ namespace N_m3u8DL_RE.DownloadManager
|
||||||
{
|
{
|
||||||
var streamSpec = dic.Key;
|
var streamSpec = dic.Key;
|
||||||
var task = dic.Value;
|
var task = dic.Value;
|
||||||
|
|
||||||
|
//达到上限时 不需要刷新了
|
||||||
|
if (RecordLimitReachedDic[task.Id])
|
||||||
|
return;
|
||||||
|
|
||||||
var allHasDatetime = streamSpec.Playlist!.MediaParts[0].MediaSegments.All(s => s.DateTime != null);
|
var allHasDatetime = streamSpec.Playlist!.MediaParts[0].MediaSegments.All(s => s.DateTime != null);
|
||||||
if (!SamePathDic.ContainsKey(task.Id))
|
if (!SamePathDic.ContainsKey(task.Id))
|
||||||
{
|
{
|
||||||
|
@ -703,6 +705,26 @@ namespace N_m3u8DL_RE.DownloadManager
|
||||||
//尝试更新时间戳
|
//尝试更新时间戳
|
||||||
var dt = newList.Last().DateTime;
|
var dt = newList.Last().DateTime;
|
||||||
DateTimeDic[task.Id] = dt != null ? GetUnixTimestamp(dt.Value) : 0L;
|
DateTimeDic[task.Id] = dt != null ? GetUnixTimestamp(dt.Value) : 0L;
|
||||||
|
//累加已获取到的时长
|
||||||
|
RefreshedDurDic[task.Id] += (int)newList.Sum(s => s.Duration);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!STOP_FLAG && RefreshedDurDic[task.Id] >= DownloaderConfig.MyOptions.LiveRecordLimit?.TotalSeconds)
|
||||||
|
{
|
||||||
|
RecordLimitReachedDic[task.Id] = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//检测时长限制
|
||||||
|
if (!STOP_FLAG && RecordLimitReachedDic.Values.All(x => x == true))
|
||||||
|
{
|
||||||
|
Logger.WarnMarkUp($"[darkorange3_1]{ResString.liveLimitReached}[/]");
|
||||||
|
STOP_FLAG = true;
|
||||||
|
CancellationTokenSource.Cancel();
|
||||||
|
|
||||||
|
foreach (var target in BlockDic.Values)
|
||||||
|
{
|
||||||
|
target.Complete();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -724,11 +746,6 @@ namespace N_m3u8DL_RE.DownloadManager
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (var target in BlockDic.Values)
|
|
||||||
{
|
|
||||||
target.Complete();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void FilterMediaSegments(StreamSpec streamSpec, ProgressTask task, bool allHasDatetime, bool allSamePath)
|
private void FilterMediaSegments(StreamSpec streamSpec, ProgressTask task, bool allHasDatetime, bool allSamePath)
|
||||||
|
@ -808,7 +825,7 @@ namespace N_m3u8DL_RE.DownloadManager
|
||||||
progress.Columns(new ProgressColumn[]
|
progress.Columns(new ProgressColumn[]
|
||||||
{
|
{
|
||||||
new TaskDescriptionColumn() { Alignment = Justify.Left },
|
new TaskDescriptionColumn() { Alignment = Justify.Left },
|
||||||
new RecordingDurationColumn(RecordingDurDic), //时长显示
|
new RecordingDurationColumn(RecordedDurDic), //时长显示
|
||||||
new RecordingStatusColumn(),
|
new RecordingStatusColumn(),
|
||||||
new PercentageColumn(),
|
new PercentageColumn(),
|
||||||
new DownloadSpeedColumn(SpeedContainerDic), //速度计算
|
new DownloadSpeedColumn(SpeedContainerDic), //速度计算
|
||||||
|
@ -823,8 +840,10 @@ namespace N_m3u8DL_RE.DownloadManager
|
||||||
var task = ctx.AddTask(item.ToShortShortString(), autoStart: false, maxValue: 0);
|
var task = ctx.AddTask(item.ToShortShortString(), autoStart: false, maxValue: 0);
|
||||||
SpeedContainerDic[task.Id] = new SpeedContainer(); //速度计算
|
SpeedContainerDic[task.Id] = new SpeedContainer(); //速度计算
|
||||||
LastFileNameDic[task.Id] = "";
|
LastFileNameDic[task.Id] = "";
|
||||||
|
RecordLimitReachedDic[task.Id] = false;
|
||||||
DateTimeDic[task.Id] = 0L;
|
DateTimeDic[task.Id] = 0L;
|
||||||
RecordingDurDic[task.Id] = 0;
|
RecordedDurDic[task.Id] = 0;
|
||||||
|
RefreshedDurDic[task.Id] = 0;
|
||||||
MaxIndexDic[task.Id] = item.Playlist?.MediaParts[0].MediaSegments.LastOrDefault()?.Index ?? 0L; //最大Index
|
MaxIndexDic[task.Id] = item.Playlist?.MediaParts[0].MediaSegments.LastOrDefault()?.Index ?? 0L; //最大Index
|
||||||
BlockDic[task.Id] = new BufferBlock<List<MediaSegment>>();
|
BlockDic[task.Id] = new BufferBlock<List<MediaSegment>>();
|
||||||
return (item, task);
|
return (item, task);
|
||||||
|
|
Loading…
Reference in New Issue