Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用FFMPEG(c#应用程序)向视频添加文本_C#_Ffmpeg - Fatal编程技术网

使用FFMPEG(c#应用程序)向视频添加文本

使用FFMPEG(c#应用程序)向视频添加文本,c#,ffmpeg,C#,Ffmpeg,尝试使用以下命令通过c#脚本使用FFMPEG向视频添加文本 ffmpeg -i input.mp4 -vf drawtext="\text='Stack Overflow': fontcolor=white: fontsize=24: box=1: boxcolor=black@0.5: x=w-tw-10:y=h-th-10" -codec:a copy output.mp4 当从cmd运行它时,它可以工作,但当我在这里实现它时: public void AddNewLabel(st

尝试使用以下命令通过c#脚本使用FFMPEG向视频添加文本

ffmpeg -i input.mp4 -vf drawtext="\text='Stack Overflow': fontcolor=white: fontsize=24: box=1: boxcolor=black@0.5: x=w-tw-10:y=h-th-10" -codec:a copy output.mp4
当从cmd运行它时,它可以工作,但当我在这里实现它时:

    public void AddNewLabel(string label)
    {
        //string video = "input.mp4";
        string filter = "input.mp4 -vf drawtext=\"\text='sampletext': fontcolor=white: fontsize=24: box=1: boxcolor=black: x=w-tw-10:y=h-th-10\"";//problemm is this line

        string args = $"/c ffmpeg -i {filter} -codec:a copy output.mp4";

        ProcessStartInfo startInfo = new ProcessStartInfo
        {
            CreateNoWindow = false,
            FileName = "cmd.exe",
            WorkingDirectory = outputpath,
            Arguments = args
        };

        using (Process exeProcess = Process.Start(startInfo))
        {
            exeProcess.WaitForExit();
        }
    }

输出是无法打开的0kb mp4文件。当我删除过滤器中input.mp4之后的所有内容时,输出正常。我可能做错了什么?

在使用
args
之前,为什么不将其写入控制台,以便您可以准确地看到发送到命令行的内容:

Console.WriteLine($"Args={args}");
ProcessStartInfo startInfo = new ProcessStartInfo
drawtext=\“\text
需要是
drawtext=\”\\text

参见小提琴:

输出:

input.mp4-vf drawtext=“ext='sampletext':fontcolor=white:fontsize=24:box=1:boxcolor=black:x=w-tw-10:y=h-th-10”

input.mp4-vf drawtext=“\text='sampletext':fontcolor=white:fontsize=24:box=1:boxcolor=black:x=w-tw-10:y=h-th-10”

\t
是制表器的转义符(也称为“”。这就是为什么你需要在这里转义转义字符本身。这是通过将其加倍来完成的=>
\\t


正如@Jawad正确指出的那样:有另一种方法可以实现同样的目标: “”:

@特殊字符用作逐字标识符。它可以通过以下方式使用:

  • 启用C#关键字作为标识符。[……]

  • 指示字符串文字将被逐字解释。[……]

  • 例如:

    string filename1 = @"c:\documents\files\u0066.txt";
    

    您似乎正在启动一个命令shell(cmd.exe),只是为了运行ffmpeg。为什么不直接运行ffmpeg呢?我的任务要求我创建一个c#应用程序,用户可以在其中向列表中输入文本,并将其添加到所选视频的角落。如果我从命令行运行ffmpeg,我可以这样做,但我需要它通过c#app工作。我的意思是,为什么不使用“ffmpeg”作为
    文件名
    args
    作为参数属性?可能“\text…”有问题吗\t是制表器。如果你问我的话,它应该是
    drawtext=\“\\text=
    。看到了吧。制表器是什么?你也可以使用@来定义字符串文字。
    string filter=@“input.mp4-vf drawtext=”“text='samplet…
    @Jawad绝对正确。但是你也必须改变字符串的其他部分。因为OP问“什么是制表器”,我不想开始对做同样事情的另一种方法感到困惑。我投了更高的票,因为这是正确的答案。我只是在建议其他方法:)我很感激@JawadOh,我现在明白了。谢谢大家的帮助!