상세 컨텐츠

본문 제목

FFMpeg for Android #2

오픈소스 연구/FFMPEG

by 류종택 2011. 4. 19. 06:14

본문

FFMpeg을 이용하여 만든 Android 용 동영상 플레이어 두 번째 업데이트입니다.  지난 번에는 너무 느려서 음성 싱크가 맞지 않았던, 640*480 해상도까지 음성 싱크가 맞도록 퍼포먼스를 개선한 상태입니다.  더 높은 해상도에 대해서는 프레임 수를 낮춰서 싱크를 맞추도록 할 예정입니다.

지난 번과 마찬 가지로 테스트 장비는 옵티머스 마하 입니다.

아래 녹화 이후 음성 처리 부분을 개선하여 좀더 부드럽게 업그레이드했습니다.  그런데도, 720*480 크기부터는 화면 표시가 어렵더군요, RockPlayer를 다운받아서 테스트 해보니, 역시나 마찬가지로 화면이 음성과 싱크가 깨지면서 밀립니다.  

코덱의 종류의 따라서도 밀리는 현상이 심각해지는 경우가 있습니다.

프레임 수를 낮추는 방식을 적용해보았지만, 좀 더 퍼포먼스 개선이 필요할 것 같습니다.  아니면, 현재의 싱글 코어에서는 640*480 정도가 한계일 수도 있을 듯 합니다. 




 

'오픈소스 연구 > FFMPEG' 카테고리의 다른 글

libffmpeg.so for Android  (5) 2011.12.14
간단하고 명료한 FFMPEG 샘플 코드  (0) 2011.09.23
FFMpeg for Android #2  (28) 2011.04.19
FFMpeg for Android #1  (0) 2011.04.15
FFmpeg for Android 설치 및 컴파일  (12) 2011.03.17
FFmpeg 기초 예제  (2) 2011.02.24

관련글 더보기

