我用 C# 制作了一个笑话程序,它使用 ffmpeg 编辑具有不同效果的视频,例如口吃。到目前为止,我已经完成了 3 个效果,并且每个效果都可以独立工作,但只要我一个接一个 e.g. fx.CrashStutter(0, 2); fx.CrashBeep(2, 2); fx.Wow(4, 2);
代码中断并且不再生成照片/视频文件,但是一旦我停止调试它应该处理的文件就会出现。我使用了一个系统,它循环尝试执行命令以创建文本文件作为 ffmpeg 完成处理文件时的标记。调试控制台还反复显示“进程试图写入不存在的管道”。
以下是所有 3 种效果的代码:
public void Wow(double start, double duration)
{
if (fxstart == true)
{
//MessageBox.Show("WowFX Duration" + duration);
string folderName = ("W_s" + start);
System.Threading.Thread.Sleep(100);
FXcmd.StandardInput.WriteLine("mkdir " + folderName);
System.Threading.Thread.Sleep(100);
FXcmd.StandardInput.WriteLine("cd " + folderName);
System.Threading.Thread.Sleep(100);
FXcmd.StandardInput.WriteLine("ffmpeg -ss " + start + " -t " + (duration / 6) + " -i " + source + " a.mp4");
//wait until a.mp4 appears
while (File.Exists("FxSource(Temporary)\\" + folderName + "\\a.txt") == false)
{
/*aha got a live one!*/FXcmd.StandardInput.WriteLine(" echo a > a.txt");
System.Threading.Thread.Sleep(1500);
}
FXcmd.StandardInput.WriteLine("ffmpeg -i a.mp4 -vf reverse -af areverse b.mp4");
//wait until b.mp4 appears
while (File.Exists("FxSource(Temporary)\\" + folderName + "\\b.txt") == false)
{
FXcmd.StandardInput.WriteLine(" echo b > b.txt");
System.Threading.Thread.Sleep(1500);
}
FXcmd.StandardInput.WriteLine("ffmpeg -ss " + start + " -t " + (duration / 3) + " -i " + source + " c.mp4");
//wait until c.mp4 appears
while (File.Exists("FxSource(Temporary)\\" + folderName + "\\c.txt") == false)
{
FXcmd.StandardInput.WriteLine(" echo c > c.txt");
System.Threading.Thread.Sleep(1500);
}
FXcmd.StandardInput.WriteLine("ffmpeg -i c.mp4 -vf reverse -af areverse d.mp4");
//wait until d.mp4 appears
while (File.Exists("FxSource(Temporary)\\" + folderName + "\\d.txt") == false)
{
FXcmd.StandardInput.WriteLine(" echo d > d.txt");
System.Threading.Thread.Sleep(1500);
}
string[] concatList = { "file 'a.mp4'", "file 'b.mp4'", "file 'c.mp4'", "file 'd.mp4'" };
//FXcmd.StandardInput.Write("del a.txt, b.txt, c.txt, d.txt");
//System.Threading.Thread.Sleep(1000);
System.IO.File.WriteAllLines(("FxSource(Temporary)\\" + folderName + "\\concatList.txt"), concatList);
System.Threading.Thread.Sleep(1500);
FXcmd.StandardInput.WriteLine("ffmpeg -f concat -i concatList.txt -c copy " + folderName + ".mp4");
while (File.Exists("FxSource(Temporary)\\" + folderName + "\\" + "1.txt") == false)
{
FXcmd.StandardInput.WriteLine(" echo 1 > 1.txt");
System.Threading.Thread.Sleep(1500);
}
FXcmd.StandardInput.WriteLine("copy " + folderName + ".mp4 ..");
while (File.Exists("FxSource(Temporary)\\" + folderName + ".mp4") == false)
{
System.Threading.Thread.Sleep(1500);
}
FXcmd.StandardInput.WriteLine("cd ..");
System.Threading.Thread.Sleep(100);
FXcmd.StandardInput.WriteLine("cls");
FXcmd.StandardInput.Flush();
}
}
public void CrashStutter(int start, int duration)
{
if (fxstart == true)
{
string folderName = ("Cs_s" + start);
System.Threading.Thread.Sleep(100);
FXcmd.StandardInput.WriteLine("mkdir " + folderName);
System.Threading.Thread.Sleep(100);
FXcmd.StandardInput.WriteLine("cd " + folderName);
System.Threading.Thread.Sleep(100);
FXcmd.StandardInput.WriteLine("ffmpeg -ss " + start + " -t 0.1" + " -i " + source + " a.mp4");
System.Threading.Thread.Sleep(100);
while (File.Exists("FxSource(Temporary)\\" + folderName + "\\a.txt") == false)
{
FXcmd.StandardInput.WriteLine(" echo a > a.txt");
System.Threading.Thread.Sleep(1500);
}
FXcmd.StandardInput.WriteLine("ffmpeg -stream_loop "+10*duration+" -i a.mp4 "+folderName+".mp4");
while (File.Exists("FxSource(Temporary)\\" + folderName + "\\" + "1.txt") == false)
{
FXcmd.StandardInput.WriteLine(" echo 1 > 1.txt");
System.Threading.Thread.Sleep(1500);
}
FXcmd.StandardInput.WriteLine("copy " + folderName + ".mp4 ..");
while (File.Exists("FxSource(Temporary)\\" + folderName + ".mp4") == false)
{
System.Threading.Thread.Sleep(1500);
}
FXcmd.StandardInput.WriteLine("cd ..");
System.Threading.Thread.Sleep(100);
FXcmd.StandardInput.WriteLine("cls");
FXcmd.StandardInput.Flush();
}
}
public void CrashBeep(int start, int duration)
{
//this effect cannot last longer than 7 seconds
double contrast = 25;
double red = 0.75;
if (fxstart == true)
{
string folderName = ("Cb_s" + start);
FXcmd.StandardInput.WriteLine("mkdir " + folderName);
System.Threading.Thread.Sleep(100);
FXcmd.StandardInput.WriteLine("cd " + folderName);
System.Threading.Thread.Sleep(100);
/*gets stuck*/FXcmd.StandardInput.WriteLine("ffmpeg -i "+source+ " -vf fps=1 a.jpg");
System.Threading.Thread.Sleep(100);
while (File.Exists("FxSource(Temporary)\\" + folderName + "\\a.txt") == false)
{
FXcmd.StandardInput.WriteLine(" echo a > a.txt");
System.Threading.Thread.Sleep(1500);
}
FXcmd.StandardInput.WriteLine("ffmpeg -i a.jpg -vf eq=contrast="+contrast+" b.jpg");
while (File.Exists("FxSource(Temporary)\\" + folderName + "\\b.txt") == false)
{
FXcmd.StandardInput.WriteLine(" echo b > b.txt");
System.Threading.Thread.Sleep(1500);
}
FXcmd.StandardInput.WriteLine("ffmpeg -i b.jpg -vf colorbalance=rm=" + red + " c.jpg");
while (File.Exists("FxSource(Temporary)\\" + folderName + "\\c.txt") == false)
{
FXcmd.StandardInput.WriteLine(" echo > c.txt");
System.Threading.Thread.Sleep(1500);
}
FXcmd.StandardInput.WriteLine("ffmpeg -loop 1 -i c.jpg -c:v libx264 -t "+ duration +" -pix_fmt yuv420p -vf scale=1920:1080 d.mp4");
while (File.Exists("FxSource(Temporary)\\" + folderName + "\\d.txt") == false)
{
FXcmd.StandardInput.WriteLine(" echo d > d.txt");
System.Threading.Thread.Sleep(1500);
}
FXcmd.StandardInput.WriteLine("cd ..");
System.Threading.Thread.Sleep(100);
FXcmd.StandardInput.WriteLine("copy beep.mp3 "+folderName+"/beep.mp3");
System.Threading.Thread.Sleep(100);
FXcmd.StandardInput.WriteLine("cd "+folderName);
System.Threading.Thread.Sleep(100);
FXcmd.StandardInput.WriteLine("ffmpeg -i beep.mp3 -ss 0 -t " + duration + " e.mp3");
while (File.Exists("FxSource(Temporary)\\" + folderName + "\\e.txt") == false)
{
FXcmd.StandardInput.WriteLine(" echo e > e.txt");
System.Threading.Thread.Sleep(1500);
}
FXcmd.StandardInput.WriteLine("ffmpeg -i d.mp4 -i e.mp3 -c copy -map 0:v:0 -map 1:a:0 " + folderName + ".mp4");
while (File.Exists("FxSource(Temporary)\\" + folderName + "\\" + "1.txt") == false)
{
FXcmd.StandardInput.WriteLine(" echo 1 > 1.txt");
System.Threading.Thread.Sleep(1500);
}
FXcmd.StandardInput.WriteLine("copy " + folderName + ".mp4 ..");
while (File.Exists("FxSource(Temporary)\\" + folderName + ".mp4") == false)
{
System.Threading.Thread.Sleep(1500);
}
FXcmd.StandardInput.WriteLine("cd ..");
System.Threading.Thread.Sleep(100);
FXcmd.StandardInput.WriteLine("cls");
FXcmd.StandardInput.Flush();
}
}
有什么建议么?谢谢!
最佳答案
我已经想通了。我只是把它关掉然后再打开,哈哈。每次效果后我都会重新启动 FXcmd。
关于C# FFMPEG : Code bugs out and stops producing media files,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61878628/