ffmpeg的使用
本文章记录ffmpeg 源码下载,编译,及使用。
一、FFMPEG 源码下载解压
源码官网地址:http://ffmpeg.org/download.html#releases
下载最新版本ffmpeg6.0。
使用命令tar xvJf ffmpeg-6.0.tar.xz
解压。
二、了解FFMPEG源码
(一)configure编译脚本及帮助命令
./configure --help -->ffmpeg_help.txt
1、Shell脚本:由第一行Shell解释器声明 #!/bin/sh
代码,可以看出,configure是Shell脚本。
2、configure 脚本作用:该脚本用于生成make工具的构建脚本Makefile文件。
3、configure脚本执行:该脚本需要进行配置才能执行,如果直接执行,会报错。
4、configure帮助命令:
1)脚本复杂:c/c++开源库都会提供一个configure脚本,该脚本的配置非常复杂,但一般都提供一个帮助选项;
2)帮助信息:执行./configure --help
既可查看帮助信息。建议先将帮助信息熟悉一遍后再进行编译。
(二)配置configure脚本
1、FFMPEG编译流程
1)配置:使用configure脚本进行相关参数的配置。
2)编译:配置完毕后,直接执行make命令,开始进行编译。
2、配置的内容
1)输出配置:配置 生成的相关文件输出路径;
2)函数库配置:配置静态库,动态库。函数库优化等相关参数。
3)命令行程序配置:配置是否生成命令行程序,FFMPEG 自带3个命令行程序。
4)编译组件配置:FFMPEG有22个可选的独立组件配置,可以选择性编译或不编译某些组件。
5)编码解码配置:配置FFMPEG编解码功能。
6)交叉编译配置(重点):配置交叉编译工具链、头文件、库文件查找路径参数,GCC编译器参数,CPU架构等参数。
(三)输出目录配置
1 、生成文件的输出目录 : FFMPEG 编译后需要生成一系列的函数库 , 及头文件等 ; 需要为这些生成的文件指定输出目录 。
2、指定生成的文件输出位置 。
1)定义变量 : 使用 PREFIX=./android/arme64-v8a命令 , 定义输出目录根目录变量;
2) 路径配置 : 使用 ./configure --prefix=PREFIX 命令 , 指定输出文件的根目录为 ./android/arme64-v8a ;
# 将输出目录存储到 PREFIX 变量中
PREFIX=./android/arme64-v8a# 执行 configure 脚本配置输出文件的根目录
./configure --prefix=$PREFIX
3、自动生成其它目录 : 指定了 --prefix 选项 , 那么其它生成 bin 可执行文件目录 , lib 函数库目录 等类型的文件输出目录会在 --prefix 配置的目录基础上生成 。
1) 根目录 : 指定了 --prefix 目录为 ./android/arme64-v8a ;
2) 可执行文件目录 : 自动生成的可执行文件输出目录为 PREFIX/bin , 即 ./android/arme64-v8a/bin ;
3) 函数库目录 : 自动生成的函数库数据目录为 PREFIX/lib , 即 ./android/arme64-v8a/lib ;
其它的标准选项配置 ( Standard options ) 请仔细阅读下面的 configure 帮助文档内容 ;
(四)函数库配置
1、 函数库配置 : FFMPEG 编译时 , 可以选择编译静态库或动态库 , 及设置编译函数库的行为 ;
2、 默认编译的函数库 : FFMPEG 默认编译静态库 , 此处也推荐在 Android 中使用 FFMPEG 静态库开发音视频功能 , 保持默认状态即可 ;
3、优化函数库 :
1)设置后效果 : FFMPEG 编译时可以选择优化函数库大小 , 让编译出来的函数库尽可能小 , 但相应的编译速度会降低很多 ;
2)设置的要性 : 由于是在 Android 中进行开发 , 为了使打包后的 APK 文件尽可能小 , 这里我们需要开启该选项 ;
3)设置命令 : 调用 ./configure --enable-small 命令 , 启用优化函数库大小的功能;
# 启用函数库大小优化
./configure --enable-small
其它的配置选项 ( Configuration ) 请仔细阅读下面的 configure 帮助文档内容 ;
(五)程序配置选项
1)FFMPEG 命令行程序 : FFMPEG 提供了一些可执行的命令行程序 , 如 ffmpeg.exe , ffplay.exe , ffprobe.exe 等程序 ;
2) 使用情况 : 在 Android 开发中只需要 FFMPEG 的函数库 , 不需要这些程序 , 建议关闭命令行程序编译选项 ;
3)配置命令 : 调用 ./configure --disable-programs 命令 , 关闭编译命令行程序的功能 。
# 关闭编译命令行程序
./configure --disable-programs
其它的配置选项 ( Configuration ) 请仔细阅读下面的 configure 帮助文档内容
(六)组件配置选项
1、组件配置选项
默认状态 : FFMPEG 组件选项 , 默认都是打开的 , 如果需要关闭某一个需要单独配置
2、FFMPEG 常用组件
1)avdevice 组件 : 操作摄像头等视频设备 , Android 中是不支持该操作 , 需要手动关闭;
2)avcodec 组件 : 声音 / 图像编解码组件;
3)avformat 组件 : 音视频封装格式生成或解析;
4)swresample 组件 : 音频重采样 , 修改音频参数;
5)swscale 组件 : 视频场景比例缩放 , 色彩映射转换;
6)postproc 组件 : 后期效果处理 , 这里不需要 , 需要手动关闭;
7) avfilter 组件 : 过滤器 , 添加字幕水印。
3、关闭 avdevice 配置命令 : 调用 ./configure --disable-avdevice 命令 , 关闭 avdevice 模块编译。
# 关闭编译命令行程序
./configure --disable-avdevice
其它的组件配置选项 ( Configuration ) 请仔细阅读下面的 configure 帮助文档内容 。
(七)编码配置
1、提供的编码配置
1)编码器 : 关闭指定编码器 , 关闭所有编码器 , 打开指定编码器;
2)解码器 : 关闭指定解码器 , 关闭所有解码器 , 打开指定解码器;
2、 关闭编码配置命令 : 调用 ./configure --disable-encoders 命令 , 关闭编码器模块编译
# 关闭编译编码器
./configure --disable-encoders
3、 关闭混合封装配置命令 : 调用 ./configure --disable-muxers 命令 , 关闭混合封装模块编译
# 关闭混合封装
./configure --disable-muxers
4、关闭视频滤镜配置命令 : 调用 ./configure --disable-filters 命令 , 关闭视频滤镜模块编译
# 关闭视频滤镜
./configure --disable-filters
其它的单个组件配置选项 ( Configuration ) 请仔细阅读下面的 configure 帮助文档内容
三、交叉编译
(一) ffmpeg4.1.11 + ndk17 编译arm32平台库
参考文章:参考博客https://blog.csdn.net/shulianghan/article/details/104351312
1、官网下载ffmpeg4.1.11版本,并解压。省略
2、官网下载ndk17版本。省略。
具体方法参考文章“ndk开发-交叉编译”。
3、执行./configure
- 进入ffmpeg-4.1.11文件夹;
cd ffmpeg-4.1.11
2)修改权限到root权限;
sudo su root
3)执行命令;
./configure
执行后,我这里会报错,如下。
解决方案:安装asm.
下载yasm-1.3.0版本并解压。下载地址http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz
http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz
tar -zxvf yasm-1.3.0.tar.gz
进入yasm-1.3.0文件夹,执行./configure
执行make指令
安装成功。
再回到ffmpeg-4.1.11文件夹,执行./configure指令,不会报错。
4)编写编译脚本
将参考文章https://blog.csdn.net/shulianghan/article/details/104351312中的编译脚本拷贝过来。修改。
a 新建“build_ffmpeg.sh”文件夹;
b 拷贝编译脚本,并修改ndk根目录。
#!/bin/bash# NDK 根目录(按照自己的路径修改)
NDK_ROOT=/home/vagrant/software/ndk/android-ndk-r17c# TOOLCHAIN 变量指向 gcc g++ 等交叉编译工具所在的目录
TOOLCHAIN=$NDK_ROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64# gcc 编译器参数
FLAGS="-isysroot $NDK_ROOT/sysroot -isystem $NDK_ROOT/sysroot/usr/include/arm-linux-androideabi -isystem $NDK_ROOT/sources/android/support/include -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 -O0 -fPIC"# 编译结果输出路径
PREFIX=./android/armeabi-v7a# 执行 configure 脚本生成 Makefile 构建脚本
./configure \
--prefix=$PREFIX \
--enable-small \
--disable-programs \
--disable-avdevice \
--disable-encoders \
--disable-muxers \
--disable-filters \
--enable-cross-compile \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--sysroot=$NDK_ROOT/platforms/android-21/arch-arm \
--extra-cflags="$FLAGS" \
--arch=arm \
--target-os=android # 清除之前的编译内容
make clean# 开启新的 FFMPEG 编译
make install
c 在ffmpeg文件夹新建android/armeabi-v7a文件夹。
d chmod 777 build_ffmpeg.sh
添加权限
e ./build_ffmpeg.sh
执行脚本
生成一下文件,说明编译成功。可以使用file xxx查看生成的库文件是否为arm32平台。
注意:很奇怪,使用同样的linux环境,ndk和ffmpeg第一次用该脚本编译,报错。今天重新做一遍又不会报错。把报错及解决方法记录一下。
修改方法:去掉脚本中“-D__ANDROID_API__=21 -g -DANDROID”
,完成脚本如下,可以编译so 动态库和静态库。
#!/bin/bash# NDK 根目录
NDK_ROOT=/home/vagrant/software/ndk/android-ndk-r17c# TOOLCHAIN 变量指向 gcc g++ 等交叉编译工具所在的目录
TOOLCHAIN=$NDK_ROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64# gcc 编译器参数
FLAGS="-isysroot $NDK_ROOT/sysroot -isystem $NDK_ROOT/sysroot/usr/include/arm-linux-androideabi -isystem $NDK_ROOT/sources/android/support/include -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 -O0 -fPIC"#FLAGS="-isysroot $NDK_ROOT/sysroot -isystem $NDK_ROOT/sysroot/usr/include/arm-linux-androideabi -isystem $NDK_ROOT/sources/android/support/include -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 -O0 -fPIC"# 编译结果输出路径
PREFIX=./android/armeabi-v7a# 执行 configure 脚本生成 Makefile 构建脚本
./configure \
--prefix=$PREFIX \
--enable-small \
--disable-programs \
--enable-static \
--enable-shared \
--disable-avdevice \
--disable-encoders \
--disable-muxers \
--disable-filters \
--enable-cross-compile \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--sysroot=$NDK_ROOT/platforms/android-21/arch-arm \
--extra-cflags="$FLAGS" \
--arch=arm \
--target-os=android # 清除之前的编译内容
make clean# 开启新的 FFMPEG 编译
make install#--extra-cflags="$FLAGS" \
相关文章:
ffmpeg的使用
本文章记录ffmpeg 源码下载,编译,及使用。 一、FFMPEG 源码下载解压 源码官网地址:http://ffmpeg.org/download.html#releases 下载最新版本ffmpeg6.0。 使用命令tar xvJf ffmpeg-6.0.tar.xz 解压。 二、了解FFMPEG源码 (一&am…...
深度强化学习算法的参数更新时机
深度强化学习算法的参数更新时机 深度强化学习中往往涉及到多个神经网络来拟合策略函数、值函数等,什么时候更新参数因算法而异,与具体算法架构/算法思想紧密相关。 算法参数更新时机架构DQN先收集一定经验,然后每步更新Off Policy Value-B…...
【进阶篇】MySQL的MVCC实现机制详解
文章目录 0.前言1.基础介绍1.1. 什么是MVCC?1.1. 什么是当前读和快照读?1.1. 当前读,快照读和MVCC的关系1.1. MVCC能解决什么问题,好处是?1.1.1. 提高并发性能1.1.2. 避免死锁1.1.3. 解决脏读、不可重复读和幻读等问题1.1.4. 实现…...
Git 命令行查看仓库信息
目录 查看系统config 编辑查看当前用户(global)配置 查看当前仓库配置信息 查看系统config git config --system --list 1 查看当前用户(global)配置 git config --global --list 1 查到的是email , name 等ssl签名信息&a…...
【爬虫】8.1. 深度使用tesseract-OCR技术识别图形验证码
深度使用tesseract-OCR技术识别图形验证码 文章目录 深度使用tesseract-OCR技术识别图形验证码1. OCR技术2. 准备工作3. 简单作用了解3.1. 验证码图片爬取-screenshot_as_png3.2. 识别测试-image_to_string3.2.1. 正确识别3.2.2. 错误识别3.2.3. 灰度调节 3.3. 识别实战-使用im…...
【PythonRS】基于GDAL修改栅格数据的DN值
遥感工作者离不开栅格数据,有时候我们可能需要修改栅格数据的值,但ENVI和ArcGIS中并没有直接修改DN值的工具,只有栅格计算器、Band math这些工具去计算整个波段的值,或者Edit Classification Image工具可以修改ENVI分类后的像元值…...
mysql课堂笔记 mac
目录 启动mac上的mysql 进入mysql mac windows 创建数据库 创建表 修改字段数据类型 修改字段名 增加字段 删除字段 启动mac上的mysql sudo /usr/local/mysql/support-files/mysql.server start 直接输入你的开机密码即可。 编辑 进入mysql mac sudo /usr/local…...
2023年数学建模国赛A 定日镜场的优化设计思路分析
构建以新能源为主体的新型电力系统,是我国实现“碳达峰”“碳中和”目标的一项重要措施。塔式太阳能光热发电是一种低碳环保的新型清洁能源技术[1]。定日镜是塔式太阳能光热发电站(以下简称塔式电站)收集太阳能的基本组件,其底座由…...
【QT】QMessageBox消息框的使用(16)
在实际项目中,弹出消息框是一个很常见的操作,包含错误信息提示、警告信息提示、关于信息提示、还包括判断信息选择等操作,那么今天通过这一节来好好了解下消息框的使用方法。 一.环境配置 1.python 3.7.8 可直接进入官网下载安装…...
XL-LightHouse 与 Flink 和 ClickHouse 流式大数据统计系统
一个Flink任务只能并行处理一个或少数几个数据流,而XL-LightHouse一个任务可以并行处理数万个、几十万个数据流; 一个Flink任务只能实现一个或少数几个数据指标,而XL-LightHouse单个任务就能支撑大批量、数以万计的数据指标。 1、XL-LightHo…...
【postgresql 基础入门】创建数据库的方法,存储位置,决定自己的数据的访问用户和范围
创建数据库 专栏内容: postgresql内核源码分析手写数据库toadb并发编程 开源贡献: toadb开源库 个人主页:我的主页 管理社区:开源数据库 座右铭:天行健,君子以自强不息;地势坤,君…...
科技云报道:AI时代,对构建云安全提出了哪些新要求?
科技云报道原创。 随着企业上云的提速,一系列云安全问题也逐渐暴露出来,云安全问题得到重视,市场不断扩大。 Gartner 发布“2022 年中国 ICT 技术成熟度曲线”显示,云安全已处于技术萌芽期高点,预期在2-5年内有望达到…...
如何让 Llama2、通义千问开源大语言模型快速跑在函数计算上?
:::info 本文是“在Serverless平台上构建AIGC应用”系列文章的第一篇文章。 ::: 前言 随着ChatGPT 以及 Stable Diffusion,Midjourney 这些新生代 AIGC 应用的兴起,围绕AIGC应用的相关开发变得越来越广泛,有呈井喷之势,从长远看这波应用的爆…...
Linux内核源码分析 (B.2)虚拟地址空间布局架构
Linux内核源码分析 (B.2)虚拟地址空间布局架构 文章目录 Linux内核源码分析 (B.2)虚拟地址空间布局架构一、Linux内核整体架构及子系统二、Linux内核内存管理架构 一、Linux内核整体架构及子系统 Linux内核只是操作系统当中的一部分,对下管理系统所有硬件设备&…...
Spring系列文章:Spring使用JdbcTemplate
一、简介 JdbcTemplate是Spring提供的⼀个JDBC模板类,是对JDBC的封装,简化JDBC代码。 当然,你也可以不⽤,可以让Spring集成其它的ORM框架,例如:MyBatis、Hibernate等。 第一步:引入依赖 <d…...
[matlab]cvx安装后测试代码
测试环境: windows10 x64 matlab2023a 代码来自官方网站:CVX: Matlab Software for Disciplined Convex Programming | CVX Research, Inc. m 20; n 10; p 4; A randn(m,n); b randn(m,1); C randn(p,n); d randn(p,1); e rand; cvx_beginva…...
【css】margin:auot什么情况下失效
margin:auto只对块级元素有效果,并且在正常文档流margin:automargin:0 auto,css默认在正常文档流里面margin-top和margin-bottom是0 为什么margin: auto能实现水平居中,而垂直居中不行? 一般子…...
linux的dirty page回写磁盘过程中是否允许并发写入更新page?
概述 众所周知Linux内核write系统调用采用pagecache机制加速写入过程,避免write系统调用长时间block应用进程,用户态进程执行write调用的时候,内核只是将用户态buffer copy到内核的pagecache当中,write系统调用就返回了,完全不需要等待数据完全写入存储设备,因为存储设备…...
Docker-基础命令使用
文章目录 前言命令帮助命令执行示意图docker rundocker psdocker inspectdocker execdocker attachdocker stopdocker startdocker topdocker rmdocker prune参考说明 前言 本文主要介绍Docker基础命令的使用方法。 命令帮助 Docker命令获取帮助方法 # docker -h Flag shor…...
【Python 程序设计】Python 中的类型提示【06/8】
目录 一、说明 二、什么是动态类型? 2.1 为什么要使用类型提示? 2.2 局限性 三、基本类型提示 3.1 声明变量的类型 3.2 函数注释 四、Python 中的内置类型 4.1 原子类型与复合类型 五、函数注释 5.1 如何指定函数的参数类型和返回类型 5.2 在函数签名中…...
78 # koa 中间件的实现
上上节实现了上下文的,上一节使用了一下中间件,这一节来实现 koa 的中间件这个洋葱模型。 思路: 储存用户所有的 callback将用户传递的 callback 全部组合起来(redux 里的 compose)组合成一个线性结构依次执行&#…...
国产操作系统麒麟v10中遇到的一些问题
下载pycharm:直接在应用商店 目标:主机1安装了虚拟机,主机2要ping通主机1安装的虚拟机。 前提:主机1,主机2在同一局域网下,同一网段。 网络配置 因为虚拟机的网段不在局域网网段内,局域网下…...
Gridea+GitPage+Gittalk 搭建个人博客
👋通过GrideaGitPage 搭建属于自己的博客! 👻GitPage 负责提供 Web 功能! 😽Gridea 作为本地编辑器,方便 push 文章! 🏷本文讲解如何使用 GrideaGitPage 服务域名(可选&a…...
代码质量保障第2讲:单元测试 - 浅谈单元测试
代码质量保障第2讲:单元测试 - 浅谈单元测试 本文是代码质量保障第2讲,浅谈单元测试。单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。这是基础,所以围绕着单元测试,我从…...
“五度晟企通”企业发展服务平台正式发布,帮扶企业行稳致远!
在数字中国建设的大背景下,“五度易链”以企业实际发展需求为牵引,以帮扶企业行稳致远为目标,基于全体量产业大数据,运用NLP、AI等新一代信息技术,打造了数字化ToB企业发展服务平台“五度晟企通”,旨在以数…...
Java类和对象(七千字详解!!!带你彻底理解类和对象)
目录 一、面向对象的初步认知 1、什么是面向对象 2、面向对象和面向过程 (1)传统洗衣服的过程 (2)现代洗衣服过程 编辑 二、类的定义和使用 1、类的定义格式 三、类的实例化 1、什么是实例化 2、类和对象说明 四、t…...
机器学习笔记:node2vec(论文笔记:node2vec: Scalable Feature Learning for Networks)
2016 KDD 1 intro 利用graph上的节点相似性,对这些节点进行embedding 同质性:节点和其周围节点的embedding比较相似 蓝色节点和其周围的节点结构等价性 结构相近的点embedding相近 比如蓝色节点,都处于多个簇的连接处 2 随机游走 2.1 介绍…...
go基础10 -字符串的高效构造与转换
前面提到过,Go原生支持通过/操作符来连接多个字符串以构造一个更长的字符串,并且通过/操作符的字符串连接构造是最自然、开发体验最好的一种。 但Go还提供了其他一些构造字符串的方法,比如: ● 使用fmt.Sprintf; ● 使…...
VR钢铁实训 | 铁前事业部虚拟仿真培训软件
随着科技的发展,虚拟现实技术在各个行业中的应用越来越广泛。在钢铁冶炼行业中,VR技术也逐渐得到了应用,其中铁前事业部虚拟仿真培训软件就是一项非常有优势的技术。 铁前事业部虚拟仿真培训软件是广州华锐互动打造的《钢铁生产VR虚拟培训系统…...
DevOps
DevOps 是开发 (Dev) 和运营 (Ops) 的复合词,它将人、流程和技术结合起来,不断地为客户提供价值。 DevOps 对团队意味着什么? DevOps 使以前孤立的角色(开发、IT 运营、质量工程和安全)可以协调和协作,以生…...
司法局网站建设/a5站长网
转自:http://blog.itpub.net/4227/viewspace-536379/ 在10g以前,Oracle的全局索引分区方法只有一种,即范围分区。 SQL> CREATE TABLE T_PART_INDEX (ID NUMBER, NAME VARCHAR2(30), CREATE_DATE DATE); 表已创建。 SQL> INSERT INTO…...
自主建设公司网站/黄冈网站推广策略
开门见山,文档不足 下载下来的是zip包,不是tar包,未能解决 下载 wget https://releases.hashicorp.com/consul/1.3.0/consul_1.3.0_linux_amd64.zip 安装uzip yum -y install wget 解压 unzip consul_1.3.0_linux_amd64.zip 测试 ./c…...
网站平台建设心得/网络舆情监测中心
查看Java进程,得到Java的进程号 ps -ef | grep java方法1:应用主动关闭Java进程 kill -15 <Java程序的进程号>方法2:操作系统从Linux内核强制杀死一个进程 kill -9 <Java程序的进程号>欢迎小伙伴讨论,文章内容如有…...
廊坊市固安县建设局网站/怎么自己做一个网站平台
AngularJS 2.0 学习 Angular 2 当越来越多的 web app 使用 Angular 1构建的时候,更快更强大的 Angular 2 将会很快成为新的标准。 Angular的新约定使得它更容易去学习、更快的去开发 app。通过本教程学习更快速。更强大的 Angular 版本。 Angular 一个跨移动和桌面的…...
万网主机服务/徐州seo代理计费
文章目录快速排序1.排序规则2.代码实现3.测试结果4.复杂度分析快速排序 1.排序规则 划分的规则: 第一次排序以第一个数据作为基数 从右向左找比基准值小的(相等) 从左向右找比基准值大的 向下划分:至少这个组里有两个数据&#…...
采票网站刷流水做任务/seo网络推广案例
今天刚装了Ubuntu 11.04。然后安装了Eclipse后发现linux下安装eclipse时候都是预装的Openjdk,所以把openjdk给卸载了,方式如下: (1)先在Ubuntu Software Center中把openjdk给卸载了。 (2)安装 s…...