深入学习ing

.net core使用Xabe.FFmpeg包获取视频首帧预览图

  简要说明需求:你有一个网络视频资源(http地址)或者上传的视频文件,怎么将视频资源的某一帧的画面生成图片对象保存呢?

  要点:

    1. 首先你需要将视频资源保存到你的服务器某个指定目录里;

    2. 使用.net core里的包安装核心处理包:Xabe.FFmpeg,依赖包:Xabe.FFmpeg.Downloader可以选择性安装(依赖包主要解决处理包的执行环境)

    核心包官网:Docs | Xabe.FFmpeg

    3. 根据包示例编写核心代码:

 

using Microsoft.AspNetCore.Mvc;
using Xabe.FFmpeg;

namespace WebApplication1.Controllers
{
    public class HomeController : Controller
    {
        private readonly ILogger<HomeController> logger;
        private readonly IHostingEnvironment hostingEnvironment;

        public HomeController(
            ILogger<HomeController> logger,
            IHostingEnvironment hostingEnvironment)
        {
            this.logger = logger;
            this.hostingEnvironment = hostingEnvironment;
        }

        public async Task<IActionResult> Index()
        {
            //设置windows环境下依赖包的目录(依赖包核心文件:ffmpeg.exe,ffplay.exe,ffprobe.exe)
            FFmpeg.SetExecutablesPath(this.hostingEnvironment.ContentRootPath);

            /* 如果你是在windows里实验,且你的项目里没有依赖包核心文件,则放开下行代码
            # 添加视频处理核心文件
            await FFmpegDownloader.GetLatestVersion(FFmpegVersion.Official);
            */

            /* 如果你是在Docker环境里运行,请再Dockerfile里添加下行代码
            # 添加视频处理核心文件
            RUN apt-get install - y ffmpeg
            */

            // 如果你是在linux里运行,直接使用命令安装:apt-get update && apt-get install - y ffmpeg

            //视频文件路径
            string videoPath = $@"{this.hostingEnvironment.ContentRootPath}\normal video.mp4";

            //读取视频数据
            IMediaInfo info = await FFmpeg.GetMediaInfo(videoPath).ConfigureAwait(false);
            IVideoStream? videoStream = info.VideoStreams.First()?.SetCodec(VideoCodec.png);

            //生成图片
            string videoPreviewImagePath = $"output/images/c.png";
            IConversionResult conversionResult = await FFmpeg.Conversions.New()
                .AddStream(videoStream)
                .ExtractNthFrame(1, (x) => videoPreviewImagePath)
                .Start();

            Console.WriteLine("视频第一帧图片已提取到目录:" + videoPreviewImagePath);  

            return View();
        }
    }
}

 

posted on 2024-07-26 22:13  深入学习ing  阅读(168)  评论(0编辑  收藏  举报

导航