BililiveRecorder/BililiveRecorder.Flv/Pipeline/Rules/HandleNewScriptRule.cs

63 lines
2.2 KiB
C#
Raw Normal View History

2021-02-08 16:51:19 +08:00
using System;
2021-02-23 18:03:37 +08:00
using System.Collections.Generic;
using BililiveRecorder.Flv.Amf;
using BililiveRecorder.Flv.Pipeline.Actions;
2021-02-08 16:51:19 +08:00
namespace BililiveRecorder.Flv.Pipeline.Rules
{
/// <summary>
/// 处理收到 Script Tag 的情况
/// </summary>
/// <remarks>
/// 本规则为一般规则
/// </remarks>
public class HandleNewScriptRule : ISimpleProcessingRule
{
2021-04-07 18:24:05 +08:00
private static readonly ProcessingComment comment_onmetadata = new ProcessingComment(CommentType.Logging, "收到了 onMetaData");
2021-02-27 20:44:04 +08:00
2021-03-09 00:50:13 +08:00
public void Run(FlvProcessingContext context, Action next)
2021-02-08 16:51:19 +08:00
{
2021-03-09 00:50:13 +08:00
context.PerActionRun(this.RunPerAction);
next();
}
private IEnumerable<PipelineAction?> RunPerAction(FlvProcessingContext context, PipelineAction action)
{
if (action is PipelineScriptAction scriptAction)
2021-02-08 16:51:19 +08:00
{
2021-02-23 18:03:37 +08:00
var data = scriptAction.Tag.ScriptData;
if (!(data is null)
&& data.Values.Count == 2
&& data.Values[0] is ScriptDataString name
&& name == "onMetaData")
{
2021-05-12 22:38:39 +08:00
ScriptDataEcmaArray value = data.Values[1] switch
2021-02-23 18:03:37 +08:00
{
ScriptDataObject obj => obj,
ScriptDataEcmaArray arr => arr,
2021-05-12 22:38:39 +08:00
_ => new ScriptDataEcmaArray()
2021-02-23 18:03:37 +08:00
};
2021-04-07 18:24:05 +08:00
context.AddComment(comment_onmetadata);
2021-03-09 00:50:13 +08:00
yield return PipelineNewFileAction.Instance;
yield return (new PipelineScriptAction(new Tag
2021-02-23 18:03:37 +08:00
{
Type = TagType.Script,
ScriptData = new ScriptTagBody(new List<IScriptDataValue>
{
name,
value
})
}));
}
else
{
2021-05-12 22:38:39 +08:00
context.AddComment(new ProcessingComment(CommentType.Logging, "收到了非 onMetaData 的 Script Tag: " + (data?.ToJson() ?? "(null)")));
2021-02-23 18:03:37 +08:00
}
2021-02-08 16:51:19 +08:00
}
2021-02-23 18:03:37 +08:00
else
2021-03-09 00:50:13 +08:00
yield return action;
2021-02-08 16:51:19 +08:00
}
}
}