댓글 영역

  • 프로필 사진
    2011.05.01 15:00
    안녕하세요
    저도 안드로이드에 ffmpeg 올리는 작업을 하고 있는습니다.

    그런데 저는 인코딩이 필요한 상황이라 이쪽에 집중하고 있는데 mjpeg, mpeg1, mpeg4 등등은
    인코딩이 되게 했느데 h.264 는 다른 방법으로 해줘야 하더라고요 ㅜㅜ

    혹시 안드로이드에서 ffmpeg 으로 h.264 인코딩은 안하셨는지요?

    가능하게 하는 방법이 있으시면 조언을 구해도 될까요? ㅡㅡ;;
  • 프로필 사진
    2011.05.08 09:28
    안녕하세요 구글링하다가 블로그 보고 댓글남깁니다.

    다름이 아니라 여기에 ffmpeg 포팅 방법으로 포팅까지는 성공했는데요

    어떻게 사용해야 하는지를 잘 몰라서요..

    libffmpeg.so를 어떻게 사용하는건가요?

    시간되시면 답변부탁드립니다. 감사합니다.

    lopiter@gmail.com
    • 프로필 사진
      2011.05.09 23:53 신고
      so 파일의 이름이 libffmpeg.so 라고 했을 때,
      Android.mk를 아래와 같은 방식으로 사용하면 됩니다.
      (모든 파일은 jni 폴더에 같이 있다고 보고 예를 든 것 입니다)


      LOCAL_PATH := $(call my-dir)

      include $(CLEAR_VARS)

      LOCAL_MODULE := fftest
      LOCAL_SRC_FILES := ffmpegtest.c

      SO_PATH := ./

      LOCAL_C_INCLUDES := $(LOCAL_PATH)/ffmpeg
      LOCAL_LDLIBS += -L $(SO_PATH) -lffmpeg

      include $(BUILD_SHARED_LIBRARY)
  • 프로필 사진
    2011.05.11 11:11
    답변 주셔서 감사합니다.

    말씀하신대로 테스트를 해봤더니

    undefined reference to `av_register_all' 이런 에러가 나서요..

    혹시 제가 so 파일을 잘못만들었나 하는 생각이 드네요.

    so로 만든 파일크기가 1040 밖에 안되네요..

    이렇게 만들어지는게 맞나요?


    테스트 방법은 hello-jni 예제를 복사해서 하나 만들었구요

    그리고 libffmpeg.so 파일과 ffmpeg 폴더를 복사된 프로젝트에

    jni 폴더에 복사했습니다.

    혹시 같이 생성된 .a 파일들도 같이 복사를 해야 되는건가요?

    바쁘신중에도 답변 해주셔서 감사합니다.
    • 프로필 사진
      2011.05.12 21:33 신고
      스태틱 라이브러리를 이용해서 빌드 하시거나,
      http://ryulib.tistory.com/123 에 있는 so 파일을 사용해 보세요.
  • 프로필 사진
    2011.05.26 17:28
    안녕하세요

    ffmpeg 작업을 하고있는데 예제파일 hello-jni 로 테스트 중인데 NDK 빌드가 되지가 않네요
    http://ryulib.tistory.com/123 첨부되어있는 libffmpeg.so 파일을 jni 폴더에 넣고 Android.mk 파일을 위에 글처럼 작성하고

    hello-jni.c 파일에서 include <libavcodec/avcodec.h>

    이것만 추가해서 빌드했는데 오류가 나네요 시간되시면 조언좀 구할께요 감사합니다.
    • 프로필 사진
      2011.05.28 11:32 신고
      무슨 오류인지도 모르는 상황에서 설명이 어렵네요.
      저는 주로 fa player 소스를 보고 공부했습니다.
  • 프로필 사진
    2011.06.17 17:56
    안녕하세요. 저도 ffmpeg 작업을 하고 있는데 도움을 받을 수 없을까하여 댓글을 남깁니다.

    ffmpeg의 decode 결과를 안드로이드 비디오 frame에 어떤 방법으로 출력했는지 궁금하네요.
    Native 단에서 android Bitmap에 직접 접근해서 썻는지, OpenGLES로 GLSurface에 접근하셨는지 궁급합니다.

    전 Native에서 OpenGL 2.0로 렌더링 한 뒤 FrameBuffer와 RenderBuffer를 바인딩해서 돌렸는데도 불구하고 화면 깜빡임이 발생하더군요. StackOverflow에 Android Native OpenGLES 2.0은 FBO를 완전히 implement 하지 않는다라는 얘기도 보이지만 신뢰성은 좀 떨어지고요...

    fa player 소스를 참고하셨다고 했는데 혹시 이와 관련된 코드가 어디에 있는지 아시면 말씀을 부탁드려도 될까요? vlc를 전혀 접해보지 못했던터라 방대한 분량의 코드에 접근하는데 어려움이 많네요.

    시간이 되시면 조언을 부탁드립니다. 감사합니다.
    • 프로필 사진
      2011.06.17 18:55 신고
      Bitmap을 접근해서 썼습니다. NDK 샘플에 있는 플라즈마 예제를 참고했습니다. 좋은 결과 있을시길 바랍니다 ^^*
  • 프로필 사진
    2011.06.20 17:12
    Bitmap을 쓰셨군요. ^^

    Android 2.2 이상이라는 제한이 걸리는 터라 어떻게든 native OpenGLES로 해결해보려했는데, 이 방법이 제일 빠르고 깔끔한 것 같네요. (사실 다른 방법들 -canvas or native GLES20- 는 속도 및 FBOs 문제 때문에 결국 포기했습니다. ^^;; )

    다른 블로그 글을 뒤늦게 보니 많은 질문들 때문에 힘드신 것 같았는데, 답변해주셔서 감사합니다.
    큰 도움이 되었습니다.
  • 프로필 사진
    2011.07.04 11:17
    안녕하세요. ffmpeg을 사용해 조그만 안드로이드 앱을 개발해보려는 학생인데요.

    염치불구하고 한가지 질문을 드립니다.

    이 블로그에 있는 libffmpeg.so파일을 그대로 사용해서 jni를 써 새로운 so파일을 생성했습니다.

    Tutorial2 소스를 돌려보았는데 정상적으로 동작하지 않아 로그를 찍어보니. av_register_all()부분은 실행되는 것 같은데. av_open_input_file부분이 정상적으로 동작하지 않습니다. file을 열수 없는 것도 아니고, 함수내로 들어가서 바로 종료되는 것 같은데요. 없는 파일 이름을 인자값으로 주면 에러를 출력하고 동작을 멈추는데, 실제로 존재하는 경로를 인자값으로 주면. 아무런 메세지 없이 자꾸 종료가 되서.. 이를 어떻게 해결하셨는지 여쭙고 싶습니다....

    도움 주시면 정말 감사하겠습니다.
  • 프로필 사진
    2011.07.05 16:51
    안녕하세요! 저 또한 ffmpeg을 이용해서 안드로이드 앱을 개발해보려는 대학원생입니다.

    정말 바쁘신줄은 알지만 너무 답답한 마음에 조그만한 시간 좀 내주십사 이렇게 질문 올립니다.

    2011/03/17에 올리신 게시물을 따라서 libffmpeg.so 파일이 나오는거 까지는 확인을 했습니다.

    하지만 Android NDK로 컴파일 하여 안드로이드 상에서 라이브러리에 있는 함수를 사용하기 위해서는

    관련 소스(C Language 소스)를 JNI 형태로 Wrapping 작업을 해야 한다고 어느 사이트에서 봐서요.

    제가 헷갈리는 것은 위에 있는 컴파일의 내용은 JNI 형태로 바꾸지 않고 컴파일을 하였는데

    그 라이브러리 파일을 안드로이드에서 사용할 수 있냐는 것입니다.

    C Language 를 JNI로 바꾸는 작업을 해야 접근하여 NDK로 빌드 작업후 함수를 사용할 수 있는거 아닌가요?

    답변 주시면 정말 감사하겠습니다.

    그리고 블로그에 있는 게시물을 통해 많이 도움이 되었습니다^^ 감사드려요~
    • 프로필 사진
      2011.07.05 17:59 신고
      해당 자료는 일단 컴파일까지만 된 것이고,
      이후 JNI로 컴파일하면서 컴파일된,
      스태틱 라이브러리들을 이용하시면 됩니다.
    • 프로필 사진
      2011.07.05 18:23
      바꾸는 작업이 만만치 않겠네요..

      답변 감사드립니다~!!
  • 프로필 사진
    2011.07.08 18:29
    안녕하세요. 저번에 질문드렸던 대학생입니다. 죄송하지만 한가지만 더 여쭙고 싶네요..
    영상 재생은 그럭저럭되나 소리를 가져오는데. 잘 진행되지 않네요...
    decode된 byte배열을 안드로이드의 AudioTrack을 이용해서 재생해보았는데.지직거리는 소리만 들립니다.
    sampleRate나 Channel등의 값은 ffmpeg에서 가져온 값을 썻구요..
    buffer값을 찍어보니. JNI상에서는 unsigned형이었던게. Android에서 signed로 바뀌긴 하던데....
    도통 감을 못잡겠습니다...
    혹시 어떤 방법으로 하셨는지 알수 있을까요?
    읽어주셔서 감사합니다.
    • 프로필 사진
      2011.07.09 23:24 신고
      저도 byte array로 넘겨서 AudioTrack으로 재생하였습니다.
      특별하게 작업한 건 없습니다.
      다만, AudioTrack에 데이터가 지속적으로 write 되지 않으면,
      리소스 반환 등의 문제로 래깅이 생긴다고 합니다.
      제가 직접 확인한 것은 아니라서 확실하지 않습니다.
      그냥 인터넷에서 포스트를 본 것 뿐입니다.
  • 프로필 사진
    2011.07.13 14:55
    비밀댓글입니다
    • 프로필 사진
      2011.07.12 23:11 신고
      일단 위의 작업 결과물은
      의뢰인에게 비용을 받고 의뢰받은 프로젝트 중간 산출물입니다.
      따라서, 소스에 대한 저작권은 제가 아닌 의뢰인에게 있습니다.

      일단 카메라를 실시간으로 받아서 엔코딩하는 것은 ffmpeg에서 지원합니다.
      검색해보시면 자료가 많이 나와 있습니다.

      그리고, 공부하실 자료는 제 소스가 아니더라도 충분합니다.
      * http://dranger.com/ffmpeg/
      * 천라인으로 동영상 플레이어 만들기라는 한글 자료도 어딘가서 봤습니다.
      * 그리고, ffplaye.exe, ffmpeg.exe 소스를 살펴보시면 도움이 됩니다.

      저도 비밀 댓글을 달아드리고 싶었지만,
      저는 비밀 댓글이 안되네요.
  • 프로필 사진
    2011.07.13 14:56
    답변 감사드립니다.

    일단 알려주신 사이트와 다른 자료로 열심히 해보겠습니다^^

    항상 큰 도움 받고 갑니다~!!
  • 프로필 사진
    2011.08.21 21:17
    잠깐문의를 드릴게 있는데 방법이 없을까요?

    대강 내용은 YUV형태의 인코딩된 영상 데이터를 디코딩 시키는 과정에서

    디코딩을 하고 RGB형태로 바꾼다음 그 데이터를 비트맵 인스턴스로 안드로이드상에서 받게 되는데요

    근데 문제는 화면이 나오긴 하는데 전체 화면에서 윗부분은 제대로 나오는데

    아래부분은 데이터가 밀리는 것 처럼 깨져서 나옵니다.

    데이터가 밀리는 것 같다는 것은 깨지는 부분부터 쭉 같은 데이터가 들어가는 것 처럼

    아래로 같은 라인이 출력이 됩니다.

    물어볼 곳이 없고 너무 답답한 마음에 댓글 남깁니다.

    바쁘신데 자꾸 귀찮게 해서 죄송합니다..ㅠㅠ 시간이 되신다면 부디 의견 남겨주셨으면 감사하겠습니다.
    • 프로필 사진
      2011.08.23 10:27 신고
      죄송합니다. 저는 질문을 받지 않습니다.
      ffmpeg 튜토리얼을 구해서 그대로 하시면 별 문제없이 됩니다.
      차근히 해보시길..
  • 프로필 사진
    2012.01.31 13:26
    안녕하세요.
    이 블로그에서 도움을 많이 받고 있는 대학생입니다.
    먼저 너무나 감사하다는 말씀 드리고 싶습니다. 도움이 많이 됐거든요.

    현재 안드로이드용 ffmpeg을 이용하여 기본 Player를 만들고 있는데요.
    배속 재생을 하는데 문제가 생겨서요.ㅜㅜㅜ
    어떤 원리로 video audio 배속처리를 하셨는지 궁금합니다.

    시간이 되시면 의견남겨 주시길 부탁드립니다.ㅜㅜ
    • 프로필 사진
      2012.01.31 14:00 신고
      AudioTrack.setPlaybackRate() 메소드를 이용했습니다.
      피치가 올라가지 않게 하기 위해서는
      SoundTouch를 이용하시면 됩니다.
  • 프로필 사진
    2012.01.31 15:19
    ^^ 생각보다 답변을 일찍 받아 너무 감사합니다.
    마지막으로 한가지만 더 여쭤봐도 될까요?..
    저 역시 Native단에서 Bitmap에 접근하여 영상을 rendering 하고 있는데요.
    조금 높은 해상도는 끊기는 현상이 발생합니다. [ 정상 재생의 경우에도 끊겨요.ㅜㅜ] 배속 재생 역시 1.6배속 이상이거나,
    높은 해상도 ( 450p 도 끊기네요. )의 영상은 끊기는 데요.
    버퍼링은 어떤식으로 하신건가요? 위의 글에는 프레임수를 낮춘다고 하셨는데요.
    다른 방법은 없나요? 프레임수를 낮춘다면 decoding하기전에 넣어주는 인자값을
    변경하신다는 의미인가요?

    하찮은 질문에 답해주셔서 너무 감사합니다.
    항상 큰 도움 받네요. 감사합니다.

    • 프로필 사진
      2012.02.02 13:29 신고
      프레임 정보를 스킵하고 있습니다.
      지연된 만큼.
      최대한 퍼포먼스를 위해서 튜닝도 하였으나,
      어느 정도 한계는 있떠군요.
      가장 최근 작업 한 것에서는
      옵티머스 마하에서도 hd가 잘 돌아가더군요.

      그리고 저는 질문을 받지 않는 것이 원칙입니다.
      따라서 항상 답변을 기대하지 마세요 ^^;;

페이징