首页 >消费 > > 正文

ffmpeg 在 win平台下的编译以及集成

脚本之家 2023-05-02 06:08:45
目录
引言1、交叉编译2、FFmpeg编译3、FFmpeg集成

引言

Java是 write once,run anywhre,但 C 不一样,各平台均有差异,无法只写一次,而且各个平台的编译都不一样。比如android的ndk工具链,不同平台的库都是不一样的


(相关资料图)

本文主要讲解下 ffmpeg 在 win 平台下的编译以及集成

1、交叉编译

交叉编译:交叉编译就是程序的编译环境和实际运行环境不一致,即在一个平台上生成另一个平台上的可执行代码。

为什么要交叉编译,其实之前原因已经说过了,因为不同平台的差异,指令集都不一样,比如win上面是intel的指令集,但android手机上几乎百分百都是arm的指令集,所以直接拿win上编译出来的库给android用,肯定无法使用的,所以需要交叉编译。

交叉编译主要是借助android 的ndk工具包

下面大致列举了一下经常会用到的组件。

ARM 交叉编译器构建工具Java 原生接口头文件C 库Math 库最小的 C++ 库ZLib 压缩库POSIX 线程Android 日志库Android 原生应用 APIOpenGL ES 库OpenSL ES 库

下面来看一下 Android 所提供的 NDK 跟目录下的结构。

ndk-build: 该 Shell 脚本是 Android NDK 构建系统的起始点,一般在项目中仅仅执行这一个命令就可以编译出对应的动态链接库了。ndk-gdb: 该 Shell 脚本允许用 GUN 调试器调试 Native 代码,并且可以配置到 AS 中,可以做到像调试 Java 代码一样调试 Native 代码。ndk-stack: 该 Shell 脚本可以帮组分析 Native 代码崩溃时的堆栈信息。build: 该目录包含 NDK 构建系统的所有模块。platforms: 该目录包含支持不同 Android 目标版本的头文件和库文件, NDK 构建系统会根据具体的配置来引用指定平台下的头文件和库文件。toolchains: 该目录包含目前 NDK 所支持的不同平台下的交叉编译器 - ARM 、X86、MIPS ,目前比较常用的是 ARM 。构建系统会根据具体的配置选择不同的交叉编译器。

toolchains里一般会提供这么一些工具:

CC:编译器,对C源文件进行编译处理,生成汇编文件。AS:将汇编文件生成目标文件(汇编文件使用的是指令助记符,AS将它翻译成机器码)。AR:打包器,用于库操作,可以通过该工具从一个库中删除或者增加目标代码模块。LD:链接器,为前面生成的目标代码分配地址空间,将多个目标文件链接成一个库或者是可执行文件。GDB:调试工具,可以对运行过程中的程序进行代码调试工作。STRIP:以最终生成的可执行文件或者库文件作为输入,然后消除掉其中的源码。NM:查看静态库文件中的符号表。Objdump:查看静态库或者动态库的方法签名。

不过不同版本的ndk,里边的工具不一样,部分新的ndk里可能就没有ar 、strip 之类的,可能在新的ndk里这些工具命名不一样或者是放在其它地方了,比如本人发现的21.1.6352462(win)中包含 strip 和 ar,但 24.0.8215888 版本中没有相关库,而且这几个版本中都没有 nm 库,在编译 ffmpeg时一定会提示找不到nm,幸好 nm不是必须的,不慌,如果遇到找不到相关工具,说明路径设置的有问题,或者根本就是当前版本的ndk中没有此类工具或者已经改名,需要去找找资料看看新版本的工具叫啥或者干脆下载旧版本ndk

2、FFmpeg编译

一名优秀的c++开发,必须得对c++编译有一定了解。前文已经介绍了交叉编译,那现在就来学习如何编译 ffmpeg 吧

在ffmpeg官网下载源码:

git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg

根据自己需要,切换自己想要的版本。

ffmpeg的编译其实已经非常简单了,因为牛逼的ffmpeg开发者提供了一个脚本,叫 configure,其实我们写的编译脚本就是在指定编译工具的位置,然后调用 configure 脚本编译

本人是在win11上编译 ffmpeg,需要下载msys2工具并配置相关环境,必须以管理员运行msys2之后才能来配置环境,否则就会报异常

pacman -S make yasm diffutils pkg-config #在msys2上安装必要软件

