Android पर FFmpeg


207

मुझे एंड्रॉइड पर FFmpeg संकलित (libffmpeg.so) मिला है। अब मुझे या तो RockPlayer जैसे एप्लिकेशन का निर्माण करना होगा या FFmpeg को इनवॉइस करने के लिए मौजूदा एंड्रॉइड मल्टीमीडिया फ्रेमवर्क का उपयोग करना होगा।

  1. क्या आपके पास Android / StageFright पर FFmpeg को एकीकृत करने के लिए चरण / प्रक्रिया / कोड / उदाहरण हैं?

  2. क्या आप कृपया मुझे इस बारे में मार्गदर्शन दे सकते हैं कि मैं इस पुस्तकालय का उपयोग मल्टीमीडिया प्लेबैक के लिए कैसे कर सकता हूँ?

  3. मेरे पास एक आवश्यकता है जहां मेरे पास पहले से ही ऑडियो और वीडियो परिवहन धाराएं हैं, जिन्हें मुझे FFmpeg को खिलाने और इसे डीकोड / प्रदान करने की आवश्यकता है। मैं एंड्रॉइड पर यह कैसे कर सकता हूं, क्योंकि IOMX एपीआई ओएमएक्स आधारित हैं और यहां FFmpeg प्लग-इन नहीं कर सकते हैं?

  4. इसके अलावा मुझे FFmpeg API पर प्रलेखन नहीं मिला, जिसे प्लेबैक के लिए उपयोग करने की आवश्यकता है।


7
यह दिलचस्प है, मैं बहुत उत्सुक हूँ
Axarydax

5
आपने .so फ़ाइलों को प्राप्त करने के लिए ffmpeg को कैसे संकलित किया? क्या आप कृपया अपने द्वारा अनुसरण किए गए चरणों को साझा कर सकते हैं। मैं cygwin-1.7.9 और ndk r5 के साथ खिड़कियों पर काम कर रहा हूं। क्रिप्या मेरि सहायता करे।
स्वाती ईपी

यहाँ Android के लिए एक अपेक्षाकृत नया FFmpeg है: sourceforge.net/projects/ffmpeg4android
9

@ slhck मैंने उपरोक्त लिंक से ffmpeg कोड डाउनलोड किया है और इसे संकलित करने की कोशिश की है, लेकिन मैं .so फ़ाइलों को प्राप्त करने में सक्षम नहीं हूं। यह बहुत सारे मुद्दों को दिखाता है ..
RAJESH

कृपया मेरी मदद करें: stackoverflow.com/questions/14157030/… , मुझे नहीं पता कि इस समारोह में शामिल होना और भागना कहाँ है! .....
थर्रकनिर्मना

जवाबों:


109

Android पर काम करने के लिए ffmpeg प्राप्त करने के बारे में मैं यहां बता रहा हूं:

  1. Android के लिए ffmpeg की स्टैटिक लाइब्रेरी बनाएँ। यह एंड्रॉइड बिल्ड सिस्टम का उपयोग करके ओल्वाफ के एफएफएमपीए एंड्रॉइड पोर्ट ( लिबफएमपीपी ) का निर्माण करके प्राप्त किया गया था । बस स्रोतों को / बाहरी और दूर के नीचे रखें । आपको एंड्रॉइड बिल्ड से बायोनिक (libc) और zlib (libz) निकालने की आवश्यकता होगी, साथ ही ffmpeg लाइब्रेरी उन पर निर्भर करती है।make
  2. Android NDK का उपयोग करके ffmpeg कार्यक्षमता को लपेटकर एक गतिशील लाइब्रेरी बनाएं । NDK के साथ काम करने के तरीके के बारे में बहुत सारे दस्तावेज हैं। मूल रूप से आपको कुछ सी / सी + + कोड लिखने की आवश्यकता होगी, जिसे आप उस कार्यक्षमता से निर्यात करने के लिए कर सकते हैं, जिसकी आवश्यकता आपको ffmpeg में लाइब्रेरी java में JNI के माध्यम से इंटरैक्ट करने में है। NDK आपको स्टेप 1 में उत्पन्न होने वाले स्टैटिक लाइब्रेरी के खिलाफ आसानी से लिंक करने की अनुमति देता है, बस इसके लिए Android.mk के समान एक पंक्ति जोड़ें:LOCAL_STATIC_LIBRARIES := libavcodec libavformat libavutil libc libz

  3. अपने जावा स्रोतों से ffmpeg- रैपिंग डायनेमिक लाइब्रेरी का उपयोग करें। जेएनआई पर पर्याप्त दस्तावेज हैं, आपको ठीक होना चाहिए।

