jni 学习FFmpeg-learning 笔记

没有找到比helloworld稍微复杂一点点的jni学习相关资料,但是找到 ffmpeg 相关的demo,看起来还挺难的。

项目地址:https://github.com/whenSunSet/FFmpeg-learning/tree/master/app

他的简书:https://www.jianshu.com/u/45661204c0d6

这个项目是别的博主的源码地址,也在他自己的博客里面做了详细的说明。

1.创建一个新的project -> FFmpegPlayer

2.新建一个 java 类 FFmpegSamplePlayer 用它来实现播放的功能

需要用到 ffmpeg 的so 文件,这里我们可以自己编译so文件.

// 创建一个 build_ffmpeg 的 task,其负责运行shell 脚本
task build_ffmpeg {
    doLast {
        exec {
            commandLine 'sh', 'D:/Personal/FfmpegSimplePlayer/app/build_ffmpeg.sh'
        }
    }
}

// 将 build_ffmpeg 这个 task 作为编译的前置任务来执行。
tasks.whenTaskAdded { task ->
    task.dependsOn 'build_ffmpeg'
}

 然后build.gradle里面添加task 执行shell 脚本,这里有个深坑,一直报错找不到文件,不知道怎么解决,放弃吧。

Caused by: java.io.IOException: Cannot run program "sh" (in directory "D:\Personal\FfmpegSimplePlayer\app"): CreateProcess error=2,
 系统找不到指定的文件。
	at net.rubygrapefruit.platform.internal.DefaultProcessLauncher
.start(DefaultProcessLauncher.java:25)
	... 7 more
Caused by: java.io.IOException: CreateProcess error=2, 系统找不到指定的文件。
	... 8 more

安装cygwin:https://www.cnblogs.com/CharlesGrant/p/4763571.html 我只选了这里面列出的项目,里面匹配不精确的我把相关的都打勾了。因为我只用ndk 相关的其他的用不着,下载也没那么慢,不然要下载好久!

下面就是利用cygwin 编译出so文件了

直接在ffmpeg 源码里面添加一个shell 脚本

#!/bin/bash
basepath=$(cd `dirname $0`; pwd)
export TMPDIR=$basepath/ffmpegtemp
# NDK的路径,根据自己的安装位置进行设置
NDK=E:/AndroidStudio/SDK/ndk-bundle
# 编译针对的平台,可以根据自己的需求进行设置
# 这里选择最低支持android-14, arm架构,生成的so库是放在
# libs/armeabi文件夹下的,若针对x86架构,要选择arch-x86
PLATFORM=$NDK/platforms/android-16/arch-arm
# 工具链的路径,根据编译的平台不同而不同
# arm-linux-androideabi-4.9与上面设置的PLATFORM对应,4.9为工具的版本号,
# 根据自己安装的NDK版本来确定,一般使用最新的版本
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64

CPU=arm

echo $basepath

FDK_INCLUDE=$basepath/fdk-aac-0.1.5/android/$CPU/include

FDK_LIB=$basepath/fdk-aac-0.1.5/android/$CPU/lib

X264_INCLUDE=$basepath/libx264/android/$CPU/include

X264_LIB=$basepath/libx264/android/$CPU/lib

FF_EXTRA_CFLAGS="-O3 -fpic -fasm -Wno-psabi -fno-short-enums -fno-strict-aliasing -finline-limit=300 -mfloat-abi=softfp -mfpu=vfp -marm -march=armv6 "
FF_CFLAGS="-O3 -Wall -pipe \
-ffast-math \
-fstrict-aliasing -Werror=strict-aliasing \
-Wno-psabi -Wa,--noexecstack \
-DANDROID  "
PREFIX=./android/$CPU

rm "./compat/strtod.c"