然后在ffmpeg文件夹内建脚本文件,并把如下内容贴上:

#!/bin/sh

NDK_PATH=/c/workspace/android_sdk/ndk/21.1.6352462

BUILD_PLATFORM=windows-x86_64

API=21

ANDROID_ARMV5_CFLAGS="-march=armv5te"
ANDROID_ARMV7_CFLAGS="-march=armv7-a -mfloat-abi=softfp -mfpu=neon"
ANDROID_ARMV8_CFLAGS="-march=armv8-a"
ANDROID_X86_CFLAGS="-march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32"
ANDROID_X86_64_CFLAGS="-march=x86-64 -msse4.2 -mpopcnt -m64 -mtune=intel"


# params($1:arch,$2:arch_abi,$3:compiler,$4:cross_prefix,$5:cflags)
build_bin() {

    echo "-------------------star build $2-------------------------"

    ARCH=$1         # arm arm64 x86 x86_64
    # CPU
    ANDROID_ARCH_ABI=$2     # armeabi armeabi-v7a x86 mips

    COMPILER=$3

    PREFIX=$(pwd)/dist/${ANDROID_ARCH_ABI}/

    TOOLCHAIN=${NDK_PATH}/toolchains/llvm/prebuilt/${BUILD_PLATFORM}

    CC=${TOOLCHAIN}/bin/${COMPILER}-clang

    CXX=${TOOLCHAIN}/bin/${COMPILER}-clang++

    SYSROOT=${TOOLCHAIN}/sysroot

    CROSS_PREFIX=${TOOLCHAIN}/bin/$4-

    CFLAGS=$5

    echo "pwd==$(pwd)"
    echo "ARCH==${ARCH}"
    echo "PREFIX==${PREFIX}"
    echo "SYSROOT=${SYSROOT}"
    echo "CFLAGS=${CFLAGS}"
    echo "CC==${CC}"
    echo "CROSS_PREFIX=${CROSS_PREFIX}"

	sh ./configure \
        --prefix=${PREFIX} \
        --enable-neon \
        --enable-hwaccels \
        --enable-gpl \
        --disable-postproc \
        --disable-debug \
        --enable-small \
        --enable-jni \
        --enable-mediacodec \
        --enable-decoder=h264_mediacodec \
        --disable-static \
        --enable-shared \
        --disable-doc \
        --enable-ffmpeg \
        --disable-ffplay \
        --disable-ffprobe \
        --disable-avdevice \
        --disable-doc \
        --disable-symver \
        --target-os=android \
        --arch=${ARCH} \
        --cc=$CC \
        --sysroot=$SYSROOT \
        --enable-cross-compile \
        --cross-prefix=${CROSS_PREFIX} \
        --extra-cflags="-Os -fPIC -DANDROID -Wfatal-errors -Wno-deprecated $CFLAGS" \
        --extra-cxxflags="-D__thumb__ -fexceptions -frtti" \
        --extra-ldflags="-L${SYSROOT}/usr/lib" \

    make clean
    make -j8
    make install


    echo "-------------------$2 build end-------------------------"
}


# build armeabi
# build_bin arm armeabi arm-linux-androideabi arm-linux-androideabi "$ANDROID_ARMV5_CFLAGS"

#build armeabi-v7a
#build_bin arm armeabi-v7a armv7a-linux-androideabi${API} arm-linux-androideabi "$ANDROID_ARMV7_CFLAGS"

#build arm64-v8a
 build_bin arm64 arm64-v8a aarch64-linux-android${API} aarch64-linux-android "$ANDROID_ARMV8_CFLAGS"

#build x86
# build_bin x86 x86 i686-linux-android${API} i686-linux-android "$ANDROID_X86_CFLAGS"

#build x86_64
# build_bin x86_64 x86_64 x86_64-linux-android${API} x86_64-linux-android "$ANDROID_X86_64_CFLAGS"

相关解释:

CC:指定c编译器路径CROSS_PREFIX:指定交叉编译工具文件路径的统一前缀。各个工具的最终文件路径为:cross-prefix + 工具名,比如上面脚本的prefix为TOOLCHAIN/bin/arm-linux-androideabi-,那么ar工具的路径即为TOOLCHAIN/bin/arm-linux-androideabi-artarget-os:指定目标平台,因为 ffmpeg 可以在各平台上运行的,各平台上一些配置不太一样,所以需要指定的

