通过Azure Pipelines部署后Azure Function中FFmpeg无法运行
退出码-1073741515对应Windows错误码0xC0000135,核心原因是找不到依赖库,结合你本地/手动部署正常、Pipeline部署异常的场景,可按以下步骤排查解决:
确认FFmpeg依赖文件完整性
对比手动部署和Pipeline部署后的C:\home\site\wwwroot\ffmpeg\文件夹,检查是否缺少FFmpeg所需的VC++运行库(如vcruntime140.dll、vcruntime140_1.dll)或其他关联dll文件。手动部署时可能完整复制了所有文件,但Pipeline打包过程中可能遗漏了这些依赖。修正项目文件中的复制配置
确保.csproj中已配置将FFmpeg相关文件(包括exe和所有依赖)复制到发布目录。添加以下配置到项目文件:<ItemGroup> <None Include="ffmpeg\**" CopyToPublishDirectory="PreserveNewest" /> </ItemGroup>该配置会递归复制
ffmpeg文件夹下的所有文件到发布输出目录,避免Pipeline打包时遗漏。匹配FFmpeg与函数应用的架构
检查Azure Function应用的运行架构(x86/x64),确保与FFmpeg版本一致:- 登录Azure门户,进入目标函数应用的配置→常规设置
- 查看“平台架构”选项,若为x64则必须使用x64版本的FFmpeg,x86同理。架构不匹配会导致依赖加载失败,触发
0xC0000135错误。
设置进程工作目录
修改FFmpeg进程启动代码,将工作目录设置为FFmpeg所在文件夹,确保其能加载同目录下的依赖库:var startInfo = new ProcessStartInfo { FileName = ffmpegPath, RedirectStandardOutput = true, RedirectStandardError = true, UseShellExecute = false, CreateNoWindow = true, Arguments = "-version", WorkingDirectory = Path.GetDirectoryName(ffmpegPath) // 添加工作目录配置 };捕获详细错误日志
修改代码以获取FFmpeg的错误输出,帮助定位具体问题:// 假设注入了ILogger实例_logger process.ErrorDataReceived += (sender, e) => { if (!string.IsNullOrEmpty(e.Data)) { _logger.LogError("FFmpeg执行错误: {ErrorMessage}", e.Data); } }; process.Start(); process.BeginOutputReadLine(); // 启动异步读取输出 process.BeginErrorReadLine(); // 启动异步读取错误 process.WaitForExit();通过函数应用的日志系统查看捕获到的错误信息,进一步排查问题。
验证Kudu手动执行
在Kudu控制台中进入C:\home\site\wwwroot\ffmpeg\目录,手动执行ffmpeg.exe -version,观察是否能正常运行。若手动执行也失败,说明是文件本身或环境权限问题;若手动执行成功,则回到Pipeline打包配置排查遗漏。
内容的提问来源于stack exchange,提问作者Isak Engström

