我目前正在努力将变量置于“quoatation marks”中 我的代码如下所示:
const char* cmd = "ffmpeg -r 25 -f rawvideo -pix_fmt rgba -s 1280x720 -i - "
"-threads 0 -preset fast -y -pix_fmt yuv420p -crf 21 -vf vflip output.mp4";
现在我有两个名为“previewWidth”和“previewHeight”的int变量,我希望它们替换“1280x720”。 但我无法弄清楚如何做到这一点
谢谢,
马可
答案 0 :(得分:2)
std::string get_command(int previewWidth, int previewHeight) {
std::stringstream ss;
ss << "ffmpeg -r 25 -f rawvideo -pix_fmt rgba -s ";
ss << previewWidth << 'x' << previewHeight;
ss << "-i - -threads 0 -preset fast -y -pix_fmt yuv420p -crf 21 -vf vflip output.mp4";
return ss.str();
}
然后在使用时:
const std::string cmd = get_command(previewWidth, previewHeight);
并致电cmd.c_str()
以获取原始const char*
以传递给任何API。
请注意,这不是最快的解决方案,但您打算调用外部进程来进行音频文件操作(可能写入磁盘),因此stringstream
的相对较慢并不重要
stringstream
使得构建字符串非常容易,并且非常安全。与替代品相比,它相当缓慢,但简单和安全通常胜过速度。
高级技术:
在C ++ 11中,我有时会使用lambda:
const std::string cmd = [&]{
std::stringstream ss;
ss << "ffmpeg -r 25 -f rawvideo -pix_fmt rgba -s ";
ss << previewWidth << 'x' << previewHeight;
ss << "-i - -threads 0 -preset fast -y -pix_fmt yuv420p -crf 21 -vf vflip output.mp4";
ss.str();
}();
并在那里建立我的字符串,而不是创建帮助函数,如果我不认为这个任务应该有一个辅助函数。以上是创建跟踪消息等的有用技术,或者用于简单的&#34; scratch&#34;在将字符串构建操作重构为自己的函数之前工作。
答案 1 :(得分:0)
使用sprintf。
在你的情况下:
unsigned int previewWidth = /* init */;
unsigned int previewHeight = /* init */;
const char* raw_cmd = "ffmpeg -r 25 -f rawvideo -pix_fmt rgba -s %ux%u -i - "
"-threads 0 -preset fast -y -pix_fmt yuv420p -crf 21 -vf vflip output.mp4";
char result_cmd[256];
sprintf(result_cmd, raw_cmd, previewWidth, previewHeight);
现在,result_cmd
包含您的结果命令,但这两个%u
分别被previewWidth
和previewHeight
的值替换。
Null终结符由sprintf()
自动附加。
我认为还有一件事width
和height
不能为负。如果可以,请将%u
( u 已签名)替换为%d
( d ecimal)。
有关C(++)中许多打印功能可用的说明符的完整列表,请参阅this page。
答案 2 :(得分:-1)
int previewWidth, previewHeight;
// ...
char cmd[1024];
sprintf (cmd, "ffmpeg -r 25 -f rawvideo -pix_fmt rgba -s %dx%d -i - "
"-threads 0 -preset fast -y -pix_fmt yuv420p -crf 21 -vf vflip output.mp4",
previewWidth, previewHeight);
由于这是C ++,因此最好使用std::string
。