ffmpegcore 初始化失败因未找到ffmpeg可执行文件,需显式指定路径或使用downloader;音频丢失须显式添加.withaudio();裁剪缩放顺序错误导致黑边,filter链需crop在scale前;批量处理应限流并发并检查exitcode。

FFMpegCore 初始化失败:找不到 ffmpeg 可执行文件
直接运行会报错 System.ComponentModel.Win32Exception: The system cannot find the file specified,本质是 FFMpegCore 默认去系统 PATH 找 ffmpeg,但你根本没装或没配对路径。
实操建议:
- 最省事:用
FFMpegOptions.Default+FFMpegBinaryPath显式指定本地二进制位置,比如FFMpegOptions.Default with { FFMpegBinaryPath = @"C:\tools\ffmpeg.exe" } - 不想手动下载:用
FFMpegCore.Downloader自动拉取(注意它只下 Windows x64 版,Linux/macOS 得自己处理) - 别信“PATH 已加”——开新终端跑
where ffmpeg(Windows)或which ffmpeg(macOS/Linux)确认真能调通
视频转码时音频流丢失或静音
常见现象是输出视频能播画面,但没声音,或者日志里出现 Stream #0:1 -> #0:1 (aac (native) -> aac (native)) 后突然中断。根本原因是默认 OutputOptions 不自动继承输入的音频流,尤其当输入有多个音轨或编码不标准时。
实操建议:
- 显式加
.WithAudio(),哪怕只是透传:.WithAudio(new AudioInputSettings { Copy = true }) - 如果要重编码音频,别只写
.WithAudioCodec("aac"),补上采样率/声道数,比如.WithAudioSampleRate(44100).WithAudioChannels(2) - 用
FFProbe.AnalyseAsync()先看输入流结构,确认音频流索引是 0 还是 1,避免.MapTo(1)错映射
裁剪+缩放组合操作顺序出错导致黑边或变形
比如想把 1920×1080 视频先裁成 1280×720 中心区域,再缩到 640×360,结果输出全是黑边——这是因为 FFMpegCore 的 .WithVideoFilters() 里 filter 链顺序错了,crop 必须在 scale 前面,否则 scale 会先拉伸再裁,原始比例早乱了。
实操建议:
- filter 字符串按执行顺序拼,从左到右:
"crop=1280:720:320:140,scale=640:360"(注意 crop 的 x/y 偏移要算准) - 别依赖自动推断分辨率:显式设
.WithVideoSize(640, 360),否则某些 filter 组合下输出尺寸可能意外变成 640×? 或 ?×360 - 用
-v debug级别日志看 ffmpeg 实际执行命令,重点核对Stream mapping和Press [q] to stop前的 filtergraph
批量处理大量小视频时内存暴涨甚至 OOM
循环里反复 new FFMpegArguments 并调 ProcessSynchronously(),每个进程都吃几百 MB 内存,10 个并发就容易崩。这不是 .NET GC 问题,而是 ffmpeg 子进程没及时释放资源,加上 FFMpegCore 默认不复用进程。
实操建议:
- 用
FFMpegArguments.FromFileInput()+.OutputToFile()单次调用完成整个 pipeline,别拆成多步中间文件 - 控制并发数:用
SemaphoreSlim限流,比如最多同时跑 2 个 ffmpeg 进程,比 CPU 核数还高反而拖慢 - 关键点:每次调用后检查
process.ExitCode,非 0 就别继续——挂掉的进程不清理,残留句柄会持续占内存










