هل يمكن استخدام FFMPEG كمكتبة، بدلا من برنامج مستقل؟

StackOverflow https://stackoverflow.com/questions/2401764

سؤال

أود إضافة قدرات تحويل الفيديو إلى برنامج أكتب إليه. واجهة سطر الأوامر FFMPEG للقيام بذلك ببساطة ffmpeg -i InputFile OutputFile, ، ولكن هل هناك طريقة للاستفادة منها كمكتبة، لذلك يمكنني أن أفعل شيئا مثل ffmpeg_convert(InputFile, OutputFile)?

آمل ألا أضطر إلى استخدام Libavcodec مباشرة، كما أتصور أنه سيكون أكثر تعقيدا بكثير من وظيفة سطر واحد للتحويل بين التنسيقات. إذا كان لا يمكن تعويض FFMPEG بسهولة القيام بذلك، فهل هناك مكتبة أخرى تعتمد عليها ذلك؟ لقد سمعت من libvlc، ولكن يبدو أن هذا فقط فضح الفيديو تلعب API، وليس تحويل الفيديو.

شكرا.

هل كانت مفيدة؟

المحلول

انت تحتاج libavcodec و libavformat. وبعد ال التعليمات اخبرك:

4.1 هل هناك أمثلة توضح كيفية استخدام مكتبات FFMPEG، وخاصة libavcodec و libavformat؟

نعم. اقرأ دليل المطورين وثائق FFMPEG. بدلا من ذلك، فحص التعليمات البرمجية المصدر لأحد المشاريع العديدة المصدر المفتوحة التي تتضمن بالفعل ffmpeg في (projects.html.).

يمكن العثور على دليل وثائق FFMPEG في ffmpeg.org/documentation.html., ، بما في ذلك دليل المطور. وبعد أقترح النظر في libavformat/output-example.c أو ربما مصدر ffmpeg فائدة سطر الأوامر نفسها.

نصائح أخرى

إذا كنت ترغب فقط في إجراء مكالمة إلى FFMPEG كدالة بدلا من مكالمة نظام، فيمكنك القيام بذلك بسهولة كبيرة.

في ffmpeg.c، تغيير:

int main(int argc, char **argv) to int ffmpeg((int argc, char **argv)

ثم في مكالمتك وظيفة FFMPEG وتمرير في صفيف يحاكي سطر الأوامر. لجعلها أسهل استخدام وظيفة لإنشاء المتغيرات Argc، Argv المتغيرات.

static int setargs(char *args, char **argv)
{
    int count = 0;

    while (isspace(*args)) ++args;
    while (*args) {
        if (argv) argv[count] = args;
        while (*args && !isspace(*args)) ++args;
        if (argv && *args) *args++ = '\0';
        while (isspace(*args)) ++args;
        count++;
    }
}

char **parsedargs(char *args, int *argc)
{
    char **argv = NULL;
    int    argn = 0;

    if (args && *args
        && (args = strdup(args))
        && (argn = setargs(args,NULL))
        && (argv = malloc((argn+1) * sizeof(char *)))) {
          *argv++ = args;
          argn = setargs(args,argv);
    }

    if (args && !argv) free(args);

    *argc = argn;
    return argv;
}

void freeparsedargs(char **argv)
{
    if (argv) {
        free(argv[-1]);
        free(argv-1);
    }
}
    return count;
}

int main()
{
    char **argv;
    char *cmd;
    int argc;

    cmd = "ffmpeg -i infile outfile";
    argv = parsedargs(cmd,&argc);
    ffmpeg(argc, argv);
}

نعم عليك استخدام libavcodec و libavformat. أعتقد أنه يجب عليك قراءة حول FFPlay.c داخل شفرة المصدر FFMPEG. أعتقد أنه سيكون من الأسهل بالنسبة لك أن تبدأ بهذا الملف.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top