FFMpeg的nuget包有好几种,这里选择了使用FFMpeg命令行的封装包Xabe.FFmpeg。因为Xabe.FFmpeg实际上也是通过调用FFMpeg.exe文件,通过命令行传参的方式实现,所以在使用之前,需要先下载FFMpeg文件,并将bin目录加入到系统的环境变量。

具体代码如下:

        public static async Task SnapshotFromVideoAsync(string inputFileName, string outFileName, int minWidthOrHeight, TimeSpan timeSpan)
        {
            var mediaInfo = await Xabe.FFmpeg.FFmpeg.GetMediaInfo(inputFileName);
            
            var stream = mediaInfo.VideoStreams.FirstOrDefault();
            if (stream != null && !string.IsNullOrWhiteSpace(stream.Ratio))
            {
                var widthHeightRatio = stream.Ratio.Split(':');
                if (widthHeightRatio.Length == 2)
                {
                    var size = MediaHandler.GetThumbSize(stream.Ratio, minWidthOrHeight);
                    var conversion = Xabe.FFmpeg.FFmpeg.Conversions.New();
                    conversion.AddStream(stream.SetOutputFramesCount(1).SetSeek(timeSpan));
                    conversion.SetOutput(outFileName);
                    conversion.SetOverwriteOutput(true);
                    conversion.AddParameter($"-s {size.Width}x{size.Height}");
                    await conversion.Start();
                }
            }
        }

方法二,不需要GetMediaInfo,直接截图。

        public async Task SnapshotImage(string inputFileName, string outFileName, TimeSpan position)
        {
            try
            {
                await FFmpeg.Conversions.New()
                .Start($" -i {inputFileName} -y -f image2 -ss {position.TotalSeconds} -t 0.001 {outFileName}");
            }
            catch (Exception e)
            {
                
            }
        }

有些视频开头可能会存在黑屏的情况,这种情况下需要通过算法去判断,当前帧是否为黑场帧。这里暂时没有去做实现!


本文会经常更新,请阅读原文: https://huchengv5.gitee.io//post/asp.net-core-%E4%BD%BF%E7%94%A8FFMpeg%E8%BF%9B%E8%A1%8C%E8%A7%86%E9%A2%91%E6%88%AA%E5%9B%BE.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

知识共享许可协议 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名胡承(包含链接: https://huchengv5.gitee.io/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系