FFMpegCore
一个.NET Standard FFMpeg/FFProbe封装器,可以轻松地将媒体分析和转换集成到您的.NET应用程序中。支持同步和异步调用。
API
FFProbe
使用FFProbe分析媒体文件:
var mediaInfo = await FFProbe.AnalyseAsync(inputPath);
或
var mediaInfo = FFProbe.Analyse(inputPath);
FFMpeg
使用FFMpeg转换您的媒体文件。 使用流畅的参数构建器轻松构建您的FFMpeg参数:
将输入文件转换为h264/aac编码,缩放到720p,带快速启动,用于Web播放
FFMpegArguments
.FromFileInput(inputPath)
.OutputToFile(outputPath, false, options => options
.WithVideoCodec(VideoCodec.LibX264)
.WithConstantRateFactor(21)
.WithAudioCodec(AudioCodec.Aac)
.WithVariableBitrate(4)
.WithVideoFilters(filterOptions => filterOptions
.Scale(VideoSize.Hd))
.WithFastStart())
.ProcessSynchronously();
从流转换和/或转换到流
await FFMpegArguments
.FromPipeInput(new StreamPipeSource(inputStream))
.OutputToPipe(new StreamPipeSink(outputStream), options => options
.WithVideoCodec("vp9")
.ForceFormat("webm"))
.ProcessAsynchronously();
辅助方法
提供的辅助方法使执行常见操作变得简单。
轻松从视频文件中捕获快照:
// 在内存中处理快照并直接使用Bitmap
var bitmap = FFMpeg.Snapshot(inputPath, new Size(200, 400), TimeSpan.FromMinutes(1));
// 或将图像保存到磁盘
FFMpeg.Snapshot(inputPath, outputPath, new Size(200, 400), TimeSpan.FromMinutes(1));
您还可以从视频文件中捕获GIF快照:
FFMpeg.GifSnapshot(inputPath, outputPath, new Size(200, 400), TimeSpan.FromSeconds(10));
// 或异步
await FFMpeg.GifSnapshotAsync(inputPath, outputPath, new Size(200, 400), TimeSpan.FromSeconds(10));
// 您还可以将Width/Height Size属性之一设置为-1,让FFMPEG在保持纵横比的同时调整大小
await FFMpeg.GifSnapshotAsync(inputPath, outputPath, new Size(480, -1), TimeSpan.FromSeconds(10));
将视频部分合并为一个文件:
FFMpeg.Join(@"..\joined_video.mp4",
@"..\part1.mp4",
@"..\part2.mp4",
@"..\part3.mp4"
);
创建子视频
FFMpeg.SubVideo(inputPath,
outputPath,
TimeSpan.FromSeconds(0),
TimeSpan.FromSeconds(30)
);
将图像合并成视频:
FFMpeg.JoinImageSequence(@"..\joined_video.mp4", frameRate: 1,
ImageInfo.FromPath(@"..\1.png"),
ImageInfo.FromPath(@"..\2.png"),
ImageInfo.FromPath(@"..\3.png")
);
将视频文件的音频静音:
FFMpeg.Mute(inputPath, outputPath);
从视频文件中提取音频轨道:
FFMpeg.ExtractAudio(inputPath, outputPath);
添加或替换视频文件的音频轨道:
FFMpeg.ReplaceAudio(inputPath, inputAudioPath, outputPath);
将图像与音频文件合并,用于YouTube或类似平台
FFMpeg.PosterWithAudio(inputPath, inputAudioPath, outputPath);
// 或
var image = Image.FromFile(inputImagePath);
image.AddAudio(inputAudioPath, outputPath);
其他可用参数可以在FFMpegCore.Arguments
命名空间中找到。
输入管道
通过输入管道,可以直接从程序内存写入视频帧,而无需将它们保存为jpeg或png然后将路径传递给ffmpeg的输入。这个功能还允许在生成或接收帧的同时实时转换视频。
实现IPipeSource
接口的对象用作数据源。目前,IPipeSource
接口有两种实现:用于流的StreamPipeSource
和用于原始视频帧的RawVideoPipeSource
。
处理原始视频帧
生成位图帧的方法:
IEnumerable<IVideoFrame> CreateFrames(int count)
{
for(int i = 0; i < count; i++)
{
yield return GetNextFrame(); //生成或接收下一帧的方法
}
}
然后创建一个利用您的视频帧源的RawVideoPipeSource
var videoFramesSource = new RawVideoPipeSource(CreateFrames(64))
{
FrameRate = 30 //设置源帧率
};
await FFMpegArguments
.FromPipeInput(videoFramesSource)
.OutputToFile(outputPath, false, options => options
.WithVideoCodec(VideoCodec.LibVpx))
.ProcessAsynchronously();
如果你想将 System.Drawing.Bitmap
用作 IVideoFrame
,我们提供了一个 BitmapVideoFrameWrapper
包装类。
二进制文件
安装
如果你更喜欢手动下载,请访问 ffbinaries 或 zeranoe Windows 构建版本。
Windows(使用 choco)
命令:choco install ffmpeg -y
位置:C:\ProgramData\chocolatey\lib\ffmpeg\tools\ffmpeg\bin
Mac OSX
命令:brew install ffmpeg mono-libgdiplus
位置:/usr/local/bin
Ubuntu
命令:sudo apt-get install -y ffmpeg libgdiplus
位置:/usr/bin
路径配置
选项1
默认值为空字符串(期望通过 PATH 找到 ffmpeg)可以通过 FFOptions
类进行覆盖:
// 设置全局选项
GlobalFFOptions.Configure(new FFOptions { BinaryFolder = "./bin", TemporaryFilesFolder = "/tmp" });
// 或
GlobalFFOptions.Configure(options => options.BinaryFolder = "./bin");
// 在某些系统上可能需要绝对路径,这种情况下
GlobalFFOptions.Configure(new FFOptions { BinaryFolder = Server.MapPath("./bin"), TemporaryFilesFolder = Server.MapPath("/tmp") });
// 或单独的每次运行选项
await FFMpegArguments
.FromFileInput(inputPath)
.OutputToFile(outputPath)
.ProcessAsynchronously(true, new FFOptions { BinaryFolder = "./bin", TemporaryFilesFolder = "/tmp" });
// 或结合使用,设置全局默认值并调整每次运行选项
GlobalFFOptions.Configure(new FFOptions { BinaryFolder = "./bin", TemporaryFilesFolder = "./globalTmp", WorkingDirectory = "./" });
await FFMpegArguments
.FromFileInput(inputPath)
.OutputToFile(outputPath)
.Configure(options => options.WorkingDirectory = "./CurrentRunWorkingDir")
.Configure(options => options.TemporaryFilesFolder = "./CurrentRunTmpFolder")
.ProcessAsynchronously();
选项2
ffmpeg 二进制文件的根目录和临时目录可以通过 ffmpeg.config.json
文件进行配置,该文件仅在首次使用时读取。
{
"BinaryFolder": "./bin",
"TemporaryFilesFolder": "/tmp"
}
同时支持32位和64位进程
如果你希望支持多种客户端处理器架构,可以在 BinaryFolder
目录中创建两个文件夹:x64
和 x86
。
这两个文件夹都应包含为各自架构构建的二进制文件(ffmpeg.exe
和 ffprobe.exe
)。
这样做后,库将尝试使用 /{BinaryFolder}/{ARCH}/(ffmpeg|ffprobe).exe
。
如果未定义这些文件夹,它将尝试在 /{BinaryFolder}/(ffmpeg|ffprobe.exe)
中查找二进制文件。
(.exe
仅在 Windows 上添加)
兼容性
旧版本的 ffmpeg 可能不支持本库提供的所有 ffmpeg 参数。该库已经过版本 3.3
到 4.2
的测试。
代码贡献者
其他贡献者
许可证
版权所有 © 2023
根据 MIT 许可证 发布