IT story

Android의 FFmpeg

hot-time 2020. 5. 9. 09:19
반응형

Android의 FFmpeg


Android에서 FFmpeg 컴파일 (libffmpeg.so)을 받았습니다. 이제 RockPlayer와 같은 응용 프로그램을 구축하거나 기존 Android 멀티미디어 프레임 워크를 사용하여 FFmpeg를 호출해야합니다.

  1. Android / StageFright에서 FFmpeg 통합에 대한 단계 / 절차 / 코드 / 예가 있습니까?

  2. 이 라이브러리를 멀티미디어 재생에 어떻게 사용할 수 있는지 안내해 주시겠습니까?

  3. 나는 오디오 및 비디오 전송 스트림을 이미 가지고 있어야하며 FFmpeg에 피드하고 디코딩 / 렌더링해야합니다. IOMX API는 OMX 기반이며 여기에서 FFmpeg를 플러그인 할 수 없으므로 Android에서 어떻게 할 수 있습니까?

  4. 또한 재생에 사용해야하는 FFmpeg API에 대한 설명서를 찾을 수 없습니다.


ffmpeg가 Android에서 작동하게하는 단계는 다음과 같습니다.

  1. Android 용 ffmpeg의 정적 라이브러리를 빌드하십시오. 이는 Android Build System을 사용하여 olvaffe의 ffmpeg Android 포트 ( libffmpeg )를 빌드 함으로써 달성되었습니다 . 소스를 / external 및 makeaway 아래에두기 만하면 됩니다. ffmpeg 라이브러리가 의존하므로 Android 빌드에서 bionic (libc) 및 zlib (libz)를 추출해야합니다.
  2. Android NDK를 사용하여 ffmpeg 기능을 동적 라이브러리 래핑하십시오 . NDK로 작업하는 방법에 대한 많은 문서가 있습니다. 기본적으로 ffmpeg에서 필요한 기능을 라이브러리로 내보내려면 일부 C / C ++ 코드를 작성해야합니다. java는 JNI를 통해 상호 작용할 수 있습니다. NDK를 사용하면 1 단계에서 생성 한 정적 라이브러리에 쉽게 연결할 수 있습니다. Android.mk와 비슷한 줄을 추가하면됩니다.LOCAL_STATIC_LIBRARIES := libavcodec libavformat libavutil libc libz

  3. Java 소스에서 ffmpeg-wrapping 동적 라이브러리를 사용하십시오. JNI에 대한 문서가 충분하므로 괜찮을 것입니다.

재생는 FFmpeg를 사용에 관한 많은 예 (ffmpeg라는 바이너리 자체가 좋은 예이다)가 여기에 '기본 튜토리얼이야. 최상의 문서는 헤더에서 찾을 수 있습니다.

행운을 빕니다 :)


여러 가지 이유로, 멀티미디어는 효율성을 떨어 뜨리지 않고 작업을 수행하는 측면에서 쉽지 않았습니다. ffmpeg는 매일 그것을 개선하기위한 노력입니다. 다양한 형식의 코덱과 컨테이너를 지원합니다.

이제이 라이브러리를 사용하는 방법에 대한 질문에 대답 하기 위해 여기에 작성하는 것이 그렇게 간단하지 않다고 말하고 싶습니다. 그러나 나는 다음과 같은 방법으로 당신을 안내 할 수 있습니다 .

1) 소스 코드의 ffmpeg 디렉토리 안에 output_example.c 또는 api_example.c가 있습니다. 여기에서 인코딩 / 디코딩이 수행 된 코드를 볼 수 있습니다. ffmpeg 내부에서 호출해야하는 API에 대한 아이디어를 얻을 수 있습니다. 이것이 첫 번째 단계입니다.

2) 돌고래 플레이어는 안드로이드를위한 오픈 소스 프로젝트입니다. 현재 버그가 있지만 개발자는 지속적으로 노력하고 있습니다. 이 프로젝트에는 조사를 계속하는 데 사용할 수있는 전체 설정이 준비되어 있습니다. 다음은 code.google.com 에서 프로젝트에 대한 링크 이거나 터미널에서 " git clone https://code.google.com/p/dolphin-player/ " 명령을 실행하는 것 입니다. P와 P86이라는 두 개의 프로젝트를 볼 수 있습니다. 둘 중 하나를 사용할 수 있습니다.