另外编译脚本里边还有大量的 enable disable ,这些都是 configure 脚本里的编译选项,比如说 --enable-shared 意思就是编译动态库,所以上面的脚本最终会生成 so 文件,而不会生成 a 文件。

这些编译选项都可以使用 configure --help,可以查询到,大家可以试试

不管是这些 enable 编译选项,还是像 CC 一类的选项,都是在配置 configure 脚本,通过文本方式打开 configure 文件,可以看到:

--cc=CC                  use C compiler CC [$cc_default]
--target-os=OS           compiler targets OS [$target_os]
--enable-shared          build shared libraries [no]

运行编译脚本之后,如果编译成功了就会看到相关so库了,so库在lib文件夹中

3、FFmpeg集成

首先看cmakelist怎么写:

# 设置最小使用版本
cmake_minimum_required(VERSION 3.18.1)

project("demo")

include_directories(include)

# 添加本地so库 native-lib:这个是声明引用so库的名称 SHARED:表示共享so库文件
# 构建so库的源文件
add_library(
        demo
        SHARED
        native-lib.cpp
)

set(SO_DIR ${CMAKE_SOURCE_DIR}/../jniLibs/${ANDROID_ABI})

# 使用系统ndk 提供的库,如 log库
# log-lib 这个指定的是在NDK库中每个类型的库会存放一个特定的位置,而log库存放
# 在log-lib中
# log 指定使用log库
find_library(
        log-lib
        log
)

message("c_CMAKE_SOURCE_DIR:" ${CMAKE_SOURCE_DIR} )

# 加载avcodec-57库
add_library( avcodec
        SHARED
        IMPORTED)
set_target_properties( avcodec
        PROPERTIES IMPORTED_LOCATION
        ${SO_DIR}/libavcodec.so)

add_library( avutil
        SHARED
        IMPORTED)
set_target_properties( avutil
        PROPERTIES IMPORTED_LOCATION
        ${SO_DIR}/libavutil.so)

add_library( swresample
        SHARED
        IMPORTED)
set_target_properties( swresample
        PROPERTIES IMPORTED_LOCATION
        ${SO_DIR}/libswresample.so)

add_library( avfilter
        SHARED
        IMPORTED)
set_target_properties( avfilter
        PROPERTIES IMPORTED_LOCATION
        ${SO_DIR}/libavfilter.so)

add_library( avformat
        SHARED
        IMPORTED)
set_target_properties( avformat
        PROPERTIES IMPORTED_LOCATION
        ${SO_DIR}/libavformat.so)

add_library( swscale
        SHARED
        IMPORTED)
set_target_properties( swscale
        PROPERTIES IMPORTED_LOCATION
        ${SO_DIR}/libswscale.so)
#----------------------end-----------------------

# 如果你本地的库(native-lib)想要调用log库的方法,
# 那么就需要配置这个属性,意思是把NDK库关联到本地库。
# 第一个参数表示本地的库 native-lib 要调用到log库的方法,即要被关联的库名称,log-lib 要关联的库名称
target_link_libraries(
        demo
        #ffmpeg------start----------
        avcodec
        avutil
        swresample
        avfilter
        avformat
        swscale
        #ffmpeg------end------------
        ${log-lib}
)

其实这些写法都非常简单,如果出错肯定是没写对,注意下相关细节即可。 所有代码均已上传到本人github中

以上就是ffmpeg 在 win平台下的编译以及集成的详细内容,更多关于FFmpeg win编译集成的资料请关注脚本之家其它相关文章!

上一篇:全球动态:我的盖世英雄电视剧演员表_我的盖世英雄电视剧 下一篇:最后一页
x
推荐阅读

ffmpeg 在 win平台下的编译以及集成

2023-05-02

全球动态:我的盖世英雄电视剧演员表_我的盖世英雄电视剧

2023-05-02

马丁:若没有巴特勒我们会明显不一样 会像0-3落后一样打G2_当前焦点

2023-05-02

【全球播资讯】云南景洪通报“网约车司机加价未果拒载”

2023-05-01

天天日报丨无身份证如何坐飞机 没有身份证如何坐飞机

2023-05-01

空乘中专专业院校排名 空乘专业学校排名学校有哪些优势 当前速递

2023-05-01

今日热闻!“西直门三太子”假期荡秋千吃笋,表情亮了!

