我目前正在C中编写一个视频转换守护进程。它使用execvp调用ffmpeg。
我创建了一个名为“ffmpeg_job”的结构,表示要完成的转换作业。我想为每个作业动态地为ffmpeg分配参数,这样我就可以在作业完成后释放其中一个结构及其参数列表。
我开始编写动态分配参数列表的函数,但我觉得我的方式非常天真。代码如下。
有更好的方法吗?
编辑:我现在在想,我将为每个级别的质量提供一个静态字符串列表,然后sprintf到它并将其转换为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 ==
.
.
.
答案 0 :(得分: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;
}