내가 제공하고 싶은 추가 팁은 ffmpeg 코드를 빌드 할 때 build.sh 내부에서 사용하려는 형식의 muxers / demuxers / encoders / decoders를 활성화해야한다는 것입니다. 그렇지 않으면 해당 코드가 라이브러리에 포함되지 않습니다. 이것을 깨닫는 데 많은 시간이 걸렸습니다. 그래서 당신과 그것을 공유하는 것을 생각했습니다.

몇 가지 기본 사항 : 우리가 비디오 파일을 말할 때, 예 : avi는 오디오와 비디오의 조합입니다

비디오 파일 = 비디오 + 오디오


비디오 = 코덱 + Muxer + Demuxer

코덱 = 인코더 + 디코더

=> 비디오 = 인코더 + 디코더 + Muxer + Demuxer (Mpeg4 + Mpeg4 + avi + avi-avi 컨테이너의 예)


오디오 = 코덱 + Muxer + Demuxer

코덱 = 인코더 + 디코더

=> 오디오 = 인코더 + 디코더 + Muxer + Demuxer (mp2 + mp2 + avi + avi-avi 컨테이너의 예)


코덱 (이름은 en * co * der / * dec * oder의 조합에서 제외됨)은 프레임을 인코딩 / 디코딩하는 데 사용되는 알고리즘을 정의하는 형식의 일부일뿐입니다. AVI는 코덱이 아니며 Mpeg4의 비디오 코덱과 mp2의 오디오 코덱을 사용하는 컨테이너입니다.

Muxer / demuxer는 인코딩 / 디코딩하는 동안 사용되는 파일에서 프레임을 결합 / 분리하는 데 사용됩니다.

따라서 avi 형식을 사용하려면 비디오 구성 요소 + 오디오 구성 요소를 활성화해야합니다.

예를 들어, avi의 경우 다음을 활성화해야합니다. mpeg4 인코더, mpeg4 디코더, mp2 인코더, mp2 디코더, avi muxer, avi demuxer.

휴 wwwwww ...

프로그래밍 방식으로 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)

이 모든 일을 당신에게 더 혼란스럽게하지 않기를 바랍니다 ...

감사합니다. 도움이 필요하면 알려주십시오.


내가 찾은 가장 쉽고 사용하기 쉬운 구현은 theguardianproject 팀이 만듭니다 : https://github.com/guardianproject/android-ffmpeg


I've done a little project to configure and build X264 and FFMPEG using the Android NDK. The main thing that's missing is a decent JNI interface to make it accessible via Java, but that is the easy part (relatively). When I get round to making the JNI interface good for my own uses, I'll push that in.

The benefit over olvaffe's build system is that it doesn't require Android.mk files to build the libraries, it just uses the regular makefiles and the toolchain. This makes it much less likely to stop working when you pull new change from FFMPEG or X264.

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


After a lot of research, right now this is the most updated compiled library for Android that I found:

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

  • At this moment is using FFmpeg release n4.0-39-gda39990
  • Includes FFmpeg and FFProbe
  • Contains Java interface to launch the commands
  • FFprobe or FFmpeg could be removed from the APK, check the wiki https://github.com/bravobit/FFmpeg-Android/wiki

To make my FFMPEG application I used this project (https://github.com/hiteshsondhi88/ffmpeg-android-java) so, I don't have to compile anything. I think it's the easy way to use FFMPEG in our Android applications.

More info on http://hiteshsondhi88.github.io/ffmpeg-android-java/


Inspired by many other FFmpeg on Android implementations out there (mainly the guadianproject), I found a solution (with Lame support also).

(lame and FFmpeg: https://github.com/intervigilium/liblame and http://bambuser.com/opensource)

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

and to handle the console output:

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

Strange that this project hasn't been mentioned: AndroidFFmpeg from Appunite

It has quite detailed step-by-step instructions to copy/paste to command line, for lazy people like me ))


I had the same issue, I found most of the answers here out dated. I ended up writing a wrapper on FFMPEG to access from Android with a single line of code.

https://github.com/madhavanmalolan/ffmpegandroidlibrary

참고URL : https://stackoverflow.com/questions/4725773/ffmpeg-on-android

반응형