2023-05-01

手机刷机有什么好处和坏处知乎吧_手机刷机有什么好处和坏处

2023-05-01

新鞋气味大是不是假货_新鞋子气味大是劣质鞋吗

2023-05-01

AOE伤害是指-aoe伤害

2023-05-01

环球视讯!Int'l Workers' Day observed across China

2023-05-01

新注册公司报税流程_新注册公司如何报税-焦点热文

2023-05-01

“港车北上”开放申请后首周每个工作日接受200个申请

2023-05-01

qq永久冻结怎么解除是什么原因_qq永久冻结怎么解除

2023-05-01

徐世昌银元价格(2023年05月01日)-世界信息

2023-05-01

【环球新要闻】荣耀畅玩40曝光:千元机 5100mAh大电池

2023-05-01

历史第一人!库里抢七50+8+6创神迹,魔术师:最伟大个人表演之一 全球实时

2023-05-01

全球热消息:键盘错号怎么打出来(错号怎么打出来)

2023-05-01

上海实施多子女家庭住房公积金支持政策 5月1日起执行

2023-05-01

全球快看点丨孔子诚信的句子经典语录 孔子诚信的句子经典语录图片

2023-05-01

金沙街道大力推进“门前三包”管理工作 展现文明城市新底色 世界快看点

2023-05-01

各部门全力保障旅客出行|焦点关注

2023-05-01

一拳超人全集中配版_一拳超人全集

2023-05-01

热文:汪曾祺短篇小说选_汪曾祺短篇小说代表作

2023-05-01

房子施工知识:如何合理安排家庭装饰装修的费用-全球热头条

2023-05-01

德意志意识形态读后感2000字_德意志意识形态读后感

2023-04-30

环球滚动:这国总统发声:国家间贸易应放弃美元 使用人民币结算!

2023-04-30

【环球时快讯】暴降 13 万 5,白菜价买 5 米 + 豪华 C 级车,开它回家丈母娘两眼放光!

2023-04-30

天天微头条丨全球连线丨(外国人看中国基建)了不起的中国基建——《架桥神器》

2023-04-30

照明设计逻辑 | 让目之所及皆是温暖

2023-04-30

史航被指性骚扰 媒体 :警方应介入是什么情况

2023-04-30

世界播报:no农行

2023-04-30

每日头条!特斯拉Model S/X车型在澳大利亚以及泰国等国家无法通过官网订购

2023-04-30

only time英文歌原唱(only time)

2023-04-30

增强记忆力训练方法:武迪 增强记忆力训练方法

2023-04-30

1949年,张灵甫妻子和两岁儿子的合影,一直孑然一身始终未再嫁

2023-04-30

0-0,5万人花钱买难受!京鲁大战变菜鸡互啄,国安射门<泰山射正

2023-04-30

天天最资讯丨李丰2年前对新消费的10点论断,值得翻出来再看一看!

2023-04-30

每日关注!VC/PE渗透率不到三成!专精特新企业融资难在哪?

2023-04-30

江苏南京:假期首日,文旅市场安全文明 世界报资讯

2023-04-30

『War robots 杂谈』游戏装备之被动模块详解(文字版)-实时焦点

2023-04-30

环球视讯!旅游业复苏在路上!七成公司营收翻番 行业一季度净利同比环比均翻倍

2023-04-30

罗德里戈谈助攻本泽马:过人时不知在想什么,那是自动做出的动作_每日快看

2023-04-30

汕头昨天地震了吗_昨天地震了吗

2023-04-30

【央广时评】数字消费新愿景 经济发展新活力

2023-04-30

我是神经病mc二鬼_我是神经病我要为钱不要命 世界热点

2023-04-30

诺丝克尔_诺斯克尔

2023-04-29

机场_今亮点

2023-04-29

每日消息!今日哪个字不能成语接龙_不能成语接龙的成语

2023-04-29

老友记第六季迅雷下载_老友记第六季 今日播报

2023-04-29

日产“轩逸两厢版” 国内曝光!日本售价约15万人民币

2023-04-29

世界新资讯:cad2014激活码是多少

2023-04-29

各部门优化措施 服务“最热‘五一’假期” 保障出行畅通有序

2023-04-29

中国太保一季度净利润91亿元,寿险银保渠道保费增速“急刹车”

2023-04-29

“丸子头”大熊猫“小丫”已因尿毒症去世!长相潦草的熊猫,只剩“金宝”了

2023-04-29

全球热门:什么是9d电影_什么是九d电影

2023-04-29

如何画香蕉苹果_如何画香蕉简笔画_全球微资讯

2023-04-29

杜源老婆叫什么名字?_杜源的老婆是谁

2023-04-29

《请问您今天要来点兔子吗》推出手办,天天座理世双马尾太可爱了|今日热门

2023-04-29

国羽男女双打亚锦赛四强不入!陈清晨承认技不如人,混双依然强势

2023-04-29

热讯:鸿合科技2022年度净利润逆势增长 彰显强大韧性

2023-04-29

冒险岛神兵传奇无敌幸运版(冒险岛神兵传奇无敌版)

2023-04-29

中央财政下达小麦“一喷三防”补助资金16亿元 天天微动态

2023-04-29

天天时讯:AI板块仍是“最靓的仔”!机构最新调研曝光 这些公司备受“恩宠”

2023-04-29

迎“五一”假期 中国科技馆推出系列科普教育展览活动

2023-04-29

首届人力资源服务国际贸易交流合作大会在青岛成功举办

2023-04-29

劳动合同法第四十一条第一款_劳动合同法第四十一条

2023-04-29

天天看点:曝央视主持欧阳夏丹已离职!背后原因让人泪目,46岁至今仍未婚

2023-04-29

全球观速讯丨探视权到期未起诉怎么办

2023-04-29

sharing怎么读-sharing

2023-04-29

*ST易尚:2022年度净利润约-2.52亿元

2023-04-29

环球看点!双牌:倾情“帮代办” 助力民营企业发展

2023-04-28

环球精选!国有独资公司减资流程_国有独资公司企业减资

2023-04-28

环球简讯:粤泰股份: 广州粤泰集团股份有限公司关于实施其他风险警示的公告

2023-04-28

每日热门:金地首季营业收入143.59亿元 竣工面积134.2万平方米

2023-04-28

天天报道:穿红短裤的交警,你火了!

2023-04-28

全球热头条丨北京赏花指南

2023-04-28

焦点!国家消防救援局发布五一期间安全提示

2023-04-28

【世界速看料】惠河高速:“五一”期间免费通行5天,全线限速80公里/小时

2023-04-28

大宗交易:汇宇制药成交1299万元,折价21.46%(04-28)

2023-04-28

天天短讯!从写字楼文员到翱翔蓝天,这位女飞行员守“沪”空中堡垒!

2023-04-28

每日热讯!极目短评丨骑手拒帮顾客带垃圾下楼遭退单威胁,别将情分视为本分

2023-04-28

热头条丨迈瑞医疗年营收破300亿:同比增20% 国际业务收入超110亿

2023-04-28

每日关注!中国稀土行业协会:今日稀土价格指数较昨日下跌1.2点

2023-04-28

2023江苏连云港市教育局直属学校赴高校公开招聘高层次人才(第二站)参加体检人员名单公布通知

2023-04-28

环球新消息丨安科生物:接受国盛证券等机构调研

2023-04-28

【报资讯】北京-青岛轨道展在青开幕 海信重磅发布“智慧车站解决方案”

2023-04-28

环球消息!惠泰医疗接待AIHC Capital Management等多家机构调研

2023-04-28

郭广昌百亿“清仓”受阻,2300亿巨头又把复星告了

2023-04-28

中国长城董秘回复:公司正在加快推进有关服务器产品的相关工作

2023-04-28

2023青白江幼升小线下审核对象+时间+资料+点位

2023-04-28

德国博世收购美国芯片制造商TSI 世界资讯

2023-04-28

机床上市龙头企业有哪些?(2023/4/28) 世界热点

2023-04-28

语言cos澈夜_语言cos

2023-04-28

第五人格游戏场景_第五人格pc端场景模型显示不全怎么办

2023-04-28

PQube现已入驻微博、B站等国内平台_每日短讯

2023-04-28

中央气象台4月28日10时继续发布暴雨蓝色预警

2023-04-28

世界热头条丨珈伟新能: 2023年第一季度净利润约-1198万元

2023-04-28

环球观天下!养老金2023年一季度新进34股 增持30股

2023-04-28

评论|状态是激发出来的 每日速递

2023-04-28