windows android ffmpeg,2.0-FFMPEG-Android基于WIN10快速编译FFMPEG

前言

基于 WIN10 提供的 WSL 功能可快速搭建 linux(unbuntu)开发环境,最重要的是两个系统之间文件互通!文件互通!文件互通!这里我们将利用该功能编译 FFMPEG 的链接库(本文章以静态库为例)。

开启WSL

开启该功能需要重启系统才能生效,请注意保存数据!

打开控制面板

切换查看方式为小图标,寻找并打开程序和功能

a311e5be41cd57da32b18d8fce1a6932.png

侧边栏进入 - 启动或关闭Windows功能

dae5013712e305a210d884f6d54506a3.png

开启WSL

找到并开启子系统

080128ac7503dac3e4cf909aec544277.png

下载linux系统

打开Windows应用商店,搜索ubuntu并选择其中任意的一个版本下载安装即可。我这里用的是最高版本 20.04 LTS 。经过验证,同时下载安装多个版本并不会造成任何不良影响,且各版本之间运行相互独立互不干扰。

78e2ff9efbf44d6f03015ddbb35142a9.png

启动ubuntu

这里我们找到并启动unbuntu。注意:首次启动会要求新建用户并创建密码。(这里我已经创建好了就略过了,大家自行尝试即可)

40bb94e2e79e22b2f674aaebc547ebd8.png

当看到如下界面时,即表示ubuntu系统已成功运行!可以开始编译FFMPEG!

9f4272236a29f60cb314a6ef554e82c8.png

注意:

unbuntu系统的文件路径见下图:

7628271706890681db9c1b76a5758f8a.png

开始编译FFMEPG

这里我们是以ndk-r17c + FFMPEG-4.0.5为准进行编译工作。至于为什么选择用r17c是由于google已经在r18版本中移除了gcc编译器,所以r17c是gcc可用的最高ndk版本,见下图。

如果需要编译最新版本的ffmpeg请使用更高版本(r18及以上)的ndk并使用clang编译器。具体可参考一下链接:

f8fc37022e51b882254663f011e4e6be.png

注意:

1. 粘贴内容到unbuntu窗口中只需要鼠标右键即可。

2. 下文出现的junt为本人创建的用户名!请自行替换!

3. 以下所有操作请在管理员权限下进行:

a. sudo -s

b. 输入之前创建的密码

成功进入管理员模式见下图:

复制代码

b29de8a3088474e9b9f916f085bf3d89.png

下载并配置ndk

利用wget命令下载ndk:

wget https://dl.google.com/android/repository/android-ndk-r17c-windows-x86_64.zip

利用unzip命令解压压缩包:

unzip android-ndk-r17c-linux-x86_64.zip

复制代码

a298b4517e38f20961310ba8bf393b0a.png

利用ls命令查看解压后的ndk文件夹:

(这里文件夹有点多,是因为我尝试了不同版本的ffmpeg,请先忽略。)

复制代码

ca31c62a2a7f6b0a9222b5dd86aa83a0.png

配置ndk环境变量

编辑profile文件:

键入命令vim /etc/profile

按下insert按键进入编辑模式

在profile文件的最后添加ndk路径,见下图:

复制代码

5daab64c702cf71b49dbecd3f3e69f3f.png

编辑完成后按下Esc按键,并键入 :wq (注意这里的英文字符:),回车保存。

复制代码

b18283590f79ba4d637129a69130b59c.png

利用source命令使得环境变量生效:

source /etc/profile

看到如下启动提示则代表环境变量已生效:

复制代码

2946fd2b3f827496e39edffaae2ad4b2.png

验证ndk-build命令,如果出现找不到项目路径则代表ndk运行正常:

复制代码

a1006389e10678df73eb3a44999f7901.png

下载ffmpeg

(如果真实用于项目,并不推荐使用最新版本得ffmpeg,尤其是4.2网上)

利用wget命令下载ffmpeg:

