-1

現在、「引用符」内で変数を取得するのに苦労しています。
私のコードは次のようになります。

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」という名前の 2 つの int 変数を取得したので、「1280x720」を置き換えます。しかし、私はそれを行う方法を理解できません

ありがとう、
マルコ

4

3 に答える 3

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()て raw を取得し、const char*任意の API に渡します。

これは最速の解決策ではありませんが、外部プロセスを呼び出してオーディオ ファイル操作 (おそらくディスクへの書き込み) を実行しようとしているので、 の相対的な遅さはstringstreamあまり問題にならないことに注意してください。

stringstream文字列を構築するのが非常に簡単になり、非常に安全です。他の方法に比べてかなり遅いですが、使いやすさと安全性がスピードよりも優先されることがよくあります。


高度なテクニック:

C++11 では、ラムダを使用することがあります。

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();
}();

このタスクがヘルパー関数に値しないと思われる場合は、ヘルパー関数を作成するのではなく、そこで文字列を構築します。上記は、トレース メッセージなどを作成したり、文字列構築操作を独自の関数にリファクタリングする前の単純な「スクラッチ」作業に役立つ手法です。

于 2015-03-26T20:41:42.207 に答える
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結果コマンドが含まれていますが、これら 2 つはそれぞれと%uの値に置き換えられています。previewWidthpreviewHeight

Null ターミネータは によって自動的に追加されsprintf()ます。

もう 1 つ、私が想定していたのは、とが負になることはwidthあり得ないということです。height可能であれば、( unsigned) を ( decimal )%u置き換えます。%d

C(++) の多くの印刷関数で使用できる指定子の完全なリストについては、このページを参照してください。

于 2015-03-26T20:39:12.223 に答える
-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

于 2015-03-26T20:37:51.137 に答える