当前位置: 首页 > news >正文

android集成FFmpeg步骤以及常用命令,踩坑经历

1、入坑第一步:首先集成的库必须正确。最好是有ndk的,FFmpeg有许多个版本,我才开始接触的时候随便选了一个,一般的 方法没有问题。但是涉及到需要使用libx264等条件进行编码时,老是报错,网上搜索资料也没有人说需要ndk的支持才行。这个问题困扰了好几天,怎么试不行,最后更换集成库才成功。

此为引入的库:com.github.yangfeng1994:FFmpeg-Android:v2.0.1

2、图片合成视频命令:

String[] ffmpegCommand = new String[]{"-y", // 覆盖输出文件"-framerate", 5, // 每5秒一帧,可根据需求调整"-i", dir+ "/img%04d.jpg", // 输入图片格式"-c:v", "libx264", // 视频编码器"-pix_fmt", "yuv420p", // 像素格式"-vf", "scale=" + downInfo.getSize(), // 视频分辨率"-threads", "1", // 线程数"-preset", "ultrafast", // 编码速度"-crf", "28", // 编码质量out.mp4// 输出视频路径
};

3、加入音频执行命令

String comman = " -i " + videopath+ " -i " + audioPath + " -c:v copy " + outPath;

4、多个视频拼接成一个视频

首先将多个视频文件路径写入file_list.txt

String fileListPath = dir + File.separator + "file_list.txt";
File file = new File(fileListPath);
String fileListContent = "file '" + input1 + "'\nfile '" + input2 + "'";
FileOutputStream outStream = new FileOutputStream(file); // 加上文件名
outStream.write(fileListContent.getBytes());
outStream.close();

执行命令:

String command = "-f concat -safe 0 -i " + fileListPath + " -c:a aac -c copy " + out.mp4;

5、给视频添加水印

String[] command = new String[]{"-i", srcFile, // 输入视频路径"-i", waterMark, // 水印图片路径"-filter_complex", "overlay=x=(W-w)/2:y=H-h*2", // 水印位置"-codec:a", "copy", // 音频编码//  "-codec:v", "copy", // 视频编码targetFile // 输出视频路径
};

视频制作就到此结束了。

以下是一些常用命令:

视频叠加成画中画
String reverseVideo = "-i %s -i %s -filter_complex overlay=%d:%d %s";reverseVideo = String.format(reverseVideo, inputFile1, inputFile2, x, y, targetFile);

 视频抽帧转成图片

String toImage = "-i %s -ss %s -t %s -r %s %s";
toImage = String.format(Locale.CHINESE, toImage, inputFile, startTime, duration, frameRate, targetFile);
toImage = toImage + "%3d.jpg";
视频降噪
String reverseVideo = "-i %s -nr 500 %s";
reverseVideo = String.format(reverseVideo, inputFile, targetFile);
视频反序倒播
String reverseVideo = "-i %s -filter_complex [0:v]reverse[v] -map [v] %s";//单纯视频反序
reverseVideo = String.format(reverseVideo, inputFile, targetFile);

多画面拼接视频

String multiVideo = "-i %s -i %s -filter_complex hstack %s";//hstack:水平拼接,默认if (videoLayout == LAYOUT_VERTICAL) {//vstack:垂直拼接multiVideo = multiVideo.replace("hstack", "vstack");
}
multiVideo = String.format(multiVideo, input1, input2, targetFile);
音频编码
String combineVideo = "-f s16le -ar %d -ac %d -i %s %s";
combineVideo = String.format(combineVideo, sampleRate, channel, srcFile, targetFile);
视频转成Gif动图
String screenShotCmd = "-i %s -ss %d -t %d -s 320x240 -f gif %s";
screenShotCmd = String.format(screenShotCmd, srcFile, startTime, duration, targetFile);
视频截图
String screenShotCmd = "-i %s -f image2 -t 0.001 -s %s %s";
screenShotCmd = String.format(screenShotCmd, srcFile, size, targetFile);
视频剪切
String cutVideoCmd = "-ss %s -t %s -i %s -c:v libx264 -c:a aac -strict experimental -b:a 98k %s";
cutVideoCmd = String.format(cutVideoCmd, startTime, endTime, srcFile, targetFile);
视频转码
String transformVideoCmd = "-i %s -vcodec copy -acodec copy %s";
transformVideoCmd = String.format(transformVideoCmd, srcFile, targetFile);
抽取视频
String mixAudioCmd = "-i %s -vcodec copy -an %s";
mixAudioCmd = String.format(mixAudioCmd, srcFile, targetFile);
抽取音频
String mixAudioCmd = "-i %s -acodec copy -vn %s";
mixAudioCmd = String.format(mixAudioCmd, srcFile, targetFile);
音频混合
String mixAudioCmd = "-i %s -i %s -filter_complex amix=inputs=2:duration=first -strict -2 %s";
mixAudioCmd = String.format(mixAudioCmd, srcFile, mixFile, targetFile);
音频合并
String concatAudioCmd = "-i concat:%s|%s -acodec copy %s";
concatAudioCmd = String.format(concatAudioCmd, srcFile, appendFile, targetFile);
音频剪切
String cutAudioCmd = "-i %s -ss %d -t %d %s";
cutAudioCmd = String.format(cutAudioCmd, srcFile, startTime, duration, targetFile);
音频转码
String transformAudioCmd = "-i %s %s";
transformAudioCmd = String.format(transformAudioCmd, srcFile, targetFile);

