[C] هل يمكن استخدام FFmpeg كمكتبة ، بدلاً من برنامج مستقل؟


Answers

تحتاج libavcodec و libavformat . الأسئلة الشائعة تخبرك:

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

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

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

Question

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

أنا على أمل أنني لن أستخدم libavcodec مباشرة ، كما أتصور أنه سيكون أكثر تعقيدًا بكثير من وظيفة سطر واحد للتحويل بين الصيغ. إذا كان FFmpeg لا يمكن تحديثه بسهولة للقيام بذلك ، فهل هناك ربما مكتبة أخرى تقوم على ذلك؟ لقد سمعت عن libvlc ، ولكن يبدو أن ذلك لا يعرض إلا واجهة برمجة تطبيقات لتشغيل الفيديو ، وليس تحويل الفيديو.

شكر.




نعم ، عليك استخدام libavcodec و libavformat. أعتقد أنك يجب أن تقرأ عن ffplay.c داخل ffmpeg شفرة المصدر. أعتقد أنه سيكون من الأسهل بالنسبة لك أن تبدأ بهذا الملف. على أي حال لقد قدمت بعض التطبيقات باستخدام تلك المكتبة ، تحقق من ذلك في rtstegvideo.sourceforge.net.

نأمل أن تكون هذه المساعدة...




إذا أردت فقط إجراء مكالمة إلى 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);
}