प्लेबैक के लिए ffmpeg का उपयोग करने के बारे में, कई उदाहरण हैं (ffmpeg बाइनरी ही एक अच्छा उदाहरण है), यहाँ एक बुनियादी ट्यूटोरियल है। सबसे अच्छा प्रलेखन हेडर में पाया जा सकता है।

सौभाग्य :)


7
Android के लिए ffmpeg बनाने के इस उत्तर के लिए कुछ लिंक दिए गए हैं। क्या यह अभी भी सबसे अच्छा समाधान है? Android बिल्ड सिस्टम लिंक टूट गया है - वह क्या माना जाता है? NDK के साथ निर्माण में सहायता के लिए टूलकिट का एक समूह है। हालांकि, वे सभी मेरे लिए विभिन्न बिल्ड त्रुटियों के साथ विफल हो जाते हैं, और थोड़ा पुराना लगता है। क्या कोई कारण है कि कोई सिर्फ एक निर्मित स्थिर ffmpeg lib पोस्ट नहीं कर सकता है?
रोब लौरेंस

7
अपने स्वयं के प्रश्न का उत्तर देने के लिए, मैंने इस रेपो को ffmpeg और JNI रैपर बनाने के लिए सबसे उपयोगी पाया - github.com/andynicholson/android-ffmpeg-x264
Rob Lourens

68

विभिन्न कारणों से, मल्टीमीडिया दक्षता के साथ समझौता किए बिना कार्य को प्राप्त करने के मामले में कभी भी आसान नहीं था। ffmpeg दिन-ब-दिन इसे बेहतर बनाने का प्रयास है। यह कोडेक्स और कंटेनरों के विभिन्न स्वरूपों का समर्थन करता है।

अब इस पुस्तकालय का उपयोग कैसे करें के प्रश्न का उत्तर देने के लिए , मैं कहूंगा कि इसे यहाँ लिखना इतना सरल नहीं है। लेकिन मैं निम्नलिखित तरीकों से आपका मार्गदर्शन कर सकता हूं ।

1) सोर्स कोड के ffmpeg डायरेक्टरी के अंदर, आपके पास output_example.c या api_example.c है । यहाँ, आप कोड देख सकते हैं जहाँ एन्कोडिंग / डिकोडिंग किया जाता है। आपको अंदाजा हो जाएगा कि आपको किस एपीआई के अंदर के ffmpeg को कॉल करना चाहिए। यह आपका पहला कदम होगा।

2) डॉल्फिन प्लेयर एंड्रॉइड के लिए एक ओपन सोर्स प्रोजेक्ट है। वर्तमान में इसमें बग हैं लेकिन डेवलपर लगातार काम कर रहे हैं। उस परियोजना में आपके पास पूरा सेटअप तैयार है जिसका उपयोग आप अपनी जांच जारी रखने के लिए कर सकते हैं। यहाँ के लिए एक लिंक है परियोजना code.google.com से या कमांड "चलाने Git क्लोन https://code.google.com/p/dolphin-player/ एक टर्मिनल में"। आप P और P86 नामक दो प्रोजेक्ट देख सकते हैं। आप दोनों में से किसी का भी उपयोग कर सकते हैं।

अतिरिक्त टिप मैं यह बताना चाहूंगा कि जब आप ffmpeg कोड का निर्माण कर रहे होते हैं, तो build.sh के अंदर आपको उन प्रारूपों के muxers / demuxers / encoders / decoders को सक्षम करने की आवश्यकता होती है जिनका आप उपयोग करना चाहते हैं। पुस्तकालयों में संबंधित कोड को शामिल नहीं किया जाएगा। मुझे इसे महसूस करने में बहुत समय लगा। इसलिए इसे आपसे साझा करने के बारे में सोचा।

कुछ मूल बातें: जब हम एक वीडियो फ़ाइल कहते हैं, तो पूर्व: एवी, यह ऑडियो और वीडियो दोनों का संयोजन है

वीडियो फ़ाइल = वीडियो + ऑडियो


वीडियो = कोडेक + मक्सर + डेमक्सर

कोडेक = एनकोडर + डिकोडर

=> वीडियो = एनकोडर + डिकोडर + Muxer + Demuxer (Mpeg4 + Mpeg4 + avi + avi - एवी कंटेनर के लिए उदाहरण)


ऑडियो = कोडेक + मक्सर + डिमॉक्सर

कोडेक = एनकोडर + डिकोडर

=> ऑडियो = एनकोडर + डिकोडर + Muxer + Demuxer (mp2 + mp2 + avi + avi - एवी कंटेनर के लिए उदाहरण)


Codec (नाम * en * co * der / * dec * oder के संयोजन से व्युत्पन्न है) प्रारूप का एक हिस्सा है जो एक फ्रेम को एन्कोड / डिकोड करने के लिए उपयोग किए जाने वाले एल्गोरिदम को परिभाषित करता है। AVI एक कोडेक नहीं है, यह एक कंटेनर है जो एमपीईजी 4 के वीडियो कोडेक और एमपी 2 के ऑडियो कोडेक का उपयोग करता है।

एन्कोडिंग / डिकोडिंग करते समय उपयोग की जाने वाली फ़ाइल से फ़्रेम को संयोजित / अलग करने के लिए Muxer / demuxer का उपयोग किया जाता है।

इसलिए यदि आप एवी प्रारूप का उपयोग करना चाहते हैं, तो आपको वीडियो घटकों + ऑडियो घटकों को सक्षम करने की आवश्यकता है।

पूर्व, avi के लिए, आपको निम्नलिखित को सक्षम करने की आवश्यकता है। mpeg4 एनकोडर, mpeg4 डिकोडर, mp2 एनकोडर, mp2 डिकोडर, avi muxer, avi बॉक्सर।

phewwwwwww ...

प्रोग्रामेटिक रूप से build.sh में निम्न कोड होना चाहिए:

--enable-muxer=avi --enable-demuxer=avi (Generic for both audio/video. generally Specific to a container)
--enable-encoder=mpeg4 --enable-decoder=mpeg4(For video support)
--enable-encoder=mp2 --enable-decoder=mp2 (For Audio support)

आशा है कि मैं आपको इस सब के बाद और अधिक भ्रमित नहीं करूँगा ...

धन्यवाद, किसी भी सहायता की जरूरत है, कृपया मुझे बताएं।


1
अरे, मैं आपको उस जानकारी के लिए बहुत धन्यवाद देना चाहता हूं, आपने वास्तव में मेरी बहुत मदद की है, क्या आपके लिए मेरी मदद करना संभव है अगर मुझे बाद में कुछ की आवश्यकता होगी? धन्यवाद!
मूलांक

क्या मैं आपको स्काइप / एमएसएन या किसी अन्य चैट प्लेटफॉर्म के माध्यम से कृपया जोड़ सकता हूं? मेरे पास इसके बारे में कुछ सवाल हैं, धन्यवाद।
मूलांक

2
ज़रूर..!! लेकिन मेरी ऑन-लाइन उपस्थिति थोड़ी कम है .. जब तक यह बहुत आवश्यक नहीं है मैं स्काइप में लॉग इन नहीं करता हूं। आप मुझे किसी भी महत्वपूर्ण काम के लिए मेल कर सकते हैं। ईमेल: mantykuma@gmail.com
mk ..

13

सबसे आसान निर्माण, कार्यान्वयन के लिए आसान है जिसे मैंने पाया है कि गार्जियनप्रोजेक्ट टीम द्वारा बनाया गया है: https://github.com/guardianproject/android-ffmpeg


निश्चित नहीं है, मैं अनुमान लगा रहा हूं कि यह है, नए आईओएस संस्करण में कुछ भी दिमाग में नहीं आता है जो इसे तोड़ सकता है। जब मैंने इसे पोस्ट किया, तब भी मेरे पास १०. or या १०.६
गाई-

क्या आप जानते हैं, मैं
जेएनआई

11

मैंने एंड्रॉइड NDK का उपयोग करके X264 को कॉन्फ़िगर करने और बनाने के लिए थोड़ा प्रोजेक्ट किया है। मुख्य बात यह है कि जावा के माध्यम से इसे सुलभ बनाने के लिए एक सभ्य जेएनआई इंटरफ़ेस है, लेकिन यह आसान हिस्सा (अपेक्षाकृत) है। जब मैं अपने स्वयं के उपयोग के लिए जेएनआई इंटरफ़ेस को अच्छा बनाने के लिए चक्कर लगाता हूं, तो मैं इसे धक्का दूंगा।

ऑल्वाफ़े की निर्माण प्रणाली पर लाभ यह है कि इसे पुस्तकालयों के निर्माण के लिए Android.mk फ़ाइलों की आवश्यकता नहीं है, यह सिर्फ नियमित मेकफाइल्स और टूलचिन का उपयोग करता है। जब आप FFMPEG या X264 से नए परिवर्तन को खींचते हैं तो यह काम करना बंद कर देता है।

https://github.com/halfninja/android-ffmpeg-x264


निक, आपका प्रोजेक्ट OS X 10.7 libx264.a (common.o) पर संकलित नहीं कर रहा है: फ़ंक्शन में x264_param_parse': common.c:(.text+0x2864): undefined reference to _DefaultRuneLocale 'collect2: ld ने 1 निकास स्थिति बना ली है: *** [x264] त्रुटि 1
यूरी सोलोविओव

9

बहुत शोध के बाद, अभी यह Android के लिए सबसे अपडेटेड संकलित पुस्तकालय है जो मुझे मिला:

https://github.com/bravobit/FFmpeg-Android

  • इस समय का उपयोग कर रहा है FFmpeg release n4.0-39-gda39990
  • FFmpeg और FFProbe शामिल हैं
  • कमांड लॉन्च करने के लिए जावा इंटरफ़ेस शामिल है
  • FFprobe या FFmpeg को एपीके से हटाया जा सकता है, विकी https://github.com/bravobit/FFmpeg-Android/wiki की जांच करें

6

अपने FFMPEG एप्लिकेशन को बनाने के लिए मैंने इस परियोजना ( https://github.com/hiteshsondhi88/ffmpeg-android-java ) का उपयोग किया , इसलिए मुझे कुछ भी संकलन करने की आवश्यकता नहीं है। मुझे लगता है कि यह हमारे Android अनुप्रयोगों में FFMPEG का उपयोग करने का आसान तरीका है।

Http://hiteshsondhi88.github.io/ffmpeg-android-java/ पर अधिक जानकारी


3
यह रैपर बहुत बहुत बहुत धीमा है। वीडियो के लिए 200 छवियों को 50-60 सेकंड लग रहे हैं। । । लेकिन आम तौर पर ffmpeg उस कार्य को 4-5 सेकंड में संभालता है।
आर्सेन सेन्च

यह परियोजना अब काम नहीं कर रही है। क्या आपके पास कुछ अन्य संसाधन हैं?
अजीत

@ArsenSench क्या आपके पास अन्य समाधान है?
आकाश दुबे

3

एंड्रॉइड कार्यान्वयन पर कई अन्य FFmpeg से प्रेरित होकर (मुख्य रूप से ग्वाडेनप्रोजेक्ट ), मुझे एक समाधान मिला (लंगड़ा समर्थन के साथ)।

(लंगड़ा और एफएफएमईजीपी: https://github.com/intervigilium/liblame और http://bambuser.com/news.in )

FFmpeg को कॉल करने के लिए:

new Thread(new Runnable() {

    @Override
    public void run() {

        Looper.prepare();

        FfmpegController ffmpeg = null;

        try {
            ffmpeg = new FfmpegController(context);
        } catch (IOException ioe) {
            Log.e(DEBUG_TAG, "Error loading ffmpeg. " + ioe.getMessage());
        }

        ShellDummy shell = new ShellDummy();
        String mp3BitRate = "192";

        try {
            ffmpeg.extractAudio(in, out, audio, mp3BitRate, shell);
        } catch (IOException e) {
            Log.e(DEBUG_TAG, "IOException running ffmpeg" + e.getMessage());
        } catch (InterruptedException e) {
            Log.e(DEBUG_TAG, "InterruptedException running ffmpeg" + e.getMessage());
        }

        Looper.loop();

    }

}).start();

और कंसोल आउटपुट को संभालने के लिए:

private class ShellDummy implements ShellCallback {

    @Override
    public void shellOut(String shellLine) {
        if (someCondition) {
            doSomething(shellLine);
        }
        Utils.logger("d", shellLine, DEBUG_TAG);
    }

    @Override
    public void processComplete(int exitValue) {
        if (exitValue == 0) {
            // Audio job OK, do your stuff: 

                            // i.e.             
                            // write id3 tags,
                            // calls the media scanner,
                            // etc.
        }
    }

    @Override
    public void processNotStartedCheck(boolean started) {
        if (!started) {
                            // Audio job error, as above.
        }
    }
}

अभिभावक के साथ आपका क्या अनुभव है?
XY

3

अजीब बात है कि इस परियोजना का उल्लेख नहीं किया गया है: Appunite से AndroidFFmpeg

मेरे जैसे आलसी लोगों के लिए कमांड लाइन पर कॉपी / पेस्ट करने के लिए इसमें काफी विस्तृत चरण-दर-चरण निर्देश हैं):)


3

मेरे पास एक ही मुद्दा था, मुझे यहां अधिकांश उत्तर दिनांकित मिले। मैंने कोड की एक पंक्ति के साथ Android से एक्सेस करने के लिए FFMPEG पर एक आवरण लिखना समाप्त कर दिया।

https://github.com/madhavanmalolan/ffmpegandroidlibrary


1
ऐसा लगता है कि आपने FFmpeg को v2.8.4 संकलित किया है, क्या FFmpeg को अपग्रेड करने की कोई योजना है? हम FFmpeg के नवीनतम (मई 3.2 या 3.4) संस्करण वाले Android समाधान की तलाश कर रहे हैं।
साप्पू

हाँ। मैं इसे 3.x github.com/madhavanmalolan/ffmpegandroidlibrary/milestone/1 पर ले जाने का इरादा रखता हूं। आप यहां बिल्ड स्क्रिप्ट को संशोधित करने का प्रयास कर सकते हैं और 3.4 github.com/madhavanmalalan/ffmpegandroidlibrary/wiki/… के
माधवन मलोलन

धन्यवाद @ मढ़वन मैं खिड़कियों पर ffmpeg लाइब्रेरी बना रहा हूं। बस सोच रहा था कि निर्माण के लिए github.com/madhavanmalolan/ffmpegandroidlibrary/wiki/… में सभी को क्या बदलना होगा ?
सप्पू

1

सबसे पहले, FFmpeg लाइब्रेरी की निर्भरता जोड़ें

implementation 'com.writingminds:FFmpegAndroid:0.3.2'

फिर गतिविधि में लोड करें

FFmpeg ffmpeg;
    private void trimVideo(ProgressDialog progressDialog) {

    outputAudioMux = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES).getAbsolutePath()
            + "/VidEffectsFilter" + "/" + new SimpleDateFormat("ddMMyyyy_HHmmss").format(new Date())
            + "filter_apply.mp4";

    if (startTrim.equals("")) {
        startTrim = "00:00:00";
    }

    if (endTrim.equals("")) {
        endTrim = timeTrim(player.getDuration());
    }

    String[] cmd = new String[]{"-ss", startTrim + ".00", "-t", endTrim + ".00", "-noaccurate_seek", "-i", videoPath, "-codec", "copy", "-avoid_negative_ts", "1", outputAudioMux};


    execFFmpegBinary1(cmd, progressDialog);
    }



    private void execFFmpegBinary1(final String[] command, ProgressDialog prpg) {

    ProgressDialog progressDialog = prpg;

    try {
        ffmpeg.execute(command, new ExecuteBinaryResponseHandler() {
            @Override
            public void onFailure(String s) {
                progressDialog.dismiss();
                Toast.makeText(PlayerTestActivity.this, "Fail to generate video", Toast.LENGTH_SHORT).show();
                Log.d(TAG, "FAILED with output : " + s);
            }

            @Override
            public void onSuccess(String s) {
                Log.d(TAG, "SUCCESS wgith output : " + s);

//                    pathVideo = outputAudioMux;
                String finalPath = outputAudioMux;
                videoPath = outputAudioMux;
                Toast.makeText(PlayerTestActivity.this, "Storage Path =" + finalPath, Toast.LENGTH_SHORT).show();

                Intent intent = new Intent(PlayerTestActivity.this, ShareVideoActivity.class);
                intent.putExtra("pathGPU", finalPath);
                startActivity(intent);
                finish();
                MediaScannerConnection.scanFile(PlayerTestActivity.this, new String[]{finalPath}, new String[]{"mp4"}, null);

            }

            @Override
            public void onProgress(String s) {
                Log.d(TAG, "Started gcommand : ffmpeg " + command);
                progressDialog.setMessage("Please Wait video triming...");
            }

            @Override
            public void onStart() {
                Log.d(TAG, "Startedf command : ffmpeg " + command);

            }

            @Override
            public void onFinish() {
                Log.d(TAG, "Finished f command : ffmpeg " + command);
                progressDialog.dismiss();
            }
        });
    } catch (FFmpegCommandAlreadyRunningException e) {
        // do nothing for now
    }
}

  private void loadFFMpegBinary() {
    try {
        if (ffmpeg == null) {
            ffmpeg = FFmpeg.getInstance(this);
        }
        ffmpeg.loadBinary(new LoadBinaryResponseHandler() {
            @Override
            public void onFailure() {
                showUnsupportedExceptionDialog();
            }

            @Override
            public void onSuccess() {
                Log.d("dd", "ffmpeg : correct Loaded");
            }
        });
    } catch (FFmpegNotSupportedException e) {
        showUnsupportedExceptionDialog();
    } catch (Exception e) {
        Log.d("dd", "EXception no controlada : " + e);
    }
}

private void showUnsupportedExceptionDialog() {
    new AlertDialog.Builder(this)
            .setIcon(android.R.drawable.ic_dialog_alert)
            .setTitle("Not Supported")
            .setMessage("Device Not Supported")
            .setCancelable(false)
            .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    finish();
                }
            })
            .create()
            .show();

}

इसके अलावा FFmpeg द्वारा एक अन्य सुविधा का उपयोग करें

===> merge audio to video
String[] cmd = new String[]{"-i", yourRealPath, "-i", arrayList.get(posmusic).getPath(), "-map", "1:a", "-map", "0:v", "-codec", "copy", "-shortest", outputcrop};


===> Flip vertical :
String[] cm = new String[]{"-i", yourRealPath, "-vf", "vflip", "-codec:v", "libx264", "-preset", "ultrafast", "-codec:a", "copy", outputcrop1};


===> Flip horizontally :  
String[] cm = new String[]{"-i", yourRealPath, "-vf", "hflip", "-codec:v", "libx264", "-preset", "ultrafast", "-codec:a", "copy", outputcrop1};


===> Rotate 90 degrees clockwise:
String[] cm=new String[]{"-i", yourRealPath, "-c", "copy", "-metadata:s:v:0", "rotate=90", outputcrop1};


===> Compress Video
String[] complexCommand = {"-y", "-i", yourRealPath, "-strict", "experimental", "-vcodec", "libx264", "-preset", "ultrafast", "-crf", "24", "-acodec", "aac", "-ar", "22050", "-ac", "2", "-b", "360k", "-s", "1280x720", outputcrop1};


===> Speed up down video
String[] complexCommand = {"-y", "-i", yourRealPath, "-filter_complex", "[0:v]setpts=2.0*PTS[v];[0:a]atempo=0.5[a]", "-map", "[v]", "-map", "[a]", "-b:v", "2097k", "-r", "60", "-vcodec", "mpeg4", outputcrop1};
String[] complexCommand = {"-y", "-i", yourRealPath, "-filter_complex", "[0:v]setpts=1.0*PTS[v];[0:a]atempo=1.0[a]", "-map", "[v]", "-map", "[a]", "-b:v", "2097k", "-r", "60", "-vcodec", "mpeg4", outputcrop1};
String[] complexCommand = {"-y", "-i", yourRealPath, "-filter_complex", "[0:v]setpts=0.75*PTS[v];[0:a]atempo=1.5[a]", "-map", "[v]", "-map", "[a]", "-b:v", "2097k", "-r", "60", "-vcodec", "mpeg4", outputcrop1};
String[] complexCommand = {"-y", "-i", yourRealPath, "-filter_complex", "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]", "-map", "[v]", "-map", "[a]", "-b:v", "2097k", "-r", "60", "-vcodec", "mpeg4", outputcrop1};



===> Add two mp3 files 

StringBuilder sb = new StringBuilder();
sb.append("-i ");
sb.append(textSngname);
sb.append(" -i ");
sb.append(mAudioFilename);
sb.append(" -filter_complex [0:0][1:0]concat=n=2:v=0:a=1[out] -map [out] ");
sb.append(finalfile);
---> ffmpeg.execute(sb.toString().split(" "), new ExecuteBinaryResponseHandler()




===> Add three mp3 files

StringBuilder sb = new StringBuilder();
sb.append("-i ");
sb.append(firstSngname);
sb.append(" -i ");
sb.append(textSngname);
sb.append(" -i ");
sb.append(mAudioFilename);
sb.append(" -filter_complex [0:0][1:0][2:0]concat=n=3:v=0:a=1[out] -map [out] ");
sb.append(finalfile);
---> ffmpeg.execute(sb.toString().split(" "), new ExecuteBinaryResponseHandler()
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.