注意踩坑:1、如果需要使用libx264等硬件编码,一定需要引入支持ndk的依赖库。

                  2、图片合成视频过程中,发现部分图片无法合成视频或者合成视频报错,这也是一处坑,当我的图片的分辨率是830x1080,在将图片动画合成视频时,始终报错,最后经过各种尝试得出一下结论。请检查图片的分辨率是否符合1:1,3:4,4:3,16:9,9:16等比例,如果不是常用的分辨率就会报错。

经过一个多月的研究,FFmpeg已经应用比较熟悉了,如果大家有什么问题或者发现我的方法没有用可以和我交流。大家一起学习一起进步

 

相关文章:

android集成FFmpeg步骤以及常用命令,踩坑经历

1、入坑第一步:首先集成的库必须正确。最好是有ndk的,FFmpeg有许多个版本,我才开始接触的时候随便选了一个,一般的 方法没有问题。但是涉及到需要使用libx264等条件进行编码时,老是报错,网上搜索资料也没有…...

Go错误与日志处理—推荐实践

错误的分类 在 Go 语言中,错误是通过实现 error 接口的类型表示的,但不同场景下的错误可以按性质和用途进行分类。以下是 Go 语言错误的常见分类,以及每类错误的解释和示例: 标准错误类型 标准库中定义了许多常见的错误类型&…...

Android 13 Aosp Settings Android Studio版本

Android 13 Aosp Settings Android Studio版本 Settings相关源码 Settings https://android.googlesource.com/platform/packages/apps/Settings/+/refs/heads/android13-release SettingsIntelligence https://android.googlesource.com/platform/packages/apps/SettingsIn…...

Jedis存储一个以byte[]的形式的对象到Redis

