android mp4 画面裁剪,说说Android的视频裁剪(三)
有一段时间没有更新博客了。
最近有人在我的博客中跟我说mp4Parse不能裁剪mov视频,问我有没有其他的解决方案,所以这次我更新了一下自己的项目:Android-Video-Trimmer,使用ffmpeg来实现视频的裁剪。
FFmpeg是为大家所熟悉的处理视频的一个跨平台的开源库,支持android、ios。我们可以自己手动编译不同平台的lib库,从何集成到我们的项目中去。但是FFmpeg是一个C/C++的库,对于熟悉Java开发的Android同学来说,更希望是Java层面的调用。
在我的项目中,集成了一个FFmpegAndroid开发库,这个库优点是我们可以直接用Java的API来执行ffmpge的命令,缺点是该库比较大(大概19M),没办法对库做瘦身缩减工作。下面是我集成这个库的几个步骤。
1. 引入库的方式有两种:aar或者源码依赖
aar依赖:
dependencies {
compile 'com.writingminds:FFmpegAndroid:0.3.2'
}
源码依赖:
用git将ffmpeg-android-javaclone到本地,然后把项目中FFmpegAndroid库的源码加入到自己的项目中。
FFmpegAndroid
2.库的初始化
public class ZApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
initFFmpegBinary(this);
}
private void initFFmpegBinary(Context context) {
try {
FFmpeg.getInstance(context).loadBinary(new LoadBinaryResponseHandler() {
@Override
public void onFailure() {
}
});
} catch (FFmpegNotSupportedException e) {
e.printStackTrace();
}
}
}
初始化的目的是根据Android手机的cpu架构,load对应架构的ffmpeg库。
3.执行ffmpeg的commend命令
上面的准备工作做完之后,剩下就是我们关心的问题了,如何执行ffmpeg命令行呢?在前面我已经说了,这个库是对ffmpeg的在Linux系统中命令行的一个封装,所以我们需要在该库中找到一个这样的API。
那我在FFmpegInterface.java类中找到了如下的PAI:
/**
* Executes a command
* @param environvenmentVars Environment variables
* @param cmd command to execute
* @param ffmpegExecuteResponseHandler {@link FFmpegExecuteResponseHandler}
* @throws FFmpegCommandAlreadyRunningException
*/
public void execute(Map environvenmentVars, String[] cmd, FFmpegExecuteResponseHandler ffmpegExecuteResponseHandler) throws FFmpegCommandAlreadyRunningException;
/**
* Executes a command
* @param cmd command to execute
* @param ffmpegExecuteResponseHandler {@link FFmpegExecuteResponseHandler}
* @throws FFmpegCommandAlreadyRunningException
*/
public void execute(String[] cmd, FFmpegExecuteResponseHandler ffmpegExecuteResponseHandler) throws FFmpegCommandAlreadyRunningException;
小伙伴们可以看到参数String[] cmd,就是我所说的控制台的命令行参数,只要将我们的命令行传入,设置好回调,剩下的事情就是静静等着ffmpeg触发我们的回调了,是不是感觉很爽!
下面是我的调用实现:
public static void trimVideo(Context context, String inputFile, String outputFile, long startMs, long endMs, final OnTrimVideoListener callback) {
final String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date());
final String outputName = "trimmedVideo_" + timeStamp + ".mp4";
String start = convertSecondsToTime(startMs/1000);
String duration = convertSecondsToTime((endMs - startMs)/1000);
/**ffmpeg -ss START -t DURATION -i INPUT -vcodec copy -acodec copy OUTPUT
-ss 开始时间,如: 00:00:20,表示从20秒开始;
-t 时长,如: 00:00:10,表示截取10秒长的视频;
-i 输入,后面是空格,紧跟着就是输入视频文件;
-vcodec copy 和 -acodec copy 表示所要使用的视频和音频的编码格式,这里指定为copy表示原样拷贝;
INPUT,输入视频文件;
OUTPUT,输出视频文件*/
String cmd = "-ss " + start + " -t " + duration + " -i " + inputFile + " -vcodec copy -acodec copy " + outputFile + "/" + outputName;
String[] command = cmd.split(" ");
try {
FFmpeg.getInstance(context).execute(command, new ExecuteBinaryResponseHandler() {
@Override
public void onFailure(String s) {
}
@Override
public void onSuccess(String s) {
callback.onFinishTrim(null);
}
@Override
public void onStart() {
callback.onStartTrim();
}
@Override
public void onFinish() {
}
});
} catch (FFmpegCommandAlreadyRunningException e) {
// do nothing for now
}
}
上面主要是拼出ffmpeg视频裁剪的命令行参数。
FFmpeg命令大全
视频裁剪的命令如下:
ffmpeg -ss START -t DURATION -i INPUT -vcodec copy -acodec copy OUTPUT
需要主意的是:
DURATION 是表示视频的持续时间而不是结束时间
INPUT 表示输入的包含文件名的文件路径 e.g: sdcard/xxx/xx/input.mp4
OUTPUT 表示输出的包含文件名的文件路径 e.g: sdcard/xxx/xx/output.mov
其他命令也基本也差不多,需要实现什么功能之后可以去查询具体的命令行,对着实现就行。
Thanks for reading. To help others please click ❤ to recommend this article if you found it helpful.
You can also follow me at GitHub.
android mp4 画面裁剪,说说Android的视频裁剪(三)相关推荐
- android mp4 画面裁剪,Android视频时长裁剪
大家好,我是程序员kenney,今天给大家介绍一下如何在Android里面实现视频时长的裁剪. 首先我们要知道视频是由一帧一帧的数据构成的,每一帧都有一个时间戳,这个时间戳就是我们在做视频编码的时候, ...
- php封装多段mp4,解决ffmpeg将多段视频裁剪拼接后卡顿现象
合并 将下载的ts流名称按照顺序记录在一个txt文件中,然后使用命令 ffmpeg.exe -f concat -i ./your.txt -c copy ./output.mkv ffmpeg.ex ...
- android启动画面白屏,Android app启动时黑屏或者白屏的原因及解决办法
1.产生原因 其实显示黑屏或者白屏实属正常,这是因为还没加载到布局文件,就已经显示了window窗口背景,黑屏白屏就是window窗口背景. 示例: 2.解决办法 通过设置设置Style (1)设置背 ...
- android+系统画面恢复,坚持Android系统恢复?轻松修复它
第3部分.安卓系统恢复?如何一键修复? 有时在系统恢复过程中,该过程可能会出现故障,您将丢失设备上的数据,使其无法使用.但是,解决此问题的另一个解决方案是使用dr.fone修复工具修复您的设备. 修复 ...
- 短视频生产利器!视频裁剪之横屏转竖屏新技术,出自腾讯多媒体实验室
腾讯多媒体技术专栏 伴随手机等智能设备的广泛使用以及短视频平台的兴起,越来越多的"竖屏"视频开始占据人们的视野.目前,许多"竖屏"视频仍是由16:9等宽高比的& ...
- Android 3分钟一个库搞定视频替换音频 视频合成 视频裁剪(高仿剪映)
几种框架的比较: https://www.zhihu.com/question/278431860 方法一(Fail) 利用MediaMux实现音视频的合成. 效果:可以实现音视频的合并,利用Andr ...
- Android 使用 mp4parser 做视频裁剪
做音视频时我们很多时候需要做音视频裁剪,本文介绍使用开源库 mp4parser 做裁剪. 视频合并请见我的另外一篇博客<Android 使用 mp4parser 做视频拼接合并> 使用时先 ...
- android 视频录制尺寸裁剪,galleryfinal 实现Android图片单选/多选、拍照、裁剪、压缩。视频选择和录制。...
RxGalleryFinal是一个android图片/视频文件选择器.其支持多选.单选.拍摄和裁剪,主题可自定义,无强制绑定第三方图片加载器. 1.首先加入权限 2.在module gradle中项目 ...
- android可以剪辑代码的控件,Android 仿抖音视频裁剪范围选择控件,支持本地视频和网络视频...
实现后效果:由于是在模拟器上跑的背面的封面列表加载不出来,实际效果请真机运行 image.png 具体代码如下: 绘制上层滑动控件部分 package com.cj.customwidget.widg ...
- Android 基于MediaCodec开发抖音短视频录制(壹)
前言 当一个Android开发者玩抖音玩疯了之后,就会绞尽脑汁思考自己是否也能开发出一款相同的APP来呢? 滴,滴滴! 本篇文章将介绍自己总结的短视频录制的相关内容,主要分为三个部分: 摄像头内容录制 ...
最新文章
- 15瓶饮料4个空瓶换一瓶_2021江苏公务员考试行测技巧:你会用“空瓶”换水吗?...
- 关于UUID的二三事
- 机器学习:特征选择和降维实例
- 外企员工职场跃迁:他们将目光转向杭州 转向云计算
- 常用的Net Command
- C语言1e12怎么识别,求大神帮助词法分析,当输入第一个1.2e12时可以输出,当时输入第二个1.2e12时就不能输出了,万分感谢,还有不能识别x=7*8+9中的+9,...
- aop拦截mybatis执行sql_Java进阶架构之开源框架面试题系列:Spring+SpringMVC+MyBatis
- java-HTMLjavaSkcriptCSSjQueryajax
- 写那么多年Java,还不知道啥是Java agent的必须看一下!
- QPainter类的CompositionMode各值含义
- 定时器--STM32f4--HAL
- Spring Boot(5)---第一个Spring Boot应用程序
- Linux Shell 中各种括号的作用 ()、(())、[]、[[]]、{}
- [Ext JS6]工作区-Workspace
- android tabspec英文自动大写问题,为什么不能在drawable下访问xml文件?所有的
- 【EOS】2.1 EOS Hello World合约
- IEEE-SA董事刘东:开放+开源将带来新一波SDNFV创新
- 买房注意事项收集(zt)
- windows服务创建工具srvany.exe介绍
- antd picker 使用 如何_antd-RangePicker