如何在 Shell FFmpeg 中转义单引号?

发布于 2025-01-11 13:30:14 字数 911 浏览 0 评论 0原文

我的环境

  • zsh
  • Apple clang 版本 13.0.0

我的问题摘要

我想使用 FFmpeg 在视频上绘制一些文本。

我的命令行是由带有 system() 函数的 C 程序发送的。

当我的字符串中有单引号时,文本不会显示,这是有道理的。

我尝试过的方法

  • 保持原样 → 不绘制任何文本
  • 使用 \' 通常转义 → 不绘制任何文本
  • 使用 \\' 进行双重转义 → 不绘制任何文本
  • 三重转义等等...
  • 使用 \0027\xE2\x80\x99 符号 → 文本绘制为“0027”或“xE2x80x99”

我的代码

The generateVideo()函数

void generateVideo(char sourceVideoPath[], char text[], int destinationFileName) {
    char line[1000];
    sprintf(line, "ffmpeg -i %s -vf \"drawtext=fontfile=/path/to/font/:text='%s':fontcolor=white:fontsize=28:borderw=2.8:x=(w-text_w)/2:y=(h-text_h)/2\" -codec:a copy ../%d.mp4", sourceVideoPath, text, destinationFileName);
    system(line);
}

不知道问题是出在FFmpeg还是Shell上,但是暂时无法绘制带引号的文本,很痛苦。

提前谢谢你们了!

My environment

  • zsh
  • Apple clang version 13.0.0

Summary of my problem

I want to draw some text on a video using FFmpeg.

My command line is sent by a C program with the system() function.

When there is a single quote in my string, the text does not display, which makes sense.

What I've tried

  • Leaving it as it is → no text is drawn
  • Escaping it normally with \' → no text is drawn
  • Double escaping it with \\' → no text is drawn
  • Triple escaping it, etc...
  • Using the \0027 and \xE2\x80\x99 notations → text is drawn as "0027" or "xE2x80x99"

My code

The generateVideo() function

void generateVideo(char sourceVideoPath[], char text[], int destinationFileName) {
    char line[1000];
    sprintf(line, "ffmpeg -i %s -vf \"drawtext=fontfile=/path/to/font/:text='%s':fontcolor=white:fontsize=28:borderw=2.8:x=(w-text_w)/2:y=(h-text_h)/2\" -codec:a copy ../%d.mp4", sourceVideoPath, text, destinationFileName);
    system(line);
}

I don't know if the problem comes from FFmpeg or Shell, but it is a pain that I can't draw texts with quotes for the moment.

Thank you guys in advance!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

夏末 2025-01-18 13:30:14

从你的问题中很难看出问题是什么,但我相信像在文本中的引号之前编码 \ 这样的修复应该可以修复它。如果您从 shell 中运行的命令行开始,然后尝试从 C 代码中使用“system”发出该命令,那么可能会更容易提供帮助。这是一个 main.c,它演示了我认为应该起作用的内容:

#import <stdio.h>
#import <stdlib.h>

int main(int argc, char **argv) {
    char *sourceVideoPath = "video";
    char *text = "text \\'quoted\\' text";
    int destinationFileName = 10;
    char line[1000];
    sprintf(line, "echo ffmpeg -i %s -vf \"drawtext=fontfile=/path/to/font/:text='%s':fontcolor=white:fontsize=28:borderw=2.8:x=(w-text_w)/2:y=(h-text_h)/2\" -codec:a copy ../%d.mp4", sourceVideoPath, text, destinationFileName);
    system(line);
}

It's a little hard to tell from your question what the problem is, but I believe a fix like encoding \ before the quotes in the text should fix it. It might be easier to help if you started from a command line that works from the shell and then tried to issue that command with 'system' from your C code. Here is a main.c that demonstrates what I think ought to work:

#import <stdio.h>
#import <stdlib.h>

int main(int argc, char **argv) {
    char *sourceVideoPath = "video";
    char *text = "text \\'quoted\\' text";
    int destinationFileName = 10;
    char line[1000];
    sprintf(line, "echo ffmpeg -i %s -vf \"drawtext=fontfile=/path/to/font/:text='%s':fontcolor=white:fontsize=28:borderw=2.8:x=(w-text_w)/2:y=(h-text_h)/2\" -codec:a copy ../%d.mp4", sourceVideoPath, text, destinationFileName);
    system(line);
}
岁月静好 2025-01-18 13:30:14

请您尝试以下操作:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char *sourceVideoPath = "video.mp4";
    char *text = "'text '\\\\\\\\\\\''quoted'\\\\\\\\\\\'' text'";
    char *destinationFileName = "with_text.mp4";
    char line[1000];
    sprintf(line, "ffmpeg -i \"%s\" -vf \"drawtext=fontfile=/path/to/fonts/font.ttf:text=%s:fontcolor=white:fontsize=28:borderw=2.8:x=(w-text_w)/2:y=(h-text_h)/2\" -codec:a copy \"%s\"", sourceVideoPath, text, destinationFileName);
    system(line);
}

我不是在开玩笑:)。
使用实际视频文件进行测试。

Would you please try the following:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char *sourceVideoPath = "video.mp4";
    char *text = "'text '\\\\\\\\\\\''quoted'\\\\\\\\\\\'' text'";
    char *destinationFileName = "with_text.mp4";
    char line[1000];
    sprintf(line, "ffmpeg -i \"%s\" -vf \"drawtext=fontfile=/path/to/fonts/font.ttf:text=%s:fontcolor=white:fontsize=28:borderw=2.8:x=(w-text_w)/2:y=(h-text_h)/2\" -codec:a copy \"%s\"", sourceVideoPath, text, destinationFileName);
    system(line);
}

I'm not joking :).
Tested with an actual video file.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文