1.1 准备一个User实体类 import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;import java.io.Serializable; import java.util.Date;Data NoArgsConstructor AllArgsConstructor public class User implements Serializable {private In…...

updatexml报错注入原理分析

《网络安全自学教程》 SQL注入时,经常利用updatexml()的报错特性来脱库。 updatexml报错原理 1、updatexml语法参数2、报错原理分析3、使用updatexml()脱库4、分割显示结果 updatexml() 的作用是修改xml文件的内容。 1、updatexml语法参数 updatexml(参数1&#x…...

蓝桥杯c++算法秒杀【6】之动态规划【上】(数字三角形、砝码称重(背包问题)、括号序列、组合数问题:::非常典型的必刷例题!!!)

下将以括号序列、组合数问题超级吧难的题为例子讲解动态规划 别忘了请点个赞收藏关注支持一下博主喵!!!! ! ! ! ! 关注博主,更多蓝桥杯nice题目静待更新:) 动态规划 一、数字三角形 【问题描述】 上图给出了…...

【Qt】重写QComboBox下拉展示多列数据

需求 点击QComboBox时&#xff0c;下拉列表以多行多列的表格展示出来。 实现 直接上代码&#xff1a; #include <QComboBox> #include <QTableWidget> #include <QVBoxLayout> #include <QWidget> #include <QEvent> #include <QMouseEve…...

【mac】终端左边太长处理,自定义显示名称(terminal路径显示特别长)

1、打开终端 2、步骤 &#xff08;1&#xff09;修改~/.zshrc文件 nano ~/.zshrc&#xff08;2&#xff09;添加或修改PS1&#xff0c;我是自定义了名字为“macminiPro” export PS1"macminiPro$ "&#xff08;3&#xff09;使用 nano: Ctrl o &#xff08;字母…...

基于Springboot的流浪宠物管理系统

基于javaweb的流浪宠物管理系统 介绍 基于javaweb的流浪宠物管理系统的设计与实现&#xff0c;后端框架使用Springbootmybatis&#xff0c;前端框架使用Vuehrml&#xff0c;数据库使用mysql&#xff0c;使用B/S架构实现前台用户系统和后台管理员系统&#xff0c;和不同权限级别…...

web博客系统的自动化测试

目录 前言测试用例编写自动化脚本测试准备博客登录页相关测试用例登陆成功登录失败 博客首页相关测试用例登陆成功登录失败 博客详情页相关测试用例登录成功登录失败 博客编辑页相关测试用例登陆成功登录失败 编写测试文档测试类型内容 前言 本次测试是运用个人写的一个博客系…...

【论文阅读】Multi-level Semantic Feature Augmentation for One-shot Learning

用于单样本学习的多层语义特征增强 引用&#xff1a;Chen, Zitian, et al. “Multi-level semantic feature augmentation for one-shot learning.” IEEE Transactions on Image Processing 28.9 (2019): 4594-4605. 论文地址&#xff1a;下载地址 论文代码&#xff1a;https:…...

网络知识面试

1、http状态码 101: 切换请求协议 200:(请求成功)。服务器已成功处理了请求。 通常,这表示服务器提供了请求的网页。 301 : (永久移动,永久性重定向,会缓存) 请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。…...

图片预览 图片上传到服务器

首先要明白 理解 multipart/form-data&#xff1a;‌multipart/form-data是一种在HTTP请求中使用的MIME类型&#xff0c;主要用于在客户端和服务器之间传输包含文件或二进制数据的表单数据。它通过一个边界&#xff08;boundary&#xff09;来分隔不同的表单字段和文件数据‌。…...

前端:base64的作用

背景 项目中发现&#xff0c;img标签中写src&#xff0c;读取一个png图片&#xff0c;只有16kb&#xff0c;速度特别慢。 解决办法&#xff0c;将图片转为base64&#xff0c;然后读取&#xff0c;速度特别快17ms就解决。 定义&#xff1a;base64是一种基于64个可打印字符(A-…...

Django在fitler过滤不等于的条件

提问 django 在API接口fitler的时候如何过滤 category 不等于6的 解答 为了在AoYuStudentFilter中设置过滤category不等于6的条件&#xff0c;需要使用django_filters库中的exclude方法。不过直接在FilterSet中使用exclude可能不那么直观&#xff0c;因为FilterSet主要设计用…...

Spring Boot英语知识分享网站:技术与实践

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…...

京准电钟:NTP网络校时服务器从入门到精准

京准电钟&#xff1a;NTP网络校时服务器从入门到精准 京准电钟&#xff1a;NTP网络校时服务器从入门到精准 1.前言 由计算机网络系统组成的分布式系统&#xff0c;若想协调一致进行&#xff1a;IT行业的“整点开拍”、“秒杀”、“Leader选举”&#xff0c;通信行业的“同步…...

C++趣味编程玩转物联网:用树莓派Pico控制四位数码管

数码管是一种常用的数字显示器件&#xff0c;广泛应用于电子时钟、记分牌和智能设备显示界面。在本项目中&#xff0c;我们将通过树莓派Pico板控制一个四位数码管模块&#xff0c;展示从 0000 到 9999 的数字动态显示。这不仅是一次硬件和软件结合的实践&#xff0c;还可以帮助…...

DRM(数字权限管理技术)防截屏录屏----视频转hls流加密、web解密播放

提示&#xff1a;视频转hls流加密、web解密播放 需求&#xff1a;研究视频截屏时&#xff0c;播放器变黑&#xff0c;所以先研究的视频转hls流加密 文章目录 [TOC](文章目录) 前言一、工具ffmpeg、openssl二、后端nodeexpress三、web播放四、文档总结 前言 ‌HLS流媒体协议‌&a…...

实验三 z变换及离散时间LTI系统的z域分析

实验原理 有理函数z 变换的部分分式展开 【实例2-1】试用Matlab 命令对函数 X ( z ) 18 18 3 − 1 − 4 z − 2 − z − 3 X\left(z\right)\frac{18}{183^{-1} -4z^{-2} -z^{-3} } X(z)183−1−4z−2−z−318​ 进行部分分式展开&#xff0c;并求出其z 反变换。 B[18]; A…...

Linux渗透测试实战命令指南:从信息收集到横向移动

1. 这不是命令手册&#xff0c;而是一张渗透测试现场的“作战地图”你有没有过这样的经历&#xff1a;坐在靶机前&#xff0c;刚扫出一个Web服务&#xff0c;脑子里立刻蹦出七八个工具名——nmap、gobuster、sqlmap、hydra……可手一伸向键盘&#xff0c;却卡在了第一个参数上&…...

基于神经网络的带输出三相逆变器模型预测控制LC滤波器附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长毕业设计辅导、数学建模、数据处理、程序设计科研仿真。&#x1f34e;完整代码获取 定制创新 论文复现点击&#xff1a;Matlab科研工作室&#x1f447; 关注我领取海量matlab电子书和数学建模资料 &#x1f3…...

AI Agent Harness多租户数据隔离

AI Agent Harness多租户数据隔离:构建企业级智能协作平台的安全基石 1. 引入与连接:从一场云端智能客服泄露事故谈起 核心概念: AI Agent(智能代理):具备自主感知、推理决策、行动执行能力的软件实体,可代表个人/组织完成特定任务,是当前大模型应用落地的核心载体 AI …...

在Windows电脑上完整体验AirPods功能:终极解决方案AirPodsDesktop

在Windows电脑上完整体验AirPods功能&#xff1a;终极解决方案AirPodsDesktop 【免费下载链接】AirPodsDesktop ☄️ AirPods desktop user experience enhancement program, for Windows and Linux (WIP) 项目地址: https://gitcode.com/gh_mirrors/ai/AirPodsDesktop …...

Google 广告场景下 Uniswap 钓鱼攻击机理与 Web3 防御体系研究

摘要 2026 年 5 月 22 日&#xff0c;GoPlus 安全团队发布预警&#xff0c;针对 Web3 领域头部去中心化交易平台 Uniswap 的搜索引擎钓鱼攻击呈规模化爆发态势。攻击者通过购买 Google Ads 关键词广告&#xff0c;将高仿钓鱼网站置顶于搜索结果前列&#xff0c;结合视觉相似域名…...

2026这6款封神降AI率工具大起底,一键把AIGC率降至安全线!

步入 2026 年&#xff0c;学术界的风向早已悄然转变。曾经的"降重复率"焦虑已经成了过去式&#xff0c;如今摆在每位学子和科研人面前的&#xff0c;是更棘手的"降 AI 率"挑战。随着各大高校对 AI 内容检测系统的全面升级&#xff0c;审核标准也愈发严苛。…...

机器学习势函数在暗物质探测中的应用:计算晶体缺陷存储能

1. 项目概述&#xff1a;当机器学习势函数遇上暗物质探测在粒子物理与凝聚态物理的交叉前沿&#xff0c;有一个看似微小却至关重要的物理细节&#xff0c;正困扰着新一代的暗物质与中微子探测实验&#xff1a;当一个来自宇宙的弱相互作用粒子&#xff08;WIMP&#xff09;或一个…...

《元创力》纪实录·桥段静默纪元:当叙事成为被审计的风险资产

X54先生叙事前的话&#xff1a;叙事模式&#xff1a;X54先生提供参考角度&#xff08;可以不选&#xff09;审查机构事先不对事实审查给了拍摄权和公映权&#xff0c;舆论压力出现&#xff0c;又要倒查&#xff0c;是从一个错误走向另一个错误&#xff0c;这会导致文艺创作者因…...

上下文是新的算力吗?

在过去六个月里&#xff0c;前沿级AI能力的推理成本下降了约85%。来自Meta、阿里巴巴等公司的开放权重模型&#xff0c;如今在关键基准测试上已经能匹敌上个季度最好的闭源模型。一个曾经每月花费数千美元运行在领先专有模型上的生产工作负载&#xff0c;现在可以用开源替代方案…...

为什么93%的Gemini集成应用在48小时内必须升级?权威发布:3个高危CVE编号+官方回滚方案

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Gemini Bug修复公告 近日&#xff0c;我们在 Gemini 模型推理服务的 v2.4.1 版本中发现一个影响高并发场景下响应一致性的关键缺陷&#xff1a;当连续提交含嵌套 JSON Schema 的结构化请求时&#xff0…...