1

私は現在Cでビデオ変換デーモンを書いています。それはexecvpを使用してffmpegを呼び出します。

完了する変換ジョブを表す「ffmpeg_job」という構造体を作成しました。ジョブごとに引数をffmpegに動的に割り当てて、ジョブの完了後にこれらの構造体の1つとその引数のリストを解放できるようにします。

引数のリストを動的に割り当てる関数を書き始めましたが、それについてのやり方はかなり素朴な気がします。コードは以下のとおりです。

これを行うためのより良い方法はありますか?

編集:私は今、品質の各レベルの引数の静的な文字列リストを持っていると思っています、そしてそれをsprintfしてcharにstrtokします**

char ** generate_arguments(
    char *filepath,
    ph5v_format format,
    ph5v_quality quality)
{
    char ** arguments;
    if (format == ph5v_MP4) {
        mp4_arguments = {
            "-i", "%%INPUT FILEPATH 1",
            "-vcodec", "libx264",
            "-preset", "%%X264 PRESET 5",
            "-b:v", "%%VIDEO BITRATE 7",
            "-strict", "-2",
            "-acodec", "aac",
            "-b:a", "%%AUDIO BITRATE 13",
            "-ar", "%%AUDIO SAMPLERATE 15",
            "-ac", "2",
            "-y", "%%OUTPUT FILEPATH 19"
        }

        arguments = malloc(sizeof(char*) * 20);

        int i;
        for (i = 0; i < 20; i++) {
            if (i == 1) {
                char *argument = malloc(strlen(filepath) + 1);
                strcpy(argument, filepath);
                arguments[1] = argument;
            } else if (i == 5) {
                if (quality == ph5v_LOW || quality == ph5v_MEDIUM) {
                    char *argument = malloc(strlen("fast") + 1);
                    strcpy(argument, "fast");
                    arguments[5] = argument;
                } else if (quality == ph5v_HIGH || quality == ph5v_ULTRA ) {
                    char *argument = malloc(strlen("medium") + 1);
                    strcpy(argument, "medium");
                    arguments[5] = argument;
                }
            } else if (i == 7) {
                if (quality ==
            .
            .
            .
4

1 に答える 1

1

提案されたコードは機能的には問題ないようです。現在のコードに関するいくつかの所見

forループ内のすべての奇数インデックスにデータを入力していると仮定します。したがって、ループは潜在的にとして最適化される可能性がありますfor(i = 1; i < 20; i++)

品質の場合、fastmediumなどの事前に固定されたオプションのセットがあると思います。現在の実装では、メモリの割り当てのために文字列の長さを計算しています。これは、配列ルックアップに置き換えることができます。配列要素は、名前とサイズが既に格納されている構造に対応します。たとえば、コードは次のようになります

if (quality == ph5v_LOW || quality == ph5v_MEDIUM) 
    index = 0;

argument = malloc(sizeof(quality_array[index].size + 1));
strcpy(argument, quality_array[index].strname);

ここで、quality_arrayは以下に定義されている構造の配列です

 typedef struct qual_param {
      int size;
      char *strnamne;
 }
于 2013-03-05T00:43:07.613 に答える