sdcb / Sdcb.FFmpeg

FFmpeg basic .NET API generated by CppSharp
GNU Lesser General Public License v3.0
334 stars 53 forks source link

有快速截取图片的方法吗? #8

Closed j4587698 closed 1 year ago

j4587698 commented 1 year ago

目前的例子都是转换视频,有没有提取图片的例子?快速提取一帧转换为byte[],再通过其他工具转成其他格式?

sdcb commented 1 year ago

可以,目前在做其它项目,我稍后会根据你的需求写更多的示例。 确认一下,你想得到byte[],你希望这个byte[]是什么格式有哪些具体的期望?下面是一些可能的选项:

如果你想自己探索,那么这是一些提示:其实在Frame这个类中,基本就是YUV420P的数据了,对于你的需求只需要再调用Swscale即可。

j4587698 commented 1 year ago

目前找到的方法是这样:

using var io = FormatContext.OpenInputIO(IOContext.ReadStream(File.OpenRead("D://VID_20230502_102402.mp4")));
io.LoadStreamInfo();

var videoStream = io.GetVideoStream();
using CodecContext cc = new(Codec.FindDecoderById(videoStream.Codecpar!.CodecId));
cc.FillParameters(videoStream.Codecpar);
cc.Open();

foreach (var frame in io.ReadPackets(videoStream.Index).DecodePackets(cc))
{
    using VideoFrameConverter sws = new();
    using Frame dest = Frame.CreateVideo(videoStream.Codecpar.Width, videoStream.Codecpar.Height, AVPixelFormat.Rgb24);
   sws.ConvertFrame(frame, dest);
   var bytes = dest.ToImageBuffer();
   return;
}

不知道有更简单办法吗?

sdcb commented 1 year ago

没有更简单的办法,如果有,也是我包装一个函数然后代码写得和你的差不多

zero16832 commented 6 months ago

没有更简单的办法,如果有,也是我包装一个函数然后代码写得和你的差不多

是哪个函数丫?