191

나는 안드로이드에서 컴파일 된 FFmpeg (libffmpeg.so)를 가지고있다. 이제는 RockPlayer와 같은 애플리케이션을 구축하거나 FFmpeg를 호출하기 위해 기존 Android 멀티미디어 프레임 워크를 사용해야합니다.

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

  2. 멀티미디어 재생을 위해이 라이브러리를 어떻게 사용할 수 있습니까?

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

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


  • 이것은 흥미 롭다, 나는 호기심이 많다. - Axarydax
  • .so 파일을 얻으려면 ffmpeg를 어떻게 컴파일 했습니까? 당신이 따라간 단계들을 나누어 주시겠습니까? cygwin-1.7.9 및 ndk r5가있는 창에서 작업하고 있습니다. 도와주세요. - Swathi EP
  • 다음은 Android 용으로 비교적 새로운 FFmpeg입니다.sourceforge.net/projects/ffmpeg4android - slhck
  • @slhck 위의 링크에서 ffmpeg 코드를 다운로드하여 컴파일하려고 시도했지만 .so 파일을 가져올 수 없습니다. 그것은 많은 문제를 보여줍니다 .. - RAJESH
  • 제발 도와주세요 :stackoverflow.com/questions/14157030/…, 나는 어디에서이 기능을 포함하고 달릴 지 모른다! ..... - TharakaNirmana

9 답변


102

다음은 Android에서 작동하도록 ffmpeg를 얻는 단계입니다.

  1. Android 용 ffmpeg의 정적 라이브러리를 빌드하십시오. 이것은 olvaffe의 ffmpeg android 포트 (libffmpeg)를 사용하여Android 빌드 시스템. 소스를 / 외부 및make떨어져. ffmpeg 라이브러리가 의존하기 때문에 bionic (libc)과 zlib (libz)를 Android 빌드에서 추출해야합니다.
  2. Android를 사용하여 ffmpeg 기능을 래핑하는 동적 라이브러리 만들기NDK. NDK로 작업하는 방법에 대한 많은 문서가 있습니다. 기본적으로 ffmpeg에서 필요로하는 기능을 JNI를 통해 상호 작용할 수있는 라이브러리로 내보내려면 C / C ++ 코드를 작성해야합니다. NDK를 사용하면 1 단계에서 생성 한 정적 라이브러리에 쉽게 연결할 수 있습니다. Android.mk에 이와 비슷한 행을 추가하기 만하면됩니다.LOCAL_STATIC_LIBRARIES := libavcodec libavformat libavutil libc libz

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

재생을 위해 ffmpeg를 사용하는 것과 관련하여 많은 예제가 있습니다 (ffmpeg 바이너리 자체가 좋은 예입니다).이리이 튜토리얼은 기본적인 튜토리얼입니다. 가장 좋은 문서는 헤더에서 찾을 수 있습니다.

행운을 빕니다 :)


  • 안드로이드 용 ffmpeg 제작에 대한 답변에 대한 링크가 많이 있습니다. 여전히 최상의 솔루션입니까? Android Build System 링크가 깨졌습니다. 그게 무엇입니까? NDK로 건물을 짓는 데 도움이되는 많은 툴킷이 있습니다. 그러나 그들은 모두 나를 위해 다양한 빌드 오류로 실패하고, 조금 오래된 것. 누군가 정적 ffmpeg 라이브러리를 게시 할 수없는 이유가 있습니까? - Rob Lourens
  • 내 자신의 질문에 대답하기 위해이 레포가 ffmpeg 및 JNI 래퍼 작성에 가장 유용하다는 것을 알게되었습니다.github.com/andynicholson/android-ffmpeg-x264 - Rob Lourens

63

여러 가지 이유로, 멀티미디어는 효율성을 저하시키지 않으면 서 작업을 달성하는 측면에서 결코 쉽지 않았습니다. ffmpeg는 매일 그것을 향상시키는 노력입니다. 다양한 코덱 및 컨테이너 형식을 지원합니다.

이제 질문에 답하십시오.이 라이브러리를 사용하는 방법, 나는 여기에 그것을 쓰는 것이 그렇게 간단하지 않다고 말할 것이다. 하지만 내가 너를 안내 할 수있어.다음과 같은 방법들.

1) 소스 코드의 ffmpeg 디렉토리 안에output_example.c또는api_example.c. 여기서 인코딩 / 디코딩이 수행 된 코드를 볼 수 있습니다. 어떤 API를 호출해야하는지 ffmpeg에 대한 아이디어를 얻을 수 있습니다. 이것은 귀하의 첫 걸음이 될 것입니다.

2) Dolphin 플레이어는 Android 용 오픈 소스 프로젝트입니다. 현재 버그가 있지만 개발자는 계속 작업하고 있습니다. 이 프로젝트에서는 조사를 계속할 수있는 전체 설정을 준비했습니다. 여기에 대한 링크가 있습니다.계획code.google.com에서 확인하거나 '자식 복제https://code.google.com/p/dolphin-player/P와 P86이라는 두 개의 프로젝트를 볼 수 있는데, 둘 중 하나를 사용할 수 있습니다.

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

몇 가지 기본 사항 :비디오 파일 ex : avi를 말하면 오디오와 비디오의 조합입니다.

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


비디오 = Codec + Muxer + Demuxer

코덱 = 인코더 + 디코더

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


오디오 = 코덱 + Muxer + Demuxer

코덱 = 인코더 + 디코더

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


