1

我目前正在用 C 编写一个视频转换守护程序。它使用 execvp 调用 ffmpeg。

我创建了一个名为“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 ==
            .
            .
            .
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 回答