gpt4 book ai didi

c# - 如何从 FFMPEG 获取 c# 中的帧进度

转载 作者:行者123 更新时间:2023-12-04 23:19:15 26 4
gpt4 key购买 nike

我是第一次在 c# 中使用 Process 命名空间,我正在使用 FFMPEG 在视频中添加水印。我已成功添加水印,但我也想在我的程序控制台中显示进度。如何获得 frame目前FFmpeg上没有。
为了实现这一点,我还使用 ffprobe 来获取总帧数,然后,我将它与当前帧数相除,以便获得进度。问题是我不知道如何在 ffmpeg 对视频进行处理时获取帧。

最佳答案

几年前,我为这样的事情写了一些帮助类。有趣的部分是:


private Process _ffmpeg = null;

public override void StartRecording()
{
ProcessStartInfo psi = new ProcessStartInfo
{
FileName = PATH_TO_FF_HERE,
Arguments = ARGS_FOR_FF_HERE,
WindowStyle = ProcessWindowStyle.Hidden,
CreateNoWindow = true,
UseShellExecute = false,
RedirectStandardInput = true,
RedirectStandardOutput = true,
RedirectStandardError = true
};

_ffmpeg = System.Diagnostics.Process.Start(psi);
_ffmpeg.OutputDataReceived += Ffmpeg_OutputDataReceived;
_ffmpeg.ErrorDataReceived += Ffmpeg_ErrorDataReceived;
_ffmpeg.BeginOutputReadLine();
_ffmpeg.BeginErrorReadLine();

_ffmpeg.PriorityClass = ProcessPriorityClass.High;
}

void Ffmpeg_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
if (e.Data != null && e.Data.StartsWith("frame="))
{
//for example, e.Data might look like:
//frame=113987 fps= 10 q=-1.0 Lsize= 204000kB time=03:09:58.50 bitrate= 146.6kbits/s

//do something here
}
}
void Ffmpeg_ErrorDataReceived(object sender, DataReceivedEventArgs e)
{
if (e.Data != null && e.Data.StartsWith("frame="))
{
//do something here
}
}

出于我的目的,我对帧数据不感兴趣,所以我忽略了任何以“frame =”开头的字符串,但是如果您看到一个确实的数据,听起来您想采取行动,如果某个帧计数器是,则可能会激活一个事件比以前高 100 (我认为您不需要在处理的每一帧上引发一个事件..但是您可以自由地做您想做的事!)

关于c# - 如何从 FFMPEG 获取 c# 中的帧进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70182490/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com