나는 안드로이드에서 컴파일 된 FFmpeg (libffmpeg.so)를 가지고있다. 이제는 RockPlayer와 같은 애플리케이션을 구축하거나 FFmpeg를 호출하기 위해 기존 Android 멀티미디어 프레임 워크를 사용해야합니다.
Android / StageFright에서 FFmpeg를 통합하는 단계 / 절차 / 코드 / 예가 있습니까?
멀티미디어 재생을 위해이 라이브러리를 어떻게 사용할 수 있습니까?
나는 오디오 및 비디오 전송 스트림을 가지고 있는데 FFmpeg로 피드를 보내고 디코딩 / 렌더링해야하는 요구 사항이 있습니다. IOMX API는 OMX 기반이므로 FFmpeg를 플러그인 할 수 없으므로 어떻게 Android에서이 작업을 수행 할 수 있습니까?
또한 재생을 위해 사용해야하는 FFmpeg API에 대한 설명서를 찾을 수 없습니다.
다음은 Android에서 작동하도록 ffmpeg를 얻는 단계입니다.
make
떨어져. ffmpeg 라이브러리가 의존하기 때문에 bionic (libc)과 zlib (libz)를 Android 빌드에서 추출해야합니다.Android를 사용하여 ffmpeg 기능을 래핑하는 동적 라이브러리 만들기NDK. NDK로 작업하는 방법에 대한 많은 문서가 있습니다. 기본적으로 ffmpeg에서 필요로하는 기능을 JNI를 통해 상호 작용할 수있는 라이브러리로 내보내려면 C / C ++ 코드를 작성해야합니다. NDK를 사용하면 1 단계에서 생성 한 정적 라이브러리에 쉽게 연결할 수 있습니다. Android.mk에 이와 비슷한 행을 추가하기 만하면됩니다.LOCAL_STATIC_LIBRARIES := libavcodec libavformat libavutil libc libz
Java 소스에서 ffmpeg-wrapping 동적 라이브러리를 사용하십시오. JNI에 대한 충분한 문서가 있습니다. 괜찮을 것입니다.
재생을 위해 ffmpeg를 사용하는 것과 관련하여 많은 예제가 있습니다 (ffmpeg 바이너리 자체가 좋은 예입니다).이리이 튜토리얼은 기본적인 튜토리얼입니다. 가장 좋은 문서는 헤더에서 찾을 수 있습니다.
행운을 빕니다 :)
여러 가지 이유로, 멀티미디어는 효율성을 저하시키지 않으면 서 작업을 달성하는 측면에서 결코 쉽지 않았습니다. 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)
이 모든 일 후에 너를 혼란스럽게하지 않기를 희망한다.
감사합니다. 도움이 필요하면 알려주세요.
theguardianproject 팀이 만든 가장 사용하기 쉽고 구현하기 쉬운 구현은 다음과 같습니다.https://github.com/guardianproject/android-ffmpeg
필자는 Android NDK를 사용하여 X264 및 FFMPEG를 구성 및 구축하기위한 약간의 프로젝트를 수행했습니다. 누락 된 주요한 점은 Java를 통해 액세스 할 수있게 해주는 점잖은 JNI 인터페이스이지만 쉬운 부분입니다 (상대적으로). JNI 인터페이스를 자신의 용도에 맞게 만드는 데 많은 시간을 할애해야합니다.
olvaffe의 빌드 시스템에 대한 이점은 Android.mk 파일이 라이브러리를 빌드 할 필요가 없다는 것입니다. 보통 makefile과 툴체인을 사용합니다. 따라서 FFMPEG 또는 X264에서 새 변경 사항을 가져올 때 작업을 중지 할 확률이 훨씬 줄어 듭니다.
https://github.com/halfninja/android-ffmpeg-x264
x264_param_parse': common.c:(.text+0x2864): undefined reference to
_DefaultRuneLocale ' collect2 : ld가 1을 반환했습니다. 종료 상태 만들기 : *** [x264] 오류 1 - Yuriy Solovyov
내 FFMPEG 응용 프로그램을 만들려면이 프로젝트를 사용했습니다 (https://github.com/hiteshsondhi88/ffmpeg-android-java) 그래서, 나는 아무것도 컴파일 할 필요가 없습니다. 필자는 안드로이드 어플리케이션에서 FFMPEG를 사용하는 쉬운 방법이라고 생각합니다.
더 많은 정보http://hiteshsondhi88.github.io/ffmpeg-android-java/
거기에 안드로이드 구현에 많은 다른 FFmpeg에 의해 영감을 (주로가디언 프로젝트), 해결책을 찾았습니다 (절름발이 지원도 있음).
(절름발이 및 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.
}
}
}
이 프로젝트가 언급되지 않았다는 이상한 점은 :Appunite의 AndroidFFmpeg
그것은 나 같은 게으른 사람들을 위해 커맨드 라인에 복사 / 붙여 넣기하는 아주 상세한 단계별 지침이 있습니다.)
많은 연구 끝에, 지금이 발견 된 안드로이드에 대한 가장 업데이트 된 컴파일 된 라이브러리입니다 :
https://github.com/bravobit/FFmpeg-Android
FFmpeg release n4.0-39-gda39990
나는 똑같은 문제가 있었는데, 나는 여기에서 대부분의 답변을 발견했다. 필자는 FFMPEG에 래퍼를 작성하여 한 줄의 코드로 Android에서 액세스했습니다.
https://github.com/madhavanmalolan/ffmpegandroidlibrary