SpawnDev.WebMParser
1.0.1
dotnet add package SpawnDev.WebMParser --version 1.0.1
NuGet\Install-Package SpawnDev.WebMParser -Version 1.0.1
<PackageReference Include="SpawnDev.WebMParser" Version="1.0.1" />
paket add SpawnDev.WebMParser --version 1.0.1
#r "nuget: SpawnDev.WebMParser, 1.0.1"
// Install SpawnDev.WebMParser as a Cake Addin #addin nuget:?package=SpawnDev.WebMParser&version=1.0.1 // Install SpawnDev.WebMParser as a Cake Tool #tool nuget:?package=SpawnDev.WebMParser&version=1.0.1
WebMParser
WebMParser is a .Net WebM parser written in C#.
The initial goal of this library is to allow adding a duration to WebM video files recorded using MediaRecorder in a web browser. I am using this library in a browser based Blazor WebAssembly video messaging application.
The demo project included with the library is a .Net core 8 console app that currently just allows testing the library.
To fix the duration in a WebM file, WebM parser reads the Timecode information from Clusters and SimpleBlocks and adds a Segment > Info > Duration element with the new duration.
Example of how to add Duration info if not found in a webm stream.
using var inputStream = new FileStream(inputFile, FileMode.Open, FileAccess.Read, FileShare.Read);
var webm = new WebMStreamParser(inputStream);
// FixDuration returns true if the WebM was modified
var modified = webm.FixDuration();
// webm.Modified will also be true if the WebM is modified
if (modified)
{
var outFile = Path.Combine(Path.GetDirectoryName(inputFile)!, Path.GetFileNameWithoutExtension(inputFile) + ".fixed" + Path.GetExtension(inputFile));
using var outputStream = new FileStream(outFile, FileMode.Create, FileAccess.Write, FileShare.None);
webm.CopyTo(outputStream);
}
Example that prints out basic info for every element found in the WebM stream
var elements = webm.Descendants;
foreach (var element in elements)
{
var indent = new string('-', element.IdChain.Length - 1);
Console.WriteLine($"{indent}{element}");
}
Example of how to get an element
var durationElement = webm.GetElement<FloatElement>(ElementId.Segment, ElementId.Info, ElementId.Duration);
var duration = durationElement?.Data ?? 0;
Example of how to get all elements of a type
var segments = webm.GetElements<ContainerElement>(ElementId.Segment);
Example of how to use ElementIds to walk the data tree and access information
var segments = webm.GetContainers(ElementId.Segment);
foreach (var segment in segments)
{
var clusters = segment.GetContainers(ElementId.Cluster);
foreach (var cluster in clusters)
{
var timecode = cluster.GetElement<UintElement>(ElementId.Timecode);
if (timecode != null)
{
duration = timecode.Data;
};
var simpleBlocks = cluster.GetElements<SimpleBlockElement>(ElementId.SimpleBlock);
var simpleBlockLast = simpleBlocks.LastOrDefault();
if (simpleBlockLast != null)
{
duration += simpleBlockLast.Timecode;
}
}
}
Example of how to add an element
All parent containers are automatically marked Modified if any children are added, removed, or changed.
var info = GetContainer(ElementId.Segment, ElementId.Info);
info!.Add(ElementId.Duration, 100000);
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
-
net8.0
- No dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.