[Android] FFmpeg على الروبوت


Answers

لأسباب متعددة ، كان تعدد الوسائط وسهل أبدا من حيث تحقيق المهمة دون المساومة على الكفاءة. ffmpeg هو جهد في تحسينه يومًا بعد يوم. وهو يدعم تنسيقات مختلفة من برامج الترميز والحاويات.

الآن للإجابة على السؤال عن كيفية استخدام هذه المكتبة ، أود أن أقول أنه ليس من البساطة أن تكتبها هنا. ولكن يمكنني أن أرشدك في الطرق التالية .

1) داخل دليل ffmpeg الخاص بكود المصدر ، لديك output_example.c أو api_example.c . هنا ، يمكنك رؤية الرمز الذي يتم فيه ترميز / فك التشفير. سوف تحصل على فكرة عن أي ffmpeg داخل API عليك الاتصال به. هذا سيكون خطوتك الأولى.

2) لاعب دولفين هو مشروع مفتوح المصدر للأندرويد. حاليا هو وجود الخلل ولكن المطورين يعملون بشكل مستمر. في هذا المشروع ، سيكون لديك إعداد كامل جاهز يمكنك استخدامه لمواصلة التحقيق. في ما يلي رابط project من code.google.com أو يمكنك تشغيل الأمر " git clone https://code.google.com/p/dolphin-player/ " في جهاز طرفي. يمكنك رؤية مشروعين يدعى P و P86. يمكنك استخدام أي منهما.

تلميح إضافي أود أن أقدمه هو أنه عندما تقوم ببناء كود ffmpeg ، داخل build.sh تحتاج إلى تمكين muxers / demuxers / encoders / decoders للتنسيقات التي تريد استخدامها. عدا ذلك ، لن يتم تضمين الرمز المقابل في المكتبات. استغرق الأمر مني الكثير من الوقت كي أدرك هذا. فكر في مشاركتها معك.

بعض الأساسيات: عندما نقول ملف فيديو ، مثل: avi ، فهو مزيج من كل من الصوت والفيديو

ملف الفيديو = فيديو + الصوت

فيديو = Codec + Muxer + Demuxer

الترميز = التشفير + فك الرموز

=> الفيديو = التشفير + فك + Muxer + Demuxer (Mpeg4 + Mpeg4 + avi + avi - مثال لحاوية avi)

الصوت = Codec + Muxer + Demuxer

الترميز = التشفير + فك الرموز

=> الصوت = التشفير + فك + Muxer + Demuxer (mp2 + mp2 + avi + avi - مثال لحاوية avi)

إن Codec (الاسم deriverd من مجموعة en * co * der / * dec * oder) هو جزء من التنسيق الذي يحدد الخوارزميات المستخدمة لتشفير وفك شفرة الإطار. AVI ليس برنامج ترميز ، بل هو حاوية تستخدم برنامج ترميز الفيديو من Mpeg4 وبرنامج ترميز الصوت من mp2.

يتم استخدام Muxer / demuxer لدمج / فصل الإطارات من ملف يستخدم أثناء الترميز / فك التشفير.

لذا إذا كنت تريد استخدام تنسيق avi ، فستحتاج إلى تمكين مكونات الفيديو + مكونات الصوت.

مثال ، بالنسبة إلى avi ، تحتاج إلى تمكين ما يلي. mpeg4 التشفير ، فك MPEG4 ، التشفير MP2 ، فك mp2 ، avi muxer ، avi demuxer.

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)

آمل أني لا أخلطك أكثر بعد كل هذا ...

شكرًا ، أي مساعدة مطلوبة ، يرجى إعلامي.

Question

لقد حصلت على FFmpeg جمعت (libffmpeg.so) على الروبوت. الآن لا بد لي من بناء إما تطبيق مثل RockPlayer أو استخدام إطار عمل الوسائط المتعددة الروبوت الحالية لاستدعاء FFmpeg.

  1. هل لديك خطوات / إجراءات / كود / مثال على دمج FFmpeg على Android / StageFright؟

  2. هل يمكنك إرشادك على كيف يمكنني استخدام هذه المكتبة لتشغيل الوسائط المتعددة؟

  3. لدي مطلب حيث لدي بالفعل تدفقات نقل الصوت والفيديو ، والتي أحتاج إلى إطعامها إلى FFmpeg والحصول عليها تم فك تشفيرها / تقديمها. كيف يمكنني القيام بذلك على Android ، نظرًا لأن واجهات برمجة تطبيقات IOMX تعتمد على OMX ولا يمكنها توصيل FFmpeg هنا؟

  4. أيضا لم أتمكن من العثور على وثائق على واجهات برمجة التطبيقات FFmpeg التي تحتاج إلى استخدامها للتشغيل.




لقد قمت بعمل مشروع صغير لتكوين وبناء X264 و FFMPEG باستخدام Android NDK. الشيء الرئيسي المفقود هو واجهة JNI لائقة لجعل الوصول إليها عبر جافا ، ولكن هذا هو الجزء السهل (نسبيا). عندما أحصل على جولة لجعل واجهة JNI جيدة للاستخدامات الخاصة بي ، سأدفع ذلك.

الفائدة على نظام البناء olvaffe هو أنه لا يتطلب ملفات Android.mk لبناء المكتبات ، فإنه يستخدم فقط makefiles العادية و toolchain. هذا يجعل الأمر أقل احتمالاً للتوقف عن العمل عند سحب تغيير جديد من FFMPEG أو X264.

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




مستوحاة من العديد من FFMPG الأخرى على تطبيقات الروبوت هناك (أساسا guadianproject ) ، وجدت حلا (مع دعم عرجاء أيضا).

(عرجاء و FFmpeg: https://github.com/intervigilium/liblame و http://bambuser.com/opensource )

للاتصال بـ 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.
        }
    }
}



واجهت نفس المشكلة ، وجدت أن معظم الإجابات هنا مؤرخة. انتهى بي الأمر كتابة غلاف على FFMPEG للوصول من Android مع سطر واحد من التعليمات البرمجية.

https://github.com/madhavanmalolan/ffmpegandroidlibrary