build_one(){

echo "configure start"

./configure \
--prefix=$PREFIX \
--enable-cross-compile \
--disable-runtime-cpudetect \
--disable-asm \
--arch=$CPU \
--target-os=android \
--cc=$TOOLCHAIN/bin/arm-linux-androideabi-gcc \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--disable-stripping \
--nm=$TOOLCHAIN/bin/arm-linux-androideabi-nm \
--sysroot=$PLATFORM \
--extra-cflags="-I$X264_INCLUDE  -I$FDK_INCLUDE " \
--extra-ldflags="-L$FDK_LIB -L$X264_LIB" \
--enable-gpl \
--enable-shared \
--disable-static \
--enable-version3 \
--enable-pthreads \
--enable-small \
--disable-vda \
--disable-iconv \
--disable-encoders \
--enable-libx264 \
--enable-neon \
--enable-yasm \
--enable-libfdk_aac \
--enable-encoder=libx264 \
--enable-encoder=libfdk_aac \
--enable-encoder=mjpeg \
--enable-encoder=png \
--enable-nonfree \
--enable-muxers \
--enable-muxer=mov \
--enable-muxer=mp4 \
--enable-muxer=h264 \
--enable-muxer=avi \
--disable-decoders \
--enable-decoder=aac \
--enable-decoder=aac_latm \
--enable-decoder=h264 \
--enable-decoder=mpeg4 \
--enable-decoder=mjpeg \
--enable-decoder=png \
--disable-demuxers \
--enable-demuxer=image2 \
--enable-demuxer=h264 \
--enable-demuxer=aac \
--enable-demuxer=avi \
--enable-demuxer=mpc \
--enable-demuxer=mov \
--enable-demuxer=mpegts \
--disable-parsers \
--enable-parser=aac \
--enable-parser=ac3 \
--enable-parser=h264 \
--enable-protocols \
--enable-zlib \
--enable-avfilter \
--disable-outdevs \
--disable-ffprobe \
--disable-ffplay \
--disable-ffmpeg \
--disable-ffserver \
--disable-debug \
--disable-ffprobe \
--disable-ffplay \
--disable-ffmpeg \
--disable-postproc \
--disable-avdevice \
--disable-symver \
--disable-stripping \
--extra-cflags="$FF_EXTRA_CFLAGS  $FF_CFLAGS" \
--extra-ldflags="  "

echo "configure  end"
}
build_one


make clean
make -j16
make install

cp $FDK_LIB/libfdk-aac.so $PREFIX/lib

都是抄的脚本,都差不多,上面这个很多路径都没用,还是不要使用上面这个吧。

然后会报错,说找不到makefile 文件

这里要先执行 cd ffmpeg  进入源码路径

./configure --disable-yasm  

完成之后会生成 configure.h 文件,这个时候再去执行sh 脚本就可以了。

但是我的没生成so 文件,生成了 几个.exe 文件,很费解!

后来在cygwin 的文件夹下面 找到了!!!!

 

为啥是.a 不是.so  我也不知道啊,查了下资料说 .a 是静态库,.so是动态库,应该是./configure 没配置好后面再试吧

总结:

1.下载ffmpeg 源码 

2.下载ndk  androidstudio直接下载

3.下载cygwin (下载 yasm 放到 cygwin bin 目录下)

4.打开 cygwin 进入 ffmpeg 目录 配置 ./configure --disable-yasm

5.网上找一个编译ffmpeg 的.sh 脚本,用notepad++(非常小,可以自己下载) 打开,改格式(编辑)unix,不然会出现各种报错

6.cygwin 执行 .sh脚本

7.执行完成之后发现 ffmpeg 目录下多了 几个.exe 文件,.a文件在cygwin 的目录下

8.ffmpeg 这玩意儿是真的坑,找了两天每次都成功了,就是找不到文件在哪!那个设置输出路径貌似没用。

以为这样就成功了,后来才发现是编译一开始就出错了,只是我忽略了。

爬坑指南:https://blog.csdn.net/yyo201/article/details/89849638

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值