如何在.NET项目中仅为Windows ARM64平台添加FFmpeg非官方构建?
针对Windows ARM64平台条件引入FFmpeg非官方构建包的解决方案
问题背景
官方FFmpeg仓库默认无法编译Windows ARM64版本,因此需要在项目中添加非官方构建包,但仅希望在用户针对Windows ARM64平台构建时才引入该包,其他平台自动使用官方版本。
尝试的配置如下:
<ItemGroup Condition="'$(RuntimeIdentifier)' == 'win-arm64'" <Content Include="ffmpeg.exe"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> <Content Include="ffprobe.exe"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> </ItemGroup>
出现的问题:配置可正常构建,但目标文件未被包含;尝试用!=排除其他平台时,文件会被包含但作用于所有平台,排除规则未生效。
解决方案
1. 修复ItemGroup语法错误
当前配置的ItemGroup标签未闭合(缺少>),这是导致条件判断失效的核心原因。修正后的完整配置:
<ItemGroup Condition="'$(RuntimeIdentifier)' == 'win-arm64'"> <Content Include="ffmpeg.exe"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> <Content Include="ffprobe.exe"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> </ItemGroup>
2. 确保构建时正确传递RuntimeIdentifier
如果通过命令行构建,必须明确指定目标平台参数,否则RuntimeIdentifier变量未被初始化,条件判断不会触发:
dotnet build -r win-arm64
在Visual Studio中,需在项目属性的“生成”选项卡中,选择目标平台为ARM64(Windows)。
3. 补充跨平台排除规则
为避免非Windows ARM64平台意外包含这些文件,可添加反向排除的配置:
<!-- Windows ARM64平台包含非官方构建包 --> <ItemGroup Condition="'$(RuntimeIdentifier)' == 'win-arm64'"> <Content Include="ffmpeg.exe"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> <Content Include="ffprobe.exe"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> </ItemGroup> <!-- 其他平台移除非官方文件 --> <ItemGroup Condition="'$(RuntimeIdentifier)' != 'win-arm64' OR '$(RuntimeIdentifier)' == ''"> <Content Remove="ffmpeg.exe" /> <Content Remove="ffprobe.exe" /> </ItemGroup>
添加OR '$(RuntimeIdentifier)' == ''是为了处理未指定平台的默认构建场景。
4. 适配带版本的RuntimeIdentifier(可选)
如果项目需要支持win10-arm64、win11-arm64这类带版本的RuntimeIdentifier,可使用通配符匹配:
<ItemGroup Condition="'$(RuntimeIdentifier)' Like 'win%-arm64'"> <Content Include="ffmpeg.exe"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> <Content Include="ffprobe.exe"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> </ItemGroup>
内容的提问来源于stack exchange,提问作者Otozinclus
相关产品推荐
相关产品推荐