wget https://ffmpeg.org/releases/ffmpeg-4.0.5.tar.bz2

利用tar命令解压压缩包:

tar -jxvf ffmpeg-4.0.5.tar.bz2

复制代码

9e8a8f231c6164bf2987f0dd9bb9a747.png

利用ls命令查看解压后的ffmpeg文件夹:

复制代码

e8cedabd2d18962183b9e70487eca963.png

编译FFMPEG

进入ffmpeg文件夹:

cd ffmpeg-4.0.5

复制代码

ecef9aed07bc4a0ed984cfae623cc2ba.png

新建编译脚本build.sh:

vim build.sh

脚本内容如下(来自某易学员的分享,如果需要编译多版本请参考1.0-FFMPEG-Android利用ndk(r20)编译最新版本ffmpeg4.2.1):

#!/bin/bash

#注意此处的NDk路径需要自行替换

NDK_ROOT=/home/junt/android-ndk-r17c

#TOOLCHAIN 变量指向ndk中的交叉编译gcc所在的目录

TOOLCHAIN=$NDK_ROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/

#FLAGS与INCLUDES变量 可以从AS ndk工程的.externativeBuild/cmake/debug/armeabi-v7a/build.ninja中拷贝,需要注意的是**地址**

FLAGS="-isystem $NDK_ROOT/sysroot/usr/include/arm-linux-androideabi -D__ANDROID_API__=21 -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb -Wa,--noexecstack -Wformat -Werror=format-security -std=c++11 -O0 -fPIC"

INCLUDES="-isystem $NDK_ROOT/sources/cxx-stl/llvm-libc++/include -isystem $NDK_ROOT/sources/android/support/include -isystem $NDK_ROOT/sources/cxx-stl/llvm-libc++abi/include"

#--prefix : 安装目录

#--enable-small : 优化大小

#--disable-programs : 不编译ffmpeg程序(命令行工具),我们是需要获得静态(动态)库。

#--disable-avdevice : 关闭avdevice模块,此模块在android中无用

#--disable-encoders : 关闭所有编码器 (只播放不需要编码)

#--disable-muxers : 关闭所有复用器(封装器),不需要生成mp4这样的文件,所以关闭

#--disable-filters :关闭视频滤镜

#--enable-cross-compile : 开启交叉编译(ffmpeg比较**跨平台**,并不是所有库都有这么happy的选项 )

#--cross-prefix: 看右边的值应该就知道是干嘛的,gcc的前缀 xxx/xxx/xxx-gcc 则给xxx/xxx/xxx-

#disable-shared enable-static 不写也可以,默认就是这样的。

#--sysroot:

#--extra-cflags: 会传给gcc的参数

#--arch --target-os :

PREFIX=./android/armeabi-v7a

bash ./configure \

--prefix=$PREFIX \

--prefix=$PREFIX \

--enable-small \

--disable-programs \

--disable-avdevice \

--disable-encoders \

--disable-muxers \

--disable-filters \

--enable-cross-compile \

--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \

--enable-shared \

--disable-static \

--sysroot=$NDK_ROOT/platforms/android-21/arch-arm \

--extra-cflags="$FLAGS $INCLUDES" \

--extra-cflags="-isysroot $NDK_ROOT/sysroot" \

--arch=arm \

--target-os=android

make clean

make install

编辑完成后按下Esc按键,并键入 :wq (注意这里的英文字符:),回车保存。

运行编译:

sh build.sh

编译完成后,会在ffmpeg文件夹下生成android文件夹,这里我们在windows下即可查看静态库文件:

复制代码

c224b33dc2c264289555f355a458541c.png

5b8b6edefc1a7c7b6d39a7a8e4c65905.png

具体如何寻找FLAGS与INCLUDES见下图,自行替换ndk路径:

复制代码

2e5a00e651751cfb6f97a7dcacae669b.png

导入AndroidStudio运行

