谷歌云函数C#调用FFmpeg失败:找不到文件或目录
解决谷歌云函数C#调用FFmpeg找不到的问题
问题根源
谷歌云函数的.NET运行时环境默认PATH变量未包含系统级FFmpeg的安装路径,而Python运行时的环境变量配置逻辑不同,所以Python能正常调用,C#则出现"找不到文件或目录"的错误。
解决办法
1. 使用FFmpeg的绝对路径调用
Ubuntu环境下FFmpeg默认安装在/usr/bin/ffmpeg,直接在代码中指定绝对路径即可:
// 修正编码参数:-acodec wav 改为 -f wav(WAV是容器格式,对应PCM编码) Process.Start("/usr/bin/ffmpeg", $"-i {temp_input_file} -vn -f wav {temp_output_file}");
2. 显式设置Process的环境变量
如果偏好使用ffmpeg短命令,可以在ProcessStartInfo中补充PATH环境变量,将FFmpeg所在的/usr/bin目录加入:
var startInfo = new ProcessStartInfo { FileName = "ffmpeg", Arguments = $"-i {temp_input_file} -vn -f wav {temp_output_file}", // 扩展PATH变量,确保能找到系统级FFmpeg EnvironmentVariables = { ["PATH"] = $"{Environment.GetEnvironmentVariable("PATH")}:/usr/bin" } }; using var process = Process.Start(startInfo); process.WaitForExit();
建议加上
using语句管理Process资源,并调用WaitForExit()确保转码完成后再执行后续逻辑。
3. 验证FFmpeg路径(调试用)
如果不确定FFmpeg的实际路径,可以先在云函数中执行which ffmpeg命令确认:
using var whichProcess = Process.Start(new ProcessStartInfo { FileName = "which", Arguments = "ffmpeg", RedirectStandardOutput = true, UseShellExecute = false }); var ffmpegPath = whichProcess.StandardOutput.ReadToEnd().Trim(); // 输出路径到日志,确认后替换到代码中 Console.WriteLine($"FFmpeg路径:{ffmpegPath}");
内容的提问来源于stack exchange,提问作者Robert Meli
相关产品推荐
相关产品推荐

