ijkplayer源码阅读01-环境搭建

作者: 秦明Qinmin | 来源:发表于2017-06-01 20:40 被阅读735次

    概述

    ijkplayer 是Bilibili开发并开源的轻量级视频播放器,支持本地网络视频播放以及流媒体播放,支持iOS和Android平台。ijkplayer基于 FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。 FFmpeg 采用LGPL或GPL许可证,提供了录制、转换以及流化音视频的完整解决方案,包括了领先的音、视频编码库libavcodec等。

    特性

    platform | version | CPU| video-output|audio-output|hw-decoder
    :---:|:---:|:---:|:---:|:---:
    iOS | iOS 7.0+ | armv7, arm64, i386, x86_64|OpenGL ES 2.0|AudioQueue, AudioUnit|VideoToolbox (iOS 8+)
    Android | API 9+ | ARMv7a, ARM64v8a, x86 |NativeWindow, OpenGL ES 2.0|AudioTrack, OpenSL ES|MediaCodec (API 16+, Android 4.1+)

    实现效果

    凤凰台直播.png

    iOS编译

    目录结构.png
    • 准备ijkplayer编译环境。执行解压目录下的 init-ios.sh 脚本便可以自动配置编译环境。
    sh init-ios.sh
    

    init-ios.sh 脚本作用是将ffmpeg、gas-preprocessor 源码 pull 到本地。

    #! /usr/bin/env bash
    #
    # Copyright (C) 2013-2015 Bilibili
    # Copyright (C) 2013-2015 Zhang Rui <bbcallen@gmail.com>
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #      http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    #
    
    # IJK_FFMPEG_UPSTREAM=git://git.videolan.org/ffmpeg.git
    IJK_FFMPEG_UPSTREAM=https://github.com/Bilibili/FFmpeg.git
    IJK_FFMPEG_FORK=https://github.com/Bilibili/FFmpeg.git
    IJK_FFMPEG_COMMIT=ff3.3--ijk0.8.0--20170518--001
    IJK_FFMPEG_LOCAL_REPO=extra/ffmpeg
    
    IJK_GASP_UPSTREAM=https://github.com/Bilibili/gas-preprocessor.git
    
    # gas-preprocessor backup
    # https://github.com/Bilibili/gas-preprocessor.git
    
    if [ "$IJK_FFMPEG_REPO_URL" != "" ]; then
        IJK_FFMPEG_UPSTREAM=$IJK_FFMPEG_REPO_URL
        IJK_FFMPEG_FORK=$IJK_FFMPEG_REPO_URL
    fi
    
    if [ "$IJK_GASP_REPO_URL" != "" ]; then
        IJK_GASP_UPSTREAM=$IJK_GASP_REPO_URL
    fi
    
    set -e
    TOOLS=tools
    
    FF_ALL_ARCHS_IOS6_SDK="armv7 armv7s i386"
    FF_ALL_ARCHS_IOS7_SDK="armv7 armv7s arm64 i386 x86_64"
    FF_ALL_ARCHS_IOS8_SDK="armv7 arm64 i386 x86_64"
    FF_ALL_ARCHS=$FF_ALL_ARCHS_IOS8_SDK
    FF_TARGET=$1
    
    function echo_ffmpeg_version() {
        echo $IJK_FFMPEG_COMMIT
    }
    
    function pull_common() {
        git --version
        echo "== pull gas-preprocessor base =="
        sh $TOOLS/pull-repo-base.sh $IJK_GASP_UPSTREAM extra/gas-preprocessor
    
        echo "== pull ffmpeg base =="
        sh $TOOLS/pull-repo-base.sh $IJK_FFMPEG_UPSTREAM $IJK_FFMPEG_LOCAL_REPO
    }
    
    function pull_fork() {
        echo "== pull ffmpeg fork $1 =="
        sh $TOOLS/pull-repo-ref.sh $IJK_FFMPEG_FORK ios/ffmpeg-$1 ${IJK_FFMPEG_LOCAL_REPO}
        cd ios/ffmpeg-$1
        git checkout ${IJK_FFMPEG_COMMIT} -B ijkplayer
        cd -
    }
    
    function pull_fork_all() {
        for ARCH in $FF_ALL_ARCHS
        do
            pull_fork $ARCH
        done
    }
    
    function sync_ff_version() {
        sed -i '' "s/static const char \*kIJKFFRequiredFFmpegVersion\ \=\ .*/static const char *kIJKFFRequiredFFmpegVersion = \"${IJK_FFMPEG_COMMIT}\";/g" ios/IJKMediaPlayer/IJKMediaPlayer/IJKFFMoviePlayerController.m
    }
    
    #----------
    case "$FF_TARGET" in
        ffmpeg-version)
            echo_ffmpeg_version
        ;;
        armv7|armv7s|arm64|i386|x86_64)
            pull_common
            pull_fork $FF_TARGET
        ;;
        all|*)
            pull_common
            pull_fork_all
        ;;
    esac
    
    sync_ff_version
    
    • 编译ijkplayer。环境配置好后,进入ios目录,执行compile-ffmpeg.sh脚本,编译 FFmpeg 库。在编译FFmpeg的时候,我们可以根据需要裁剪模块,模块的配置文件是module.sh文件(在源码目录的config目录中)。
    sh compile-ffmpeg.sh all
    

    compile-ffmpeg.sh脚本主要是合成iOS通用库,真正编译FFmpeg的脚本是do-compile-ffmpeg.sh。

    #! /usr/bin/env bash
    #
    # Copyright (C) 2013-2014 Bilibili
    # Copyright (C) 2013-2014 Zhang Rui <bbcallen@gmail.com>
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #      http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    #
    
    #----------
    # modify for your build tool
    
    FF_ALL_ARCHS_IOS6_SDK="armv7 armv7s i386"
    FF_ALL_ARCHS_IOS7_SDK="armv7 armv7s arm64 i386 x86_64"
    FF_ALL_ARCHS_IOS8_SDK="armv7 arm64 i386 x86_64"
    
    FF_ALL_ARCHS=$FF_ALL_ARCHS_IOS8_SDK
    
    #----------
    UNI_BUILD_ROOT=`pwd`
    UNI_TMP="$UNI_BUILD_ROOT/tmp"
    UNI_TMP_LLVM_VER_FILE="$UNI_TMP/llvm.ver.txt"
    FF_TARGET=$1
    FF_TARGET_EXTRA=$2
    set -e
    
    #----------
    echo_archs() {
        echo "===================="
        echo "[*] check xcode version"
        echo "===================="
        echo "FF_ALL_ARCHS = $FF_ALL_ARCHS"
    }
    
    FF_LIBS="libavcodec libavfilter libavformat libavutil libswscale libswresample"
    do_lipo_ffmpeg () {
        LIB_FILE=$1
        LIPO_FLAGS=
        for ARCH in $FF_ALL_ARCHS
        do
            ARCH_LIB_FILE="$UNI_BUILD_ROOT/build/ffmpeg-$ARCH/output/lib/$LIB_FILE"
            if [ -f "$ARCH_LIB_FILE" ]; then
                LIPO_FLAGS="$LIPO_FLAGS $ARCH_LIB_FILE"
            else
                echo "skip $LIB_FILE of $ARCH";
            fi
        done
    
        xcrun lipo -create $LIPO_FLAGS -output $UNI_BUILD_ROOT/build/universal/lib/$LIB_FILE
        xcrun lipo -info $UNI_BUILD_ROOT/build/universal/lib/$LIB_FILE
    }
    
    SSL_LIBS="libcrypto libssl"
    do_lipo_ssl () {
        LIB_FILE=$1
        LIPO_FLAGS=
        for ARCH in $FF_ALL_ARCHS
        do
            ARCH_LIB_FILE="$UNI_BUILD_ROOT/build/openssl-$ARCH/output/lib/$LIB_FILE"
            if [ -f "$ARCH_LIB_FILE" ]; then
                LIPO_FLAGS="$LIPO_FLAGS $ARCH_LIB_FILE"
            else
                echo "skip $LIB_FILE of $ARCH";
            fi
        done
    
        if [ "$LIPO_FLAGS" != "" ]; then
            xcrun lipo -create $LIPO_FLAGS -output $UNI_BUILD_ROOT/build/universal/lib/$LIB_FILE
            xcrun lipo -info $UNI_BUILD_ROOT/build/universal/lib/$LIB_FILE
        fi
    }
    
    do_lipo_all () {
        mkdir -p $UNI_BUILD_ROOT/build/universal/lib
        echo "lipo archs: $FF_ALL_ARCHS"
        for FF_LIB in $FF_LIBS
        do
            do_lipo_ffmpeg "$FF_LIB.a";
        done
    
        ANY_ARCH=
        for ARCH in $FF_ALL_ARCHS
        do
            ARCH_INC_DIR="$UNI_BUILD_ROOT/build/ffmpeg-$ARCH/output/include"
            if [ -d "$ARCH_INC_DIR" ]; then
                if [ -z "$ANY_ARCH" ]; then
                    ANY_ARCH=$ARCH
                    cp -R "$ARCH_INC_DIR" "$UNI_BUILD_ROOT/build/universal/"
                fi
    
                UNI_INC_DIR="$UNI_BUILD_ROOT/build/universal/include"
    
                mkdir -p "$UNI_INC_DIR/libavutil/$ARCH"
                cp -f "$ARCH_INC_DIR/libavutil/avconfig.h"  "$UNI_INC_DIR/libavutil/$ARCH/avconfig.h"
                cp -f tools/avconfig.h                      "$UNI_INC_DIR/libavutil/avconfig.h"
                cp -f "$ARCH_INC_DIR/libavutil/ffversion.h" "$UNI_INC_DIR/libavutil/$ARCH/ffversion.h"
                cp -f tools/ffversion.h                     "$UNI_INC_DIR/libavutil/ffversion.h"
                mkdir -p "$UNI_INC_DIR/libffmpeg/$ARCH"
                cp -f "$ARCH_INC_DIR/libffmpeg/config.h"    "$UNI_INC_DIR/libffmpeg/$ARCH/config.h"
                cp -f tools/config.h                        "$UNI_INC_DIR/libffmpeg/config.h"
            fi
        done
    
        for SSL_LIB in $SSL_LIBS
        do
            do_lipo_ssl "$SSL_LIB.a";
        done
    }
    
    #----------
    if [ "$FF_TARGET" = "armv7" -o "$FF_TARGET" = "armv7s" -o "$FF_TARGET" = "arm64" ]; then
        echo_archs
        sh tools/do-compile-ffmpeg.sh $FF_TARGET $FF_TARGET_EXTRA
        do_lipo_all
    elif [ "$FF_TARGET" = "i386" -o "$FF_TARGET" = "x86_64" ]; then
        echo_archs
        sh tools/do-compile-ffmpeg.sh $FF_TARGET $FF_TARGET_EXTRA
        do_lipo_all
    elif [ "$FF_TARGET" = "lipo" ]; then
        echo_archs
        do_lipo_all
    elif [ "$FF_TARGET" = "all" ]; then
        echo_archs
        for ARCH in $FF_ALL_ARCHS
        do
            sh tools/do-compile-ffmpeg.sh $ARCH $FF_TARGET_EXTRA
        done
    
        do_lipo_all
    elif [ "$FF_TARGET" = "check" ]; then
        echo_archs
    elif [ "$FF_TARGET" = "clean" ]; then
        echo_archs
        echo "=================="
        for ARCH in $FF_ALL_ARCHS
        do
            echo "clean ffmpeg-$ARCH"
            echo "=================="
            cd ffmpeg-$ARCH && git clean -xdf && cd -
        done
        echo "clean build cache"
        echo "================="
        rm -rf build/ffmpeg-*
        rm -rf build/openssl-*
        rm -rf build/universal/include
        rm -rf build/universal/lib
        echo "clean success"
    else
        echo "Usage:"
        echo "  compile-ffmpeg.sh armv7|arm64|i386|x86_64"
        echo "  compile-ffmpeg.sh armv7s (obselete)"
        echo "  compile-ffmpeg.sh lipo"
        echo "  compile-ffmpeg.sh all"
        echo "  compile-ffmpeg.sh clean"
        echo "  compile-ffmpeg.sh check"
        exit 1
    fi
    

    module.sh 用来配置 ffmpeg 音视频编解码模块,在 do-compile-ffmpeg.sh 中被调用。我们可以在该文件中开启、或者关闭某些不需要的模块来精简编译的库文件大小,例如我们可以在配置中可以关闭 aac、mp3、h264 编解码模块、解复用模块。

    #! /usr/bin/env bash
    
    #--------------------
    # Standard options:
    export COMMON_FF_CFG_FLAGS=
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --prefix=PREFIX"
    
    # Licensing options:
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-gpl"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-version3"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-nonfree"
    
    # Configuration options:
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-static"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-shared"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-small"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-runtime-cpudetect"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-gray"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-swscale-alpha"
    
    # Program options:
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-programs"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-ffmpeg"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-ffplay"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-ffprobe"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-ffserver"
    
    # Documentation options:
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-doc"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-htmlpages"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-manpages"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-podpages"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-txtpages"
    
    # Component options:
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-avdevice"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-avcodec"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-avformat"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-avutil"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-swresample"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-swscale"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-postproc"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-avfilter"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-avresample"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-pthreads"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-w32threads"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-os2threads"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-network"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-dct"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-dwt"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-lsp"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-lzo"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-mdct"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-rdft"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-fft"
    
    # Hardware accelerators:
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-d3d11va"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-dxva2"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-vaapi"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-vda"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-vdpau"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-videotoolbox"
    
    # Individual component options:
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-everything"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-encoders"
    
    # ./configure --list-decoders
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-decoders"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=aac"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=aac_latm"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=flv"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=h264"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=mp3*"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=vp6f"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=flac"
    
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-hwaccels"
    
    # ./configure --list-muxers
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-muxers"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-muxer=mp4"
    
    # ./configure --list-demuxers
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-demuxers"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=aac"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=concat"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=data"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=flv"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=hls"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=live_flv"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=mov"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=mp3"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=mpegps"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=mpegts"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=mpegvideo"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=flac"
    
    # ./configure --list-parsers
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-parsers"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-parser=aac"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-parser=aac_latm"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-parser=h264"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-parser=flac"
    
    # ./configure --list-bsf
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-bsfs"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bsf=chomp"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bsf=dca_core"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bsf=dump_extradata"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bsf=hevc_mp4toannexb"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bsf=imx_dump_header"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bsf=mjpeg2jpeg"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bsf=mjpega_dump_header"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bsf=mov2textsub"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bsf=mp3_header_decompress"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bsf=mpeg4_unpack_bframes"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bsf=noise"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bsf=remove_extradata"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bsf=text2movsub"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bsf=vp9_superframe"
    
    # ./configure --list-protocols
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-protocols"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-protocol=async"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=bluray"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=concat"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=crypto"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=ffrtmpcrypt"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-protocol=ffrtmphttp"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=gopher"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=icecast"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=librtmp*"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=libssh"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=md5"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=mmsh"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=mmst"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=rtmp*"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-protocol=rtmp"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-protocol=rtmpt"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=rtp"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=sctp"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=srtp"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=subfile"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=unix"
    
    #
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-devices"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-filters"
    
    # External library support:
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-iconv"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-audiotoolbox"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-videotoolbox"
    
    # ...
    
    # Advanced options (experts only):
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --cross-prefix=${FF_CROSS_PREFIX}-"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-cross-compile"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --sysroot=PATH"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --sysinclude=PATH"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --target-os=TAGET_OS"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --target-exec=CMD"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --target-path=DIR"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --toolchain=NAME"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --nm=NM"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --ar=AR"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --as=AS"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --yasmexe=EXE"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --cc=CC"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --cxx=CXX"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --dep-cc=DEPCC"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --ld=LD"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --host-cc=HOSTCC"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --host-cflags=HCFLAGS"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --host-cppflags=HCPPFLAGS"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --host-ld=HOSTLD"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --host-ldflags=HLDFLAGS"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --host-libs=HLIBS"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --host-os=OS"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --extra-cflags=ECFLAGS"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --extra-cxxflags=ECFLAGS"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --extra-ldflags=ELDFLAGS"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --extra-libs=ELIBS"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --extra-version=STRING"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --optflags=OPTFLAGS"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --build-suffix=SUFFIX"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --malloc-prefix=PREFIX"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --progs-suffix=SUFFIX"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --arch=ARCH"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --cpu=CPU"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-pic"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-sram"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-thumb"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-symver"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-hardcoded-tables"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-safe-bitstream-reader"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-memalign-hack"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-lto"
    
    # Optimization options (experts only):
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-asm"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-altivec"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-amd3dnow"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-amd3dnowext"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-mmx"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-mmxext"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-sse"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-sse2"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-sse3"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-ssse3"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-sse4"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-sse42"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-avx"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-fma4"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-armv5te"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-armv6"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-armv6t2"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-vfp"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-neon"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-vis"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-inline-asm"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-yasm"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-mips32r2"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-mipsdspr1"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-mipsdspr2"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-mipsfpu"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-fast-unaligned"
    
    # Developer options (useful when working on FFmpeg itself):
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-coverage"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-debug"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-debug=LEVEL"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-optimizations"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-extra-warnings"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-stripping"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --assert-level=level"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-memory-poisoning"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --valgrind=VALGRIND"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-ftrapv"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --samples=PATH"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-xmm-clobber-test"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-random"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-random"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-random=LIST"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-random=LIST"
    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --random-seed=VALUE"
    

    编译好后,在 build 目录可以看到生成 ffmpeg 库文件。


    生成库文件.jpg
    • 生成通用的framework。在Xcode分别编译模拟器版本的framework和真机版本的framework,然后使用 lipo -create合并成真机和模拟器版本的通用framework。
    lipo -create /Users/qinmin/Library/Developer/Xcode/DerivedData/IJKMediaPlayer-hdimjkvqrwzfuwabyvyurqqznime/Build/Products/Release-iphoneos/IJKMediaFramework.framework/IJKMediaFramework /Users/qinmin/Library/Developer/Xcode/DerivedData/IJKMediaPlayer-hdimjkvqrwzfuwabyvyurqqznime/Build/Products/Debug-iphonesimulator/IJKMediaFramework.framework/IJKMediaFramework -output /Users/qinmin/Library/Developer/Xcode/DerivedData/IJKMediaPlayer-hdimjkvqrwzfuwabyvyurqqznime/Build/Products/Debug-iphoneos/IJKMediaFramework
    
    • 使用ijkplayer。新建项目,然后将 IJKMediaFramework.framework 导入工程中使用。
    //
    //  ViewController.mm
    //  ijkplayer源码阅读01
    //
    //  Created by qinmin on 2017/6/1.
    //  Copyright © 2017年 qinmin. All rights reserved.
    //
    
    #import "ViewController.h"
    #import <IJKMediaFramework/IJKMediaFramework.h>
    
    @interface ViewController ()
    {
        IJKFFMoviePlayerController *_moviePlayer;
    }
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        _moviePlayer = [[IJKFFMoviePlayerController alloc] initWithContentURLString:@"http://zv.3gv.ifeng.com/live/zixun800k.m3u8" withOptions:[IJKFFOptions optionsByDefault]];
        [_moviePlayer setScalingMode:IJKMPMovieScalingModeAspectFit];
        
        UIView *playerView = _moviePlayer.view;
        playerView.bounds = self.view.bounds;
        [self.view addSubview:playerView];
        
        [_moviePlayer prepareToPlay];
    }
    
    - (BOOL)prefersStatusBarHidden
    {
        return YES;
    }
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    @end
    

    总结

    ijkplayer 编译起来还是相对比较简单,许多依赖项都已经脚本化了,能够自动下载、配置、编译。在使用的时候也相对比较容易,但并不是说它不强大。

    Demo地址 : https://github.com/QinminiOS/ijkplayer

    相关文章

      网友评论

      • 68f107f65b8e:你确定./compile-ffmpeg.sh all能正常通过?

      本文标题:ijkplayer源码阅读01-环境搭建

      本文链接:https://www.haomeiwen.com/subject/iqisfxtx.html