说说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<String, String> 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.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,099评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,828评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,540评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,848评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,971评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,132评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,193评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,934评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,376评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,687评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,846评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,537评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,175评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,887评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,134评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,674评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,741评论 2 351

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,892评论 25 707
  • afinalAfinal是一个android的ioc,orm框架 https://github.com/yangf...
    passiontim阅读 15,417评论 2 45
  • 曾经总是不解风情, 却无意邂逅美丽风景, 曾经总是不羁流浪, 却渴求一盏温暖灯光。 不是我有心逃走, 只是明白将来...
    小王爷小王爷阅读 208评论 0 0
  • 1.今天又能享受老妈给我准备的爱心早餐,真的好幸福好幸福,进账20! 2.今天可以享受同事分享的葡萄和零食,进账1...
    吸引力修炼阅读 139评论 0 0
  • Eclipse快速添加get、set方法 右键 -->Source-->Generate Getters and ...
    WSGNSLog阅读 488评论 0 0