Ijkplayer의 간단한 분석

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 라이브러리 :

spacer.gif

여러 오픈 소스 라이브러리의 소개 :

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의 빌드 스크립트 :

spacer.gif

 

컴파일 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를 지켜 보면서 플레이어 공장 패턴 만들기

의 image.png

IjkDemo 전체 아키텍처 :

IJK 차트 .JPG

데모 하지 않는 SDL 그려, 안드로이드 사용을 참조 할 수 있습니다 :

https://github.com/wanliyang1990/SDL2ForAndroid

 

ijkplayer 재생 타이밍도 :


 이름 .PNG 파일

./android/ijkplayer_jni.c

IjkMediaPlayer_native_setup

 

ijkplayer_android.c

ijkmp_android_create

 

ffpipeline_android.c

ffpipeline_create_from_android

 

 

플레이어의 기본 블록 다이어그램 :

4469440-08222cdd49ceae8d.png

ffplay.c 아래와 같이 프로 시저를 호출 주요 코드 :

image.pngspacer.gif

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);

 

 

 


추천

출처blog.51cto.com/14367728/2402470