新建native-c++工程

由于我们上面编译时是使用的21版本,所以这里的sdk版本请选择21及已上!e1a1a6fb4d074762e65b29857c37f3fe.png

导入ffmpeg

同时需要头文件以及.a静态库78a3457e048d7daa42d1606aab6247aa.png

编辑CMakeLists.txt

cmake_minimum_required(VERSION 3.4.1)

add_library(

native-lib

#将所有的cpp文件打包成so动态库(apk解压后lib目录下可见native-lib.so)

SHARED

native-lib.cpp )

include_directories(include)

set(my_lib_path ${CMAKE_SOURCE_DIR}/libs/${ANDROID_ABI})

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${my_lib_path}")

target_link_libraries(

native-lib

-Wl,--start-group

avformat avcodec avutil avfilter swresample swscale

-Wl,--end-group

z

OpenSLES

log

)

复制代码

配置build.gradle(Module:app)

externalNativeBuild {

cmake {

cppFlags ""

abiFilters "armeabi-v7a"

}

}

ndk{

abiFilters "armeabi-v7a"

}

复制代码

8cb6cbc2308faaa16ed0270f26bf9a75.png

验证ffmpeg

//修改native-lib.cpp返回ffmpeg版本信息

#include

#include

extern "C"{

#include

}

extern "C" JNIEXPORT jstring JNICALL

Java_com_example_ffmpegdemo_MainActivity_stringFromJNI(

JNIEnv* env,

jobject /* this */){

return env->NewStringUTF(av_version_info());

}

运行app效果如下则代表ffmpeg运行成功:

复制代码

b4acbca686b2ca3e6b4764b69d5868ec.png

适配AndroidQ

/**

* 这里通过系统默认的文件选择器来选择一个视频文件

*/

public void selectMedia(View view){

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);

intent.setType("video/*");

intent.addCategory(Intent.CATEGORY_OPENABLE);

startActivityForResult(intent, 99);

}

/**

* 拿到Uri后做如下转换

*/

@Override

protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data){

super.onActivityResult(requestCode, resultCode, data);

if (data != null) {

try {

Uri uri = data.getData();

ParcelFileDescriptor parcelFileDescriptor = getContentResolver().openFileDescriptor(uri, "r");

int pid = android.os.Process.myPid();

String path = "/proc/" + pid + "/fd/" + parcelFileDescriptor.dup().getFd();

//传递到native层的cpp中

//const char *dataSource = env->GetStringUTFChars(path, 0);

//avformat_open_input(&avFormatContext, dataSource, 0, &dictionary);

//用完后释放ReleaseStringUTFChars(data_source_, dataSource);

} catch (Exception e) {

e.printStackTrace();

}

}

}

复制代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hyper fast Audio and Video encoder usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}... Getting help: -h -- print basic options -h long -- print more options -h full -- print all options (including all format and codec specific options, very long) See man ffmpeg for detailed description of the options. Print help / information / capabilities: -L show license -h topic show help -? topic show help -help topic show help --help topic show help -version show version -buildconf show build configuration -formats show available formats -devices show available devices -codecs show available codecs -decoders show available decoders -encoders show available encoders -bsfs show available bit stream filters -protocols show available protocols -filters show available filters -pix_fmts show available pixel formats -layouts show standard channel layouts -sample_fmts show available audio sample formats -colors show available color names -sources device list sources of the input device -sinks device list sinks of the output device Global options (affect whole program instead of just one file: -loglevel loglevel set logging level -v loglevel set logging level -report generate a report -max_alloc bytes set maximum size of a single allocated block -y overwrite output files -n never overwrite output files -stats print progress report during encoding -max_error_rate ratio of errors (0.0: no errors, 1.0: 100% error maximum error rate -bits_per_raw_sample number set the number of bits per raw sample -vol volume change audio volume (256=normal) Per-file main options: -f fmt force format -c codec codec name -codec codec
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值