如何解决用C#处理视频帧FFMPEG慢
我正在尝试从mp4视频中提取帧以进行处理。
也就是说,我要使用视频图像中的水印/时间戳来自动将视频拼接在一起。视频创建日期不足以完成此任务。
使用AI从视频中提取文本的部分也很好。
但是,FFMPEG似乎非常慢。源视频为1080p / 60fps(每5分钟的视频大约1GB)。
到目前为止,我已经使用Accord.FFMPEG包装器尝试了两种方法:
@
另一种尝试:
public void GetVideoFrames(string path)
{
using (var vFReader = new VideoFileReader())
{
// open video file
vFReader.Open(path);
// counter is beeing used to extract every xth frame (1 Frame per second)
int counter = 0;
for (int i = 0; i < vFReader.FrameCount;i ++)
{
counter++;
if (counter <= 60)
{
_ = vFReader.ReadVideoFrame();
continue;
}
else
{
Bitmap frame = vFReader.ReadVideoFrame();
// Process Bitmap
}
}
}
}
第二种方法是我首先尝试的方法,完全不可行。显然,FFMPEG对每个特定的帧进行了新的搜索,因此对于每个处理的帧来说,操作花费的时间越来越长。 在已经播放了5帧之后,大约需要4秒钟才能生成一帧。
第一种方法似乎至少没有遭受该问题的严重困扰,但是仍然需要大约2秒钟才能产生一帧。以这种速度,我可以更快地手动处理视频。
我的方法有什么问题吗?另外,我也不想在我需要在目标计算机上单独安装第三方库的解决方案上。 因此,如果有其他选择,我很乐意尝试一下,但是似乎堆溢出的每个人似乎都指向ffmpeg或opencv。
解决方法
我认为问题不在于FFmpeg,而是与Accord包装程序一起执行。我建议直接使用ffmpeg提取帧,因为它具有仅提取关键帧或每个X帧的选项(或者您可以只使用嵌入式视频时间戳...)。但是,如果您想继续前进,则可以考虑使用passing the desired frame index而不是for循环-它应该更快,并且可以并行化它。
但是在单独的ffmpeg流程中完成所有操作会更快 。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。