2010-03-08 28 views
33

मैं लिखने वाले प्रोग्राम में वीडियो रूपांतरण क्षमताओं को जोड़ना चाहता हूं। ऐसा करने के लिए FFmpeg का कमांड लाइन इंटरफ़ेस बस ffmpeg -i InputFile OutputFile है, लेकिन लाइब्रेरी के रूप में इसका उपयोग करने का कोई तरीका है, इसलिए मैं ffmpeg_convert(InputFile, OutputFile) जैसे कुछ कर सकता हूं?क्या एक स्टैंडअलोन प्रोग्राम की बजाय एफएफएमपीईजी लाइब्रेरी के रूप में इस्तेमाल किया जा सकता है?

मुझे आशा है कि मुझे सीधे libavcodec का उपयोग नहीं करना पड़ेगा, क्योंकि मुझे लगता है कि प्रारूपों के बीच परिवर्तित करने के लिए यह एक-पंक्ति फ़ंक्शन से कहीं अधिक जटिल होगा। अगर ऐसा करने के लिए एफएफएमपीईजी को आसानी से दोबारा नहीं बनाया जा सकता है, तो क्या शायद इसके बारे में कोई और लाइब्रेरी है? मैंने libvlc के बारे में सुना है, लेकिन ऐसा लगता है कि वीडियो एपीआई खेल रहा है, वीडियो रूपांतरण नहीं।

धन्यवाद।

+0

जिज्ञासा से बाहर, आप इसे डीएलएल के रूप में क्यों उपयोग करना पसंद करेंगे? Exec() इसे नुकसान का नुकसान क्या है? –

+0

मैं इसे एक अलग प्रक्रिया में नहीं चलाना चाहता, क्योंकि AFAIK में इसकी प्रगति की निगरानी करने या उसके पूरा होने पर कोई फ़ंक्शन चलाने की क्षमता नहीं होगी। –

+1

आईएमएचओ एक अलग प्रक्रिया में 'ffmpeg' चल रहा है बेहतर विचार है, इसलिए वीडियो एन्कोडिंग की लंबी प्रक्रिया के दौरान आपका एप्लिकेशन फंस नहीं जाएगा। –

उत्तर

19

आपको libavcodec और libavformat की आवश्यकता है।

4,1 वहाँ कैसे FFmpeg पुस्तकालयों, विशेष रूप से, libavcodec और libavformat उपयोग करने के लिए समझाते उदाहरण हैं: FAQ आपको बताता है?

हां। एफएफएमपीईजी दस्तावेज की डेवलपर्स गाइड पढ़ें। वैकल्पिक रूप से, कई ओपन सोर्स प्रोजेक्ट्स में से एक के लिए स्रोत कोड की जांच करें जो पहले से ही एफएफएमपीईजी (projects.html) में शामिल है।

FFmpeg प्रलेखन गाइड

ffmpeg.org/documentation.html में पाया जा सकता, Developer's guide भी शामिल है। मेरा सुझाव है कि libavformat/output-example.c या शायद ffmpeg कमांड लाइन उपयोगिता का स्रोत देखें।

+0

क्या यह एनाड्रॉइड लॉलीपॉप पर काम करता है? –

5

हां आपको libavcodec और libavformat का उपयोग करना होगा। मुझे लगता है कि आपको ffmplayg स्रोत कोड के अंदर ffplay.c के बारे में पढ़ना चाहिए। मुझे लगता है कि उस फ़ाइल से शुरू करना आपके लिए आसान होगा। वैसे भी मैंने उन लाइब्रेरी का उपयोग करके कुछ एप्लिकेशन बनाया है, इसे rtstegvideo.sourceforge.net पर देखें।

आशा इस मदद ...

22

अगर आप सिर्फ एक सिस्टम कॉल के बजाय समारोह के रूप में 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); 
} 
+14

इसे बदलने के बजाय, बस '-Dmain = ffmpeg' के साथ कंपाइलर को कॉल करें। –