코덱 (이름은 en * co / der / * dec * oder의 조합에서 deriverd입니다)은 프레임을 인코딩 / 디코딩하는 데 사용되는 알고리즘을 정의하는 형식의 일부입니다. 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)

이 모든 일 후에 너를 혼란스럽게하지 않기를 희망한다.

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


  • 이 정보에 대해 대단히 감사 드리고 싶습니다. 정말 도움이되었습니다. 나중에 필요할 경우 도움을받을 수 있습니까? 고맙습니다! - idish
  • Skype / MSN 또는 다른 채팅 플랫폼을 통해 제발 당신을 추가 할 수 있습니까? 그것에 대해 몇 가지 질문이 있습니다. 감사합니다. - idish
  • 확실한..!! 그러나 나의 온라인 존재는 조금 낮다. 그것이 아주 많이 요구되지 않는다면, 나는 스카이프에 로그인하지 않는다. 중요한 일이 있으면 나를 우편으로 보낼 수 있습니다. 이메일 : mantykuma@gmail.com - mk..

11

theguardianproject 팀이 만든 가장 사용하기 쉽고 구현하기 쉬운 구현은 다음과 같습니다.https://github.com/guardianproject/android-ffmpeg


  • Mac에서이 작업이 확실합니까? 10.8.5 - Mr.G
  • 확신 할 수는 없지만, 새로운 아이폰 OS 버전에서는이를 깨뜨릴 수 없다는 점을 염두에 두지 않습니다. 내가 이것을 올렸을 때, 나는 아직도 10.7 또는 10.6을 가지고 있었다. - Guy
  • 어떻게 알 수 있을까요, JNI 구현을 사용하여 3gp를 오디오로 변환 할 수 있습니까? - Mr.G

10

필자는 Android NDK를 사용하여 X264 및 FFMPEG를 구성 및 구축하기위한 약간의 프로젝트를 수행했습니다. 누락 된 주요한 점은 Java를 통해 액세스 할 수있게 해주는 점잖은 JNI 인터페이스이지만 쉬운 부분입니다 (상대적으로). JNI 인터페이스를 자신의 용도에 맞게 만드는 데 많은 시간을 할애해야합니다.

olvaffe의 빌드 시스템에 대한 이점은 Android.mk 파일이 라이브러리를 빌드 할 필요가 없다는 것입니다. 보통 makefile과 툴체인을 사용합니다. 따라서 FFMPEG 또는 X264에서 새 변경 사항을 가져올 때 작업을 중지 할 확률이 훨씬 줄어 듭니다.

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


  • Nick, 프로젝트가 OS X 10.7에서 컴파일되지 않습니다. libx264.a (common.o) : 함수에서x264_param_parse': common.c:(.text+0x2864): undefined reference to _DefaultRuneLocale ' collect2 : ld가 1을 반환했습니다. 종료 상태 만들기 : *** [x264] 오류 1 - Yuriy Solovyov

5

내 FFMPEG 응용 프로그램을 만들려면이 프로젝트를 사용했습니다 (https://github.com/hiteshsondhi88/ffmpeg-android-java) 그래서, 나는 아무것도 컴파일 할 필요가 없습니다. 필자는 안드로이드 어플리케이션에서 FFMPEG를 사용하는 쉬운 방법이라고 생각합니다.

더 많은 정보http://hiteshsondhi88.github.io/ffmpeg-android-java/


  • 이 래퍼는 매우 매우 매우 매우 느립니다. 비디오에 200 개의 이미지가 50-60 초 걸립니다. . . 그러나 보통 ffmpeg는 4-5 초 안에 그 작업을 처리합니다. - Arsen Sench
  • 이 프로젝트는 더 이상 작동하지 않습니다. 다른 리소스가 있습니까? - Ajeet
  • @ArsenSench 다른 해결책이 있습니까? - Akash Dubey

3

거기에 안드로이드 구현에 많은 다른 FFmpeg에 의해 영감을 (주로가디언 프로젝트), 해결책을 찾았습니다 (절름발이 지원도 있음).

(절름발이 및 FFmpeg :https://github.com/intervigilium/liblamehttp://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.
        }
    }
}


  • 가디언 프로젝트에 대한 귀하의 경험은 무엇입니까? - x.y

2

이 프로젝트가 언급되지 않았다는 이상한 점은 :Appunite의 AndroidFFmpeg

그것은 나 같은 게으른 사람들을 위해 커맨드 라인에 복사 / 붙여 넣기하는 아주 상세한 단계별 지침이 있습니다.)


2

많은 연구 끝에, 지금이 발견 된 안드로이드에 대한 가장 업데이트 된 컴파일 된 라이브러리입니다 :

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

  • 이 순간에FFmpeg release n4.0-39-gda39990
  • FFmpeg 및 FFProbe 포함
  • 명령을 실행하는 Java 인터페이스가 들어 있습니다.
  • FFprobe 또는 FFmpeg를 APK에서 제거 할 수 있습니다. 위키를 확인하십시오.https://github.com/bravobit/FFmpeg-Android/wiki


  • 예,이 앱이 작동 중입니다. 플러터 앱에 사용 중입니다. - UpaJah

1

나는 똑같은 문제가 있었는데, 나는 여기에서 대부분의 답변을 발견했다. 필자는 FFMPEG에 래퍼를 작성하여 한 줄의 코드로 Android에서 액세스했습니다.

https://github.com/madhavanmalolan/ffmpegandroidlibrary


연결된 질문


관련된 질문

최근 질문