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/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 。