在.NET容器服务中获取音视频时长及视频尺寸(无需本地存储)
解决方案
1. 选择跨平台媒体处理依赖
使用FFmpeg的.NET封装库FFmpegCore,它支持直接从流读取媒体信息,无需落地文件,且兼容Linux环境。
2. 核心代码实现(直接处理IFormFile流)
无需将文件保存到本地,直接通过流解析视频元数据:
using FFmpegCore; using FFmpegCore.Pipes; using Microsoft.AspNetCore.Mvc; [ApiController] [Route("api/video")] public class VideoController : ControllerBase { [HttpPost("info")] public async Task<IActionResult> GetVideoMetadata(IFormFile file) { if (file == null || file.Length == 0) return BadRequest("未上传有效视频文件"); // 直接读取IFormFile的流,无需本地存储 using var stream = file.OpenReadStream(); var mediaInfo = await FFmpeg.GetMediaInfoAsync(new StreamPipeSource(stream)); var videoStream = mediaInfo.VideoStreams.FirstOrDefault(); if (videoStream == null) return BadRequest("上传文件不是视频格式"); return Ok(new { DurationSeconds = mediaInfo.Duration.TotalSeconds, Width = videoStream.Width, Height = videoStream.Height, Format = mediaInfo.Format.Name }); } }
3. Docker容器配置(Linux环境)
FFmpegCore依赖系统级FFmpeg二进制文件,需在Docker镜像中安装FFmpeg:
Dockerfile示例(基于ASP.NET Core镜像)
# 基础运行时镜像(Linux) FROM mcr.microsoft.com/dotnet/aspnet:8.0-bookworm-slim AS base WORKDIR /app EXPOSE 8080 # 安装FFmpeg依赖 RUN apt-get update && \ apt-get install -y --no-install-recommends ffmpeg && \ rm -rf /var/lib/apt/lists/* # 构建阶段 FROM mcr.microsoft.com/dotnet/sdk:8.0-bookworm-slim AS build WORKDIR /src COPY ["YourProjectName.csproj", "."] RUN dotnet restore "./YourProjectName.csproj" COPY . . WORKDIR "/src/." RUN dotnet build "YourProjectName.csproj" -c Release -o /app/build # 发布阶段 FROM build AS publish RUN dotnet publish "YourProjectName.csproj" -c Release -o /app/publish /p:UseAppHost=false # 最终镜像 FROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "YourProjectName.dll"]
4. 关键注意事项
- 安装NuGet包:执行
dotnet add package FFmpegCore引入依赖 - 大文件处理:若需支持大视频,建议添加文件大小限制,并考虑分段流式解析避免内存溢出
- 格式兼容:FFmpeg支持MP4、AVI、MKV等主流视频格式,无需额外配置
内容的提问来源于stack exchange,提问作者Huynh Son
相关产品推荐
相关产品推荐

