2013-03-04 151 views
1

我正在用C語言編寫視頻轉換守護進程。它使用execvp調用ffmpeg。動態生成ffmpeg參數列表C

我創建了一個名爲「ffmpeg_job」的結構體,它表示要完成的轉換作業。我想爲每個作業動態地分配參數給ffmpeg,以便在作業完成後我可以釋放這些結構中的一個和它的參數列表。

我開始編寫動態分配參數列表的函數,但我覺得我正在做的這種方式很幼稚。代碼如下。

有沒有更好的方法來做到這一點?

編輯:我現在在想,我將有參數的靜態字符串列表,每個質量水平,那麼sprintf的整合而且它strtok函數到一個char **

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 == 
      . 
      . 
      . 

回答

1

你提出的代碼似乎在功能上很好。關於當前代碼的一些意見

我假設您正在填充for循環內的所有奇數索引。因此,循環可能被優化爲for(i = 1; i < 20; i++)

在質量的情況下,我想你有像快速介質等。在當前的實現中一個預先固定的一組選項,你正在計算的存儲器分配的字符串長度。這可能會被替換爲數組查找,其中數組元素對應於已存儲名稱和大小的結構。例如,代碼可以像下面

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; 
} 
+0

定義結構數組我結束了我的想法去的printf-ING進入分配給每個一些巨大的字符串格式和質量的排列,然後標記它們。不過,我應該接受你認真對待的答案。 – OregonTrail 2013-03-06 05:00:45