1. 코드를 가져옵니다 :
자식 복제 https://github.com/Bilibili/ijkplayer.git ijkplayer - 안드로이드
CD를 ijkplayer - 안드로이드
자식 체크 아웃 -B 최신 k0.8.8
2. 빌드하기 전에 :
# 설치 사제, 자식, yasm
루비 -e "$은 (-fsSL https://raw.githubusercontent.com/Homebrew/install/master/install 컬)"
양조 자식을 설치
양조 yasm 설치
# 당신의 ~ / .bash_profile에 이러한 줄을 추가 또는 ~ / .profile에
# 수출 ANDROID_SDK = <당신의 SDK 경로>
# 수출 ANDROID_NDK = <당신의 NDK 경로>
Cygwin에서에 # (관리되지 않는)
# 확인 yasm을 자식을 설치
3. 오픈 소스 라이브러리에 의존 수
./init-android.sh
가져 오기 는 FFmpeg 다른 armabi , 라이브러리를
가져 libyuv을 하고 LIB libtouchsound 라이브러리 :
여러 오픈 소스 라이브러리의 소개 :
1. jni4android는 A는 , JNI 그것을 제공 할 수 생성 도구 자바 자동 대응 생성 클래스 의 JNI 층 *의 .c 파일 * .H의 헤더 파일.
2. SoundTouch는 주로 다음과 같은 기능으로, 오픈 소스 오디오 라이브러리입니다 :
가변 속도 일정한 톤 ( 은 TSM , 시간 스케일 변경 ), 오디오 톤에 영향을주지 않고 오디오 재생 속도 (빠르게 또는 느리게) 변경 (피치) .
톤이 이동하지 않는 쉬프트 피치, 오디오 재생의 속도를 일정하게 유지하면서, 오디오 톤을 변경
톤 송신 오디오 톤과 속도를 변화시키면서
3. libyuv가 있다 구글 다양한 달성 오픈 소스 YUV를 에 RGB의 라이브러리 사이 스케일링 변환, 회전. 그것은 크로스 플랫폼, 사용할 수있는 윈도우 , 리눅스 , 맥 , 안드로이드 및 다른 운영 체제, 86 , 64 , ARM 지원하는 아키텍처에서 실행되도록 컴파일 SSE는 , AVX는 , NEON 및 기타 SIMD의 지침을 가속화 할 수 있습니다.
4. 컴파일 안드로이드는 FFmpeg 라이브러리 :
CD의 안드로이드 /있는 contrib
깨끗한 ./compile-ffmpeg.sh
./compile-ffmpeg.sh 모든
는 FFmpeg 힘내 저장소 :
다른 armabi 해당 는 FFmpeg 라이브러리 :
는 FFmpeg의 빌드 스크립트 :
컴파일 libavfiter 및 기타 오브젝트 파일을 :
5. 컴파일 IJK를 :
CD ..
./compile-ijk.sh 모든
으로 NDK 컴파일 ijkplayer 디렉토리 JNI의 폴더
패키지가 생성 ijkffmpeg 처럼 SO .
컴파일 ijkplayer
6. 오기 AS (3.2) :
파일 -> 열기를 선택 클릭 Android 기기,> ijkplayer
AS 문제로 구성주의 :
1. Gradle을의 버전 스위치. 수동으로 다운로드 Gradle을 같은 버전 gradle-4.6-all.zip을 로 Gradle을 다음 파일.
2. Jcenter 다운로드 시간 제한 문제, 대체 aliyun을 .
두 . IJK의 코드 분석 :
IjkPlayer 제공 할뿐만 아니라 ijkPlayer API를 하지만, 또한 제공 안드로이드 기본 MediaPlayer를을 하고 구글 그의 ExoPlayer API를 . ijkPlayer 에서 VideoView를 지켜 보면서 로 플레이어 공장 패턴 만들기
IjkDemo 전체 아키텍처 :
데모 하지 않는 SDL 그려, 안드로이드 사용을 참조 할 수 있습니다 :
https://github.com/wanliyang1990/SDL2ForAndroid
ijkplayer 재생 타이밍도 :
./android/ijkplayer_jni.c
IjkMediaPlayer_native_setup
ijkplayer_android.c
ijkmp_android_create
ffpipeline_android.c
ffpipeline_create_from_android
플레이어의 기본 블록 다이어그램 :
ffplay.c 아래와 같이 프로 시저를 호출 주요 코드 :
1. 데이터가 판독
stream_open 다음과 같은 일을 주로 :
저장된 만들기 비디오 / 오디오 디코딩하기 전에 데이터를 videoq / audioq
만들기 저장된 비디오 / 오디오 디코딩 된 데이터를 pictq / sampq
데이터 읽기 스레드 만들기 read_thread을
비디오 렌더링 스레드 만들기 video_refresh_thread을
2. 오디오 및 비디오 디코딩은 :
비디오 디코딩 모드 선택
당신이 구성하는 경우 ffp-> mediacodec , 당신은 하드웨어 디코딩을 지원하지 않는 경우, 하드웨어를 ××× 열려고하는 우선 순위를 부여합니다, 소프트 솔루션이 전환됩니다.
Video_thread / audio_thread .
3. 오디오 및 비디오 렌더링
초기화 플레이어 , 구축 VOUT : 개체를 S4A을> - ijksdl을
MP-> ffplayer-> VOUT = SDL_VoutAndroid_CreateForAndroidSurface ();
통화 SDL_VoutDisplayYUVOverlay
그릴
SDL_VoutDisplayYUVOverlay (ffp-> VOUT, VP-> BMP);