有一段时间没有更新博客了。

最近有人在我的博客中跟我说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的视频裁剪(三)相关推荐

  1. android mp4 画面裁剪,Android视频时长裁剪

    大家好,我是程序员kenney,今天给大家介绍一下如何在Android里面实现视频时长的裁剪. 首先我们要知道视频是由一帧一帧的数据构成的,每一帧都有一个时间戳,这个时间戳就是我们在做视频编码的时候, ...

  2. php封装多段mp4,解决ffmpeg将多段视频裁剪拼接后卡顿现象

    合并 将下载的ts流名称按照顺序记录在一个txt文件中,然后使用命令 ffmpeg.exe -f concat -i ./your.txt -c copy ./output.mkv ffmpeg.ex ...

  3. android启动画面白屏,Android app启动时黑屏或者白屏的原因及解决办法

    1.产生原因 其实显示黑屏或者白屏实属正常,这是因为还没加载到布局文件,就已经显示了window窗口背景,黑屏白屏就是window窗口背景. 示例: 2.解决办法 通过设置设置Style (1)设置背 ...

  4. android+系统画面恢复,坚持Android系统恢复?轻松修复它

    第3部分.安卓系统恢复?如何一键修复? 有时在系统恢复过程中,该过程可能会出现故障,您将丢失设备上的数据,使其无法使用.但是,解决此问题的另一个解决方案是使用dr.fone修复工具修复您的设备. 修复 ...

  5. 短视频生产利器!视频裁剪之横屏转竖屏新技术,出自腾讯多媒体实验室

    腾讯多媒体技术专栏 伴随手机等智能设备的广泛使用以及短视频平台的兴起,越来越多的"竖屏"视频开始占据人们的视野.目前,许多"竖屏"视频仍是由16:9等宽高比的& ...

  6. Android 3分钟一个库搞定视频替换音频 视频合成 视频裁剪(高仿剪映)

    几种框架的比较: https://www.zhihu.com/question/278431860 方法一(Fail) 利用MediaMux实现音视频的合成. 效果:可以实现音视频的合并,利用Andr ...

  7. Android 使用 mp4parser 做视频裁剪

    做音视频时我们很多时候需要做音视频裁剪,本文介绍使用开源库 mp4parser 做裁剪. 视频合并请见我的另外一篇博客<Android 使用 mp4parser 做视频拼接合并> 使用时先 ...

  8. android 视频录制尺寸裁剪,galleryfinal 实现Android图片单选/多选、拍照、裁剪、压缩。视频选择和录制。...

    RxGalleryFinal是一个android图片/视频文件选择器.其支持多选.单选.拍摄和裁剪,主题可自定义,无强制绑定第三方图片加载器. 1.首先加入权限 2.在module gradle中项目 ...

  9. android可以剪辑代码的控件,Android 仿抖音视频裁剪范围选择控件,支持本地视频和网络视频...

    实现后效果:由于是在模拟器上跑的背面的封面列表加载不出来,实际效果请真机运行 image.png 具体代码如下: 绘制上层滑动控件部分 package com.cj.customwidget.widg ...

  10. Android 基于MediaCodec开发抖音短视频录制(壹)

    前言 当一个Android开发者玩抖音玩疯了之后,就会绞尽脑汁思考自己是否也能开发出一款相同的APP来呢? 滴,滴滴! 本篇文章将介绍自己总结的短视频录制的相关内容,主要分为三个部分: 摄像头内容录制 ...

最新文章

  1. 15瓶饮料4个空瓶换一瓶_2021江苏公务员考试行测技巧:你会用“空瓶”换水吗?...
  2. 关于UUID的二三事
  3. 机器学习:特征选择和降维实例
  4. 外企员工职场跃迁:他们将目光转向杭州 转向云计算
  5. 常用的Net Command
  6. C语言1e12怎么识别,求大神帮助词法分析,当输入第一个1.2e12时可以输出,当时输入第二个1.2e12时就不能输出了,万分感谢,还有不能识别x=7*8+9中的+9,...
  7. aop拦截mybatis执行sql_Java进阶架构之开源框架面试题系列:Spring+SpringMVC+MyBatis
  8. java-HTMLjavaSkcriptCSSjQueryajax
  9. 写那么多年Java,还不知道啥是Java agent的必须看一下!
  10. QPainter类的CompositionMode各值含义
  11. 定时器--STM32f4--HAL
  12. Spring Boot(5)---第一个Spring Boot应用程序
  13. Linux Shell 中各种括号的作用 ()、(())、[]、[[]]、{}
  14. [Ext JS6]工作区-Workspace
  15. android tabspec英文自动大写问题,为什么不能在drawable下访问xml文件?所有的
  16. 【EOS】2.1 EOS Hello World合约
  17. IEEE-SA董事刘东:开放+开源将带来新一波SDNFV创新
  18. 买房注意事项收集(zt)
  19. windows服务创建工具srvany.exe介绍
  20. antd picker 使用 如何_antd-RangePicker

热门文章

  1. 2018 AI产业界大盘点
  2. 数据预处理Part8——数据共线性
  3. 大厂程序员因厌恶编程,辞去月薪2w+的工作去当司机?
  4. 【转载】Typora标题增加序号
  5. Android 抽屉用法
  6. 万字长文!浏览器是如何工作的:Chrome V8让你更懂JavaScript
  7. 制造业英文简写中文对照之二(轉自ITPUB)
  8. 工程经济—技术方案不确定性分析
  9. iOS - 毛玻璃效果
  10. 有关vc++ 时钟程序的学习与体会