windows+msys2编译android版ijkplayer

2024-04-08 11:32

本文主要是介绍windows+msys2编译android版ijkplayer,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

近来想研究一下ijkplayer,发现在windows上编译有很多的坑。搞了一天终于能运行example,过程就像排雷一般,但也对整个项目结构了解了一番。记录下来!
可能有些坑没记得写下来,欢迎留言。
下载我改过的文件。

准备材料

  • msys2安装包
  • ndk(我用的14b)
  • 安装android studio

环境配置

安装完msys2后从开始菜单启动msys2 minggw 64-bit,理论上其他两个也可以。
可参考这个https://segmentfault.com/n/1330000004236998进行基本环境配置,
然后使用pacman安装git,make,yasm,python,例如:

pacman -S git

然后安装上ndk。

下载项目

先下载项目。

git clone https://github.com/Bilibili/ijkplayer.git ijkplayer-android
cd ijkplayer-android
git checkout -B latest k0.8.8

再下载依赖库ffmpeg,libyuv,soundtouch,这里脚本中为每个cpu架构都下载了一个对应的ffmpeg,但我对比过都没区别。

./init-android.sh

创建一个文件ndk-source.txt,内容为

export ANDROID_NDK=你自己的ndk目录(E:/ndk/android-ndk-r14b)
export ANDROID_SDK=你自己的sdk目录(C:/Users/Administrator/AppData/Local/Android/Sdk)

注意修改成你自己的ndk和sdk目录。

编译ffmpeg

先source 一下刚才的ndk-source.txt

source ./ndk-source.txt

往下都只编译armv7a架构,我这么做是为了方便排雷,其它的参考修改应该可行。
1.修改android/contrib/tools/do-compile-ffmpeg.sh
我选择level16,其它估计也可行

FF_ANDROID_PLATFORM=android-16

修改armv7a分支下的(其它架构的可以同样修改)

FF_CROSS_PREFIX=$FF_BUILD_ROOT/build/$FF_BUILD_NAME/toolchain/bin/arm-linux-androideabi

还有以下

export COMMON_FF_CFG_FLAGS=
. $FF_BUILD_ROOT/../../config/module-lite.sh
#export PATH=$FF_TOOLCHAIN_PATH/bin/:$PATH
#export CC="ccache ${FF_CROSS_PREFIX}-gcc"
#export CC="${FF_CROSS_PREFIX}-gcc"
#export LD=${FF_CROSS_PREFIX}-ld
#export AR=${FF_CROSS_PREFIX}-ar
#export STRIP=${FF_CROSS_PREFIX}-strip
./configure $FF_CFG_FLAGS --sysroot=$FF_SYSROOT \--extra-cflags="$FF_CFLAGS $FF_EXTRA_CFLAGS" \--extra-ldflags="$FF_DEP_LIBS $FF_EXTRA_LDFLAGS"
$FF_CROSS_PREFIX-gcc -lm -lz -shared --sysroot=$FF_SYSROOT -Wl,--no-undefined -Wl,-z,noexecstack $FF_EXTRA_LDFLAGS \-Wl,-soname,libijkffmpeg.so \$FF_C_OBJ_FILES \$FF_ASM_OBJ_FILES \$FF_DEP_LIBS \-o $FF_PREFIX/libijkffmpeg.so

2.修改你的ndk安装目录下的build/tools/make-standalone-toolchain.sh

python `dirname $0`/make_standalone_toolchain.py \--arch $ARCH $PLATFORM_ARG --stl $STL $INSTALL_ARG $FORCE_ARG

3.修改你ndk安装目录下的build/tools/make-standalone-toolchain.py

THIS_DIR = os.path.dirname(__file__)
NDK_DIR = os.path.join(THIS_DIR, '../..')
def get_host_tag_or_die():"""Return the host tag for this platform. Die if not supported."""if platform.system() == 'Linux':return 'linux-x86_64'elif platform.system() == 'Darwin':return 'darwin-x86_64'#elif platform.system() == 'Windows':else:host_tag = 'windows-x86_64'if not os.path.exists(os.path.join(NDK_DIR, 'prebuilt', host_tag)):host_tag = 'windows'print(host_tag)return host_tagsys.exit('Unsupported platform: ' + platform.system())

最后,执行

cd android/contrib
./compile-ffmpeg.sh clean
./compile-ffmpeg.sh armv7a

编译ijk源码

1.修改android/compile-ijk.sh

do_sub_cmd () {SUB_CMD=$1echo param1 $1if [ -L "./android-ndk-prof" ]; thenecho remove android-ndk-profrm android-ndk-proffiecho PARAM_SUB_CMD $PARAM_SUB_CMDecho SUB_CMD $SUB_CMDecho pwd `pwd`if [ "$PARAM_SUB_CMD" = 'prof' ]; thenecho 'profiler build: YES';ln -s ../../../../../../ijkprof/android-ndk-profiler/jni android-ndk-profelseecho 'profiler build: NO';#ln -s ../../../../../../ijkprof/android-ndk-profiler-dummy/jni android-ndk-profif [ ! -d "android-ndk-prof" ]; thenmkdir -p android-ndk-profcp -R -f ../../../../../../ijkprof/android-ndk-profiler-dummy/jni/* android-ndk-proffifiif [ ! -d "ijkmedia" ]; thenmkdir -p ijkmediacp -R -f ../../../../../../ijkmedia/* ijkmediafi./ijkmedia/ijkplayer/version.sh ./ijkmedia/ijkplayer/ ijkversion.hcase $SUB_CMD inprof)$ANDROID_NDK/ndk-build.cmd $FF_MAKEFLAGS;;clean)$ANDROID_NDK/ndk-build.cmd clean;;rebuild)$ANDROID_NDK/ndk-build.cmd clean$ANDROID_NDK/ndk-build.cmd $FF_MAKEFLAGS;;*)echo before ndk-build$ANDROID_NDK/ndk-build.cmd $FF_MAKEFLAGS;;esac
}

然后先执行一下,目的是把ijkmedia项目拷贝进来,会看到在ndk-build出现错误。

cd ..
./compile-ijk.sh armv7a

然后按以下修改android/ijkplayer/ijkplayer-armv7a/src/main/jni/下的各种android.mk文件(其他架构的可参考修改)
2.修改\src\main\jni\Android.mk

#MY_APP_JNI_ROOT := $(realpath $(LOCAL_PATH))
#MY_APP_PRJ_ROOT := $(realpath $(MY_APP_JNI_ROOT)/..)
#MY_APP_ANDROID_ROOT := $(realpath $(MY_APP_PRJ_ROOT)/../../../..)
MY_APP_JNI_ROOT := $(LOCAL_PATH)
MY_APP_PRJ_ROOT := $(MY_APP_JNI_ROOT)/..
MY_APP_ANDROID_ROOT := $(MY_APP_PRJ_ROOT)/../../../..$(info MY_APP_JNI_ROOT $(MY_APP_JNI_ROOT)) 
#$(info MY_APP_PRJ_ROOT $(MY_APP_PRJ_ROOT)) 
#$(info MY_APP_ANDROID_ROOT $(MY_APP_ANDROID_ROOT)) ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
#MY_APP_FFMPEG_OUTPUT_PATH := $(realpath $(MY_APP_ANDROID_ROOT)/contrib/build/ffmpeg-armv7a/output)
#MY_APP_FFMPEG_INCLUDE_PATH := $(realpath $(MY_APP_FFMPEG_OUTPUT_PATH)/include)
MY_APP_FFMPEG_OUTPUT_PATH := $(MY_APP_ANDROID_ROOT)/contrib/build/ffmpeg-armv7a/output
MY_APP_FFMPEG_INCLUDE_PATH := $(MY_APP_FFMPEG_OUTPUT_PATH)/include

3.修改src\main\jni\ijkmedia\ijkplayer\Android.mk

#
# Copyright (c) 2013 Bilibili
# Copyright (c) 2013 Zhang Rui <bbcallen@gmail.com>
#
# This file is part of ijkPlayer.
#
# ijkPlayer is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# ijkPlayer is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with ijkPlayer; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA$(info ijkmedia/ijkplayer/android.mk) 
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)
# -mfloat-abi=soft is a workaround for FP register corruption on Exynos 4210
# http://www.spinics.net/lists/arm-kernel/msg368417.html
ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
LOCAL_CFLAGS += -mfloat-abi=soft
endif
LOCAL_CFLAGS += -std=c99
LOCAL_LDLIBS += -llog -landroidLOCAL_C_INCLUDES += $(LOCAL_PATH)
LOCAL_C_INCLUDES += $(LOCAL_PATH)/..
LOCAL_C_INCLUDES += $(MY_APP_FFMPEG_INCLUDE_PATH)
LOCAL_C_INCLUDES += $(LOCAL_PATH)/../ijkj4aLOCAL_SRC_FILES += ff_cmdutils.c
LOCAL_SRC_FILES += ff_ffplay.c
LOCAL_SRC_FILES += ff_ffpipeline.c
LOCAL_SRC_FILES += ff_ffpipenode.c
LOCAL_SRC_FILES += ijkmeta.c
LOCAL_SRC_FILES += ijkplayer.cLOCAL_SRC_FILES += pipeline/ffpipeline_ffplay.c
LOCAL_SRC_FILES += pipeline/ffpipenode_ffplay_vdec.cLOCAL_SRC_FILES += android/ffmpeg_api_jni.c
LOCAL_SRC_FILES += android/ijkplayer_android.c
LOCAL_SRC_FILES += android/ijkplayer_jni.cLOCAL_SRC_FILES += android/pipeline/ffpipeline_android.c
LOCAL_SRC_FILES += android/pipeline/ffpipenode_android_mediacodec_vdec.cLOCAL_SRC_FILES += ijkavformat/allformats.c
LOCAL_SRC_FILES += ijkavformat/ijklivehook.c
LOCAL_SRC_FILES += ijkavformat/ijkmediadatasource.c
LOCAL_SRC_FILES += ijkavformat/ijkio.c
LOCAL_SRC_FILES += ijkavformat/ijkiomanager.c
LOCAL_SRC_FILES += ijkavformat/ijkiocache.c
LOCAL_SRC_FILES += ijkavformat/ijkioffio.c
LOCAL_SRC_FILES += ijkavformat/ijkioandroidio.c
LOCAL_SRC_FILES += ijkavformat/ijkioprotocol.c
LOCAL_SRC_FILES += ijkavformat/ijkioapplication.c
LOCAL_SRC_FILES += ijkavformat/ijkiourlhook.cLOCAL_SRC_FILES  += ijkavformat/ijkasync.c
LOCAL_SRC_FILES  += ijkavformat/ijkurlhook.c
LOCAL_SRC_FILES  += ijkavformat/ijklongurl.c
LOCAL_SRC_FILES  += ijkavformat/ijksegment.cLOCAL_SRC_FILES += ijkavutil/ijkdict.c
LOCAL_SRC_FILES += ijkavutil/ijkutils.c
LOCAL_SRC_FILES += ijkavutil/ijkthreadpool.c
LOCAL_SRC_FILES += ijkavutil/ijktree.c
LOCAL_SRC_FILES += ijkavutil/ijkfifo.c
LOCAL_SRC_FILES += ijkavutil/ijkstl.cppLOCAL_SHARED_LIBRARIES := ijkffmpeg ijksdl
LOCAL_STATIC_LIBRARIES := android-ndk-profiler ijksoundtouchLOCAL_MODULE := ijkplayer#$(info VERSION_SH $(LOCAL_PATH)/version.sh) VERSION_SH  = $(LOCAL_PATH)/version.sh
VERSION_H   = ijkversion.h
#$(info $(shell ($(VERSION_SH) $(LOCAL_PATH) $(VERSION_H))))include $(BUILD_SHARED_LIBRARY)

4.修改src\main\jni\ijkmedia\ijksdl\Android.mk

LOCAL_C_INCLUDES += $(LOCAL_PATH)
LOCAL_C_INCLUDES += $(LOCAL_PATH)/..
LOCAL_C_INCLUDES += $(MY_APP_FFMPEG_INCLUDE_PATH)
LOCAL_C_INCLUDES += $(LOCAL_PATH)/../ijkyuv/include
LOCAL_C_INCLUDES += $(LOCAL_PATH)/../ijkj4a

5修改src\main\jni\ijkmedia\ijksoundtouch\Android.mk

LOCAL_C_INCLUDES += $(LOCAL_PATH)
LOCAL_C_INCLUDES += $(LOCAL_PATH)/..
LOCAL_C_INCLUDES += $(LOCAL_PATH)/include/

最后执行

./compile-ijk.sh armv7a

至此build成功了,在src\main\libs\armeabi-v7a下可看到build好的库了。

运行demo

可以直接用as打开android/ijkplayer下的项目进行调试。
这里写图片描述
然后可以开始看代码了哈。

后记

如果嫌麻烦,在linux下按github的流程走其实是个很好的选择,我选择这么干一个是:一开始在网上搜win下编译ijk无果后心有不甘,另一个是想着在排雷过程中能对整个项目结构进行了解。

这篇关于windows+msys2编译android版ijkplayer的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/885466

相关文章

javafx 如何将项目打包为 Windows 的可执行文件exe

《javafx如何将项目打包为Windows的可执行文件exe》文章介绍了三种将JavaFX项目打包为.exe文件的方法:方法1使用jpackage(适用于JDK14及以上版本),方法2使用La... 目录方法 1:使用 jpackage(适用于 JDK 14 及更高版本)方法 2:使用 Launch4j(

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

windows端python版本管理工具pyenv-win安装使用

《windows端python版本管理工具pyenv-win安装使用》:本文主要介绍如何通过git方式下载和配置pyenv-win,包括下载、克隆仓库、配置环境变量等步骤,同时还详细介绍了如何使用... 目录pyenv-win 下载配置环境变量使用 pyenv-win 管理 python 版本一、安装 和

Python使用pysmb库访问Windows共享文件夹的详细教程

《Python使用pysmb库访问Windows共享文件夹的详细教程》本教程旨在帮助您使用pysmb库,通过SMB(ServerMessageBlock)协议,轻松连接到Windows共享文件夹,并列... 目录前置条件步骤一:导入必要的模块步骤二:配置连接参数步骤三:实例化SMB连接对象并尝试连接步骤四:

Android WebView的加载超时处理方案

《AndroidWebView的加载超时处理方案》在Android开发中,WebView是一个常用的组件,用于在应用中嵌入网页,然而,当网络状况不佳或页面加载过慢时,用户可能会遇到加载超时的问题,本... 目录引言一、WebView加载超时的原因二、加载超时处理方案1. 使用Handler和Timer进行超

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

maven 编译构建可以执行的jar包

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」👈,「stormsha的知识库」👈持续学习,不断总结,共同进步,为了踏实,做好当下事儿~ 专栏导航 Python系列: Python面试题合集,剑指大厂Git系列: Git操作技巧GO

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动