Marey.Tools.Video
0.7.0
dotnet add package Marey.Tools.Video --version 0.7.0
NuGet\Install-Package Marey.Tools.Video -Version 0.7.0
<PackageReference Include="Marey.Tools.Video" Version="0.7.0" />
<PackageVersion Include="Marey.Tools.Video" Version="0.7.0" />
<PackageReference Include="Marey.Tools.Video" />
paket add Marey.Tools.Video --version 0.7.0
#r "nuget: Marey.Tools.Video, 0.7.0"
#:package Marey.Tools.Video@0.7.0
#addin nuget:?package=Marey.Tools.Video&version=0.7.0
#tool nuget:?package=Marey.Tools.Video&version=0.7.0
Marey.Tools.Video
Video output for Marey, a dimensionally-typed visualization system for F#. The frame sequence is the product; the mux is a convenience over it.
#r "nuget: Marey.Tools.Video"
open Marey
let sequence =
film |> Frames.write FramePass.Concurrent SkiaBackend.renderPng (FrameTarget.into "frames" ".png") 25.0
match Video.mux MuxOptions.Default sequence "shot.mp4" with
| MuxRan run when run.Succeeded -> printfn "encoded %d frames" run.FrameCount
| MuxUnavailable why -> printfn "%s" why // the frames are still there, and this says so
| other -> printfn "%A" other
Marey.Plot renders an animation to a numbered directory on every core there is. This encodes
that directory by running ffmpeg, which it looks for on PATH and reports — found, with its
version, or absent with the sentence naming what to install.
Why a subprocess and not a binding
FFmpeg.AutoGen links libav* into your process: LGPL at best, GPL the moment the build carries
x264, which puts a licence audit on everyone who references your project. A subprocess boundary
keeps ffmpeg's licence ffmpeg's problem. The managed wrappers shell out anyway, so what they cost
is a dependency and its opinions about temporary files, and what they buy is not writing one
ProcessStartInfo.
This package therefore has no third-party dependency of any kind.
What is in it
Video.mux, andVideo.muxWithfor a stated ffmpeg rather than the one onPATH. A missing encoder isMuxUnavailable— an outcome carrying what to install and the fact that the frames are still on disk — not an exception. A numbered directory is something every editor imports.Video.args, a pure function, so the exact command is a value you can print, diff or paste into a shell. Two positions in it are load-bearing and silent when wrong:-frameratebefore-ikeeps every rendered frame, and the same number after-iresamples — 24 frames at 12 fps is 24 frames written correctly and 13 with the flag moved.Video.inspect, which decodes the result withffprobeand says what is actually in it: codec, dimensions, frames counted rather than claimed, and the rate the container declares. Exit status is a weak gate — an encoder that wrote 13 of 24 frames exits zero.- Reproducible containers.
-fflags +bitexactand its companions strip theencoder=Lavf…andencoder=Lavc…tags that would otherwise name the ffmpeg build that wrote the file.VideoInfo.BuildTagsis how you check, and it is empty. Video.check, which starts no process: leftover frames from a longer render (whichffmpeg -i frame-%05d.pngwould silently append as a tail), and odd pixel dimensions under a chroma-subsampled pixel format — read out of the first frame's own header, because a raster backend rounds an extent up.
Depends on Marey.Plot and
Marey.Toolchain, and on nothing outside this
repository.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. 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. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.1 is compatible. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.1
- FSharp.Core (>= 8.0.100)
- Marey.Plot (>= 0.7.0)
- Marey.Toolchain (>= 0.7.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.