অ্যান্ড্রয়েড এফএফপিপিগ


207

আমি অ্যান্ড্রয়েড এ FFmpeg সংকলিত (libffmpeg.so) পেয়েছি। এখন আমাকে রকপ্লেয়ারের মতো একটি অ্যাপ্লিকেশন তৈরি করতে হবে বা এফএফপিপেকে অনুরোধ করার জন্য বিদ্যমান অ্যান্ড্রয়েড মাল্টিমিডিয়া কাঠামো ব্যবহার করতে হবে।

  1. অ্যান্ড্রয়েড / স্টেজফ্রাইটে এফএফপিপেগ সংহত করার বিষয়ে আপনার কী পদক্ষেপ / পদ্ধতি / কোড / উদাহরণ রয়েছে?

  2. আপনি কীভাবে আমাকে এই লাইব্রেরিটি মাল্টিমিডিয়া প্লেব্যাকের জন্য ব্যবহার করতে পারেন দয়া করে আমাকে গাইড করতে পারেন?

  3. আমার একটি আবশ্যকতা রয়েছে যেখানে আমার ইতিমধ্যে অডিও এবং ভিডিও পরিবহন স্ট্রিম রয়েছে, যা আমার এফএফম্পেগকে খাওয়ানো এবং এটি ডিকোড করা / রেন্ডার করা দরকার। আমি কীভাবে অ্যান্ড্রয়েডে এটি করতে পারি, যেহেতু আইওএমএক্স এপিআইগুলি ওএমএক্স ভিত্তিক এবং এখানে এফএফএমপিগ প্লাগ-ইন করতে পারে না?

  4. এছাড়াও আমি এফএফপিপিগ এপিআইগুলিতে ডকুমেন্টেশন খুঁজে পাইনি যা প্লেব্যাকের জন্য ব্যবহার করা দরকার।


7
এটি আকর্ষণীয়, আমিও কৌতূহলী
এক্সারড্যাক্স

5
আপনি কীভাবে .so ফাইলগুলি পেতে ffmpeg সংকলন করেছিলেন? আপনি দয়া করে আপনার অনুসরণ করা পদক্ষেপগুলি ভাগ করতে পারেন আমি সাইগউইন -১. ..৯ এবং এনডিকে আর ৫ দিয়ে উইন্ডোতে কাজ করছি। আমাকে সাহায্য করুন.
স্বার্থী ইপি

: এখানে Android এর জন্য একটি অপেক্ষাকৃত নতুন FFmpeg এর sourceforge.net/projects/ffmpeg4android
slhck

@ এসএলএইচএইচসি আমি উপরের লিঙ্কটি থেকে এফএফপিইপ কোডটি ডাউনলোড করেছি এবং এটি সংকলনের চেষ্টা করেছি কিন্তু আমি .so ফাইলগুলি পেতে সক্ষম নই। এটি প্রচুর ইস্যু দেখায় ..
রাজেশ

দয়া করে আমাকে এটিকে সহায়তা করুন: stackoverflow.com/questions/14157030/… , আমি জানি না এই ফাংশনটি কোথায় অন্তর্ভুক্ত করতে হবে এবং চালাতে হবে! .....
থারাকা নির্মাতা

উত্তর:


109

অ্যান্ড্রয়েডে কাজ করতে ffmpeg পাওয়ার জন্য আমি যে পদক্ষেপগুলি দিয়েছি সেগুলি এখানে:

  1. অ্যান্ড্রয়েডের জন্য ffmpeg এর স্ট্যাটিক লাইব্রেরি তৈরি করুন। অ্যান্ড্রয়েড বিল্ড সিস্টেম ব্যবহার করে অলভ্যাফের এফএফপিপে অ্যান্ড্রয়েড পোর্ট ( লিবফম্পেগ ) তৈরি করে এটি অর্জন করা হয়েছিল । উত্সগুলি কেবল বাহ্যিক / বহিরাগত এবং makeদূরে রাখুন। আপনার এন্ড্রয়েড বিল্ড থেকে বায়োনিক (libc) এবং zlib (libz) এক্সট্র্যাক্ট করতে হবে, কারণ ffmpeg গ্রন্থাগারগুলি তাদের উপর নির্ভর করে।
  2. অ্যান্ড্রয়েড এনডিকে ব্যবহার করে ffmpeg কার্যকারিতা মোড়ানো একটি গতিশীল লাইব্রেরি তৈরি করুন । এনডিকে নিয়ে কীভাবে কাজ করা যায় সে সম্পর্কে প্রচুর ডকুমেন্টেশন রয়েছে। মূলত আপনাকে ffmpeg এর বাইরে যে লাইব্রেরিতে জাভা জেএনআইয়ের মাধ্যমে যোগাযোগ করতে পারে তার কার্যকারিতা রফতানি করতে আপনাকে কিছু সি / সি ++ কোড লিখতে হবে। এনডিকে আপনাকে পদক্ষেপ ১ এ উত্পন্ন স্ট্যাটিক লাইব্রেরিগুলির সাথে সহজেই লিঙ্ক করতে দেয়, কেবল এন্ড্রয়েড.এমকে এর অনুরূপ একটি লাইন যুক্ত করুন:LOCAL_STATIC_LIBRARIES := libavcodec libavformat libavutil libc libz

  3. আপনার জাভা উত্স থেকে ffmpeg- মোড়ক গতিশীল লাইব্রেরি ব্যবহার করুন। জেএনআই-তে যথেষ্ট ডকুমেন্টেশন রয়েছে, আপনার ভাল হওয়া উচিত।

প্লেব্যাকের জন্য ffmpeg ব্যবহার সম্পর্কে, এখানে অনেকগুলি উদাহরণ রয়েছে (ffmpeg বাইনারি নিজেই একটি ভাল উদাহরণ), এখানে একটি প্রাথমিক টিউটোরিয়াল। শিরোনামে সেরা ডকুমেন্টেশন পাওয়া যাবে।

শুভকামনা :)


7
অ্যান্ড্রয়েডের জন্য ffmpeg তৈরির জন্য এই উত্তরের বেশ কয়েকটি লিঙ্ক রয়েছে। এটি কি এখনও সেরা সমাধান? অ্যান্ড্রয়েড বিল্ড সিস্টেমের লিঙ্কটি ভেঙে গেছে - এটি কী হওয়ার কথা? এনডিকে দিয়ে বিল্ডিংয়ে সহায়তা করার জন্য একটি গুচ্ছ সরঞ্জামাদি রয়েছে its তবে এগুলি সমস্তই আমার জন্য বিল্ড ত্রুটির সাথে ব্যর্থ হয় এবং কিছুটা পুরানো বলে মনে হয়। কেউ কি কেবল একটি বিল্ট স্ট্যাটিক ffmpeg lib পোস্ট করতে না পারে তার কোনও কারণ আছে?
রব লরেন্স

7
আমার নিজের প্রশ্নের জবাব দিতে, আমি এই রেপোটি এফএফএমপিগ
রব

68

বিভিন্ন কারণে, দক্ষতার সাথে কোনও আপস না করেই এই কাজটি অর্জনের ক্ষেত্রে মাল্টিমিডিয়া কখনই সহজ ছিল না। ffmpeg এটি দিনে দিনে উন্নতি করার একটি প্রচেষ্টা effort এটি কোডেক এবং পাত্রে বিভিন্ন ফর্ম্যাট সমর্থন করে।

এখন এই লাইব্রেরিটি কীভাবে ব্যবহার করবেন সেই প্রশ্নের উত্তর দিতে আমি বলব যে এটি এখানে লেখা এত সহজ নয়। তবে আমি আপনাকে নিম্নলিখিত উপায়ে গাইড করতে পারি ।

1) উত্স কোডের ffmpeg ডিরেক্টরিতে, আপনার আউটপুট_সাম্পল সি বা api_example.c রয়েছে । এখানে, আপনি কোডটি দেখতে পারেন যেখানে এনকোডিং / ডিকোডিং সম্পন্ন হয়েছে। কোন এপিআই-এর ভিতরে ffmpeg কল করা উচিত সে সম্পর্কে আপনি একটি ধারণা পাবেন। এটি আপনার প্রথম পদক্ষেপ হবে।

2) ডলফিন প্লেয়ার অ্যান্ড্রয়েডের জন্য একটি ওপেন সোর্স প্রকল্প। বর্তমানে এটিতে বাগ রয়েছে তবে বিকাশকারীরা ধারাবাহিকভাবে কাজ করছেন। এই প্রকল্পে আপনার পুরো সেটআপ প্রস্তুত রয়েছে যা আপনি আপনার তদন্ত চালিয়ে যেতে ব্যবহার করতে পারেন। এখানে কোড. google.com.com থেকে প্রকল্পের একটি লিঙ্ক রয়েছে বা একটি টার্মিনালে " গিট ক্লোন https://code.google.com/p/dolphin-player/ " কমান্ডটি চালান run আপনি পি এবং পি 86 নামে দুটি প্রকল্প দেখতে পাচ্ছেন। আপনি এগুলির দুটি ব্যবহার করতে পারেন।

অতিরিক্ত টিপ আমি দিতে চাই যে আপনি যখন ffmpeg কোডটি তৈরি করছেন তখন বিল্ড.শ এর অভ্যন্তরে আপনি যে ফর্ম্যাটগুলি ব্যবহার করতে চান তার ম্যাক্সার / ডেমুসার / এনকোডার / ডিকোডার সক্ষম করতে হবে। অন্যটি সম্পর্কিত কোডটি লাইব্রেরিতে অন্তর্ভুক্ত করা হবে না। এটি উপলব্ধি করতে আমার অনেক সময় লেগেছে। তাই আপনার সাথে ভাগ করে নেওয়ার কথা ভেবেছি।

কয়েকটি বুনিয়াদি: যখন আমরা একটি ভিডিও ফাইল বলি, যেমন: আভি, এটি অডিও এবং ভিডিও উভয়ের সমন্বয়

ভিডিও ফাইল = ভিডিও + অডিও


ভিডিও = কোডেক + মুক্সার + ডেমাক্সার

কোডেক = এনকোডার + ডিকোডার

=> ভিডিও = এনকোডার + ডিকোডার + মুক্সার + ডেমোক্সার (এমপেইজি 4 + এমপিজ 4 + এভিআই + এভিআই - এভির ধারকটির উদাহরণ)


অডিও = কোডেক + মুক্সার + ডেমাক্সার

কোডেক = এনকোডার + ডিকোডার

=> অডিও = এনকোডার + ডিকোডার + মুক্সার + ডেমোক্সার (এমপি 2 + এমপি 2 + এভিআই + এভিআই - এভিআই ধারকটির উদাহরণ)


কোডেক (নামটি এন * কো * ডের / * ডেসি * ওডার সংমিশ্রণে ডাইভার্ভারড) কেবলমাত্র ফর্ম্যাটর একটি অংশ যা কোনও ফ্রেমকে এনকোড / ডিকোড করতে ব্যবহৃত অ্যালগরিদমগুলি সংজ্ঞায়িত করে। এভিআই কোনও কোডেক নয়, এটি একটি ধারক যা এমপিজ 4 এর ভিডিও কোডেক এবং এমপি 2-এর অডিও কোডেক ব্যবহার করে।

এনকোডিং / ডিকোডিংয়ের সময় ব্যবহৃত ফাইল থেকে ফ্রেমগুলি একত্রিত / পৃথক করতে Muxer / demuxer ব্যবহার করা হয়।

সুতরাং আপনি যদি এভিআই ফর্ম্যাটটি ব্যবহার করতে চান তবে আপনাকে ভিডিও উপাদানগুলি + অডিও উপাদানগুলি সক্ষম করতে হবে।

প্রাক্তন, এভির জন্য, আপনাকে নিম্নলিখিতগুলি সক্ষম করতে হবে। এমপিইজি 4 এনকোডার, এমপিইজি 4 ডিকোডার, এমপি 2 এনকোডার, এমপি 2 ডিকোডার, এভিআই ম্যাক্সার, এভি ডিমাক্সার।

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
এম কে ..

13

বিল্ডিংয়ে সবচেয়ে সহজ, ব্যবহারের সহজ ব্যবহার আমি খুঁজে পেয়েছি গুগার্ডিয়ানপ্রজেক্ট টিম: https://github.com/guardianproject/android-ffmpeg


নিশ্চিত নয়, আমি অনুমান করছি যে এটি হ'ল, নতুন আইওএস সংস্করণে এমন কিছু মনে আসে না যা এটিকে ভেঙে দিতে পারে। আমি যখন এটি পোস্ট করেছি, তখনও আমার 10.7 বা 10.6 ছিল
গাই

আপনি কি জানেন, আমি
জেএনআই

11

আমি অ্যান্ড্রয়েড এনডিকে ব্যবহার করে এক্স 264 এবং এফএফএমপিইগ কনফিগার করতে এবং তৈরি করতে একটি ছোট প্রকল্প করেছি project প্রধান জিনিসটি যা অনুপস্থিত তা হ'ল জাভা মাধ্যমে এটি অ্যাক্সেসযোগ্য করার জন্য একটি শালীন জেএনআই ইন্টারফেস, তবে এটি সহজ অংশ (তুলনামূলকভাবে)। আমি যখন নিজের ব্যবহারের জন্য জেএনআই ইন্টারফেসটি ভাল করে তুলব তখন আমি এটিকে এগিয়ে দেব।

অলভ্যাফের বিল্ড সিস্টেমের সুবিধাটি হ'ল লাইব্রেরিগুলি তৈরি করতে Android.mk ফাইলের প্রয়োজন হয় না, এটি কেবল নিয়মিত মেকফাইলস এবং টুলচেন ব্যবহার করে। আপনি যখন এফএফএমপিইগ বা এক্স 264 থেকে নতুন পরিবর্তন আনেন তখন কাজ করা বন্ধ করে দেওয়ার সম্ভাবনা অনেক কম করে।

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


নিক, আপনার প্রকল্পটি ওএস এক্স 10.7 libx264.a (সাধারণ.o) তে সংকলন করছে না: ফাংশনে x264_param_parse': common.c:(.text+0x2864): undefined reference to _ DefaultRuneLocale 'সংগ্রহ 2: এলডি 1 প্রস্থান স্থিতি ফিরিয়ে দিয়েছে: *** [x264] ত্রুটি 1
ইউরি সলোভিভ

9

অনেক গবেষণার পরে, এখনই এটি অ্যান্ড্রয়েডের জন্য সর্বাধিক আপডেট করা সংকলিত গ্রন্থাগার যা আমি পেয়েছি:

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

  • এই মুহুর্তে ব্যবহার করা হয় FFmpeg release n4.0-39-gda39990
  • এফএফম্পেগ এবং এফএফপ্রোব অন্তর্ভুক্ত করে
  • কমান্ডগুলি চালু করতে জাভা ইন্টারফেস ধারণ করে
  • এফএফপ্রোবে বা এফএফপিজেগ এপিপি থেকে সরানো যেতে পারে, উইকিটি https://github.com/bravobit/FFmpeg-Android/wiki দেখুন

6

আমার এফএফএমপিইগ অ্যাপ্লিকেশনটি তৈরি করতে আমি এই প্রকল্পটি ব্যবহার করেছি ( https://github.com/hiteshsondhi88/ffmpeg-android-java ) সুতরাং, আমাকে কিছু সংকলন করতে হবে না। আমি মনে করি এটি আমাদের Android অ্যাপ্লিকেশনগুলিতে FFMPEG ব্যবহারের সহজ উপায় to

Http://hiteshsondhi88.github.io/ffmpeg-android-java/- এ আরও তথ্য


3
এই মোড়ক খুব খুব খুব খুব ধীর। ভিডিওতে 200 টি ছবি 50-60 সেকেন্ড সময় নিচ্ছে। । । তবে সাধারণত ffmpeg 4-5 সেকেন্ডের মধ্যে সেই কাজটি পরিচালনা করে।
আর্সেন সেনচ

এই প্রকল্পটি আর কাজ করছে না। আপনার কি অন্য কিছু সংস্থান আছে?
অজিত

@ আরসেনসেন্ট আপনার কাছে কি অন্য সমাধান আছে?
আকাশ দুবে

3

অ্যান্ড্রয়েড বাস্তবায়নের জন্য আরও অনেকগুলি এফএফপিপেগ দ্বারা অনুপ্রাণিত হয়ে (মূলত গুডিয়ানপ্রজেক্ট ), আমি একটি সমাধান পেয়েছি ( ল্যাম্প সাপোর্ট সহ)।

(পঙ্গু এবং এফএফম্পেগ: https://github.com/intervigilium/liblame এবং http://bambuser.com/opensource )

এফএফপিপেকে ফোন করতে:

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.
        }
    }
}

অভিভাবক প্রজেক্ট নিয়ে আপনার অভিজ্ঞতা কী?
এক্সওয়াই


3

আমার একই সমস্যা ছিল, আমি বেশিরভাগ উত্তর এখানে তারিখ পেয়েছিলাম। আমি একক লাইন কোডের সাথে অ্যান্ড্রয়েড থেকে অ্যাক্সেস পেতে এফএফএমপিইজে একটি মোড়ক লিখে শেষ করেছি।

https://github.com/madhavanmalolan/ffmpegandroidlibrary


1
মনে হচ্ছে আপনি এফএফপিপিগ ভিপি ৮.২.৪ সংকলন করেছেন, এফএফএমপিগ আপগ্রেড করার কোনও পরিকল্পনা আছে কি? আমরা FFmpeg এর সর্বশেষ (3.2 বা 3.4 হতে) সংস্করণটি সহ অ্যান্ড্রয়েড সমাধান খুঁজছি।
সাপ্পু

হ্যাঁ. আমি এটিকে 3.x গিথুব / মধভানমালোলান / ফম্পেগান্ড্রয়েডলিবেরি / মাইলস্টোন / 1 এ স্থানান্তরিত করতে চাইছি আপনি এখানে বিল্ড স্ক্রিপ্টটি সংশোধন করতে এবং 3.4 গিথুব
মাধবন

ধন্যবাদ @ মাধওয়ান। আমি উইন্ডোতে ffmpeg লাইব্রেরি তৈরি করছি। শুধু ভাবছেন যে গিথুব / মধওয়ানমালোলান / এফএমপিগেন্ড্রয়েডলাইবারি / উইকি / কে কী কী তৈরি করতে হবে তার সবগুলি পরিবর্তন করা দরকার ?
সাপ্পু

0

প্রথমে, এফএফম্পেগ লাইব্রেরির নির্ভরতা যুক্ত করুন

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();

}

এফএফম্পেগের অন্য একটি বৈশিষ্ট্যও ব্যবহার করুন

===> 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()
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.