在C#中使用FFMPEG合并音频和视频文件

4

我正在尝试使用以下代码在我的C#程序中使用FFMPEG将一个音频文件和一个视频文件合并:

ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.CreateNoWindow = false;
startInfo.FileName = "ffmpeg.exe";
startInfo.Arguments = "ffmpeg -i video.mp4 -i mic.wav -c:v copy -map 0:v:0 -map 1:a:0 -c:a aac -b:a 192k output.mp4";
using (Process exeProcess = Process.Start(startInfo))
{
    exeProcess.WaitForExit();
}

我的调试文件夹设置如下: enter image description here 因此我不会遇到任何运行时错误,但是它只是没有创建我需要的最终output.mp4文件。

当您运行ffmpeg命令时,命令提示符中会显示什么? - Jeremy Thompson
我没有机会看到它。它只是突然弹出,然后关闭了。 - TermSpar
要保持Cmd提示符打开,请指定/k开关。我认为您可能需要CD(又称更改目录)-我看到您在调试文件夹中有ffmpeg.exe,所以看起来很好。我们最终将做的是将来自ffmpeg的stdout读入C#以诊断根本原因。请参见此处https://mathewsachin.github.io/blog/2017/07/28/ffmpeg-pipe-csharp.html。 - Jeremy Thompson
好的,运行“进程浏览器”以查看C#中的命令是什么,然后将其更改为与手动执行的cmd提示符相同:https://superuser.com/questions/415360/how-do-i-find-out-command-line-arguments-of-a-running-program - Jeremy Thompson
Process Explorer 似乎没有捕捉到任何传递的命令。它只显示最新的命令是 "C:\Users\Ben\Documents\Visual Studio 2017\Projects\Szy\WorkTracker\WorkTracker\bin\Debug\WorkTracker.exe" - TermSpar
显示剩余11条评论
2个回答

9
我最终通过以下方法解决了这个问题:
string args = "/c ffmpeg -i \"video.mp4\" -i \"mic.wav\" -shortest outPutFile.mp4";
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.CreateNoWindow = false;
startInfo.FileName = "cmd.exe";
startInfo.WorkingDirectory = @"" + outputPath;
startInfo.Arguments = args;
using Process exeProcess = Process.Start(startInfo)

exeProcess.WaitForExit();

1
尝试使用参数再试几次。就像我所说的,在 SU 线程中有一些我链接的好例子。 -c:v copy -map 0:v:0 -map 1:a:0 -c:a aac -b:a 192k 实际上是很重要的。请参阅此处:https://dev59.com/K2kw5IYBdhLWcg3waZ1W#36324719 - Jeremy Thompson
嘿@BenCompSci,我使用了你的代码并生成了.mp4文件,但它根本没有使用.wav文件中的音频,它仍然具有相同的音频,并且比输入视频少一点,这对你有效吗?在我的情况下可能出了什么问题?我下载了ffmpeg.exe文件并将其放置在Debug文件夹中。 - musicinmusic
没关系,最终使用了这个命令,效果非常好:""/c ffmpeg -i video.mp4 -i audio.mp3 -map 0:0 -map 1:0 -shortest output.mp4"" - musicinmusic
是的,对我来说,我必须使用命令提示符通过将FFMPEG添加到路径来运行命令。 - TermSpar

1

由于某些原因,TermSpar给出的答案对我完全没有用,以下是对我有用的代码:

ProcessStartInfo startInfo = new()
{
    CreateNoWindow = false,
    FileName = @"C:\Users\User\Documents\ffmpeg.exe",
    UseShellExecute = false,
    RedirectStandardOutput = true,
    RedirectStandardError = true,
    Arguments = string.Format(" -i {0} -i {1} -shortest {2} -y", @"C:\images\video.avi", @"C:\images\voice.wav", @"C:\images\result.avi")
};

using Process exeProcess = Process.Start(startInfo);

//debug
string StdOutVideo = exeProcess.StandardOutput.ReadToEnd();
string StdErrVideo = exeProcess.StandardError.ReadToEnd();
//

exeProcess.WaitForExit();
exeProcess.Close();

1
TermSpar的答案对您无效,因为您正在使用ffmeg.exe目录,如果您使用cmd.exe,则参数会更改,因此“/c ffmpeg”不是必需的。 - Felipe Mateus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接