使用FFmpeg实现视频的裁剪,不需要调用JNI实现

参考地址:http://www.jianshu.com/p/2cf527f2129f


不好意思,好久没有更新博客了,今天给大家带来的是Android实现视频裁剪,我已经测试了mov、MP4、AVI格式的,都是OK的。

在网上搜索Android视频裁剪,基本上都说的是FFmpeg实现视频裁剪,不过都需要通过JNI集成FFmpeg来调用里面的命令实现裁剪,但是这个问题对于大多数程序猿都是一个很困难的事,可能就卡在了调用JNI那个阶段了,JNI的学习我的博客里面有详细介绍,但是这还是很麻烦,有没有一种直接可以导入FFmpeg就可以直接使用的他的功能了?答案是有的,接下来就是介绍通过代码实现裁剪;

compile 'com.writingminds:FFmpegAndroid:0.3.2'

首先在build.gradle里面添加依赖就OK了,也不用管这依赖从哪里来的,想了解可以百度看,然后



初始化就可以,有点嘛卖逼不知当讲不当讲,一定要在清单文件记得注册这个Application!

扫描二维码关注公众号,回复: 2435187 查看本文章

这样就可以直接使用FFmpeg里面的命令了,重点来了:




public class TrimVideoUtil {

    private static final String TAG = TrimVideoUtil.class.getSimpleName();
    public static final int VIDEO_MAX_DURATION = 15;// 15秒
    public static final int MIN_TIME_FRAME = 5;
    private static final int thumb_Width = (DeviceUtil.getDeviceWidth() - UnitConverter.dpToPx(20)) / VIDEO_MAX_DURATION;
    private static final int thumb_Height = UnitConverter.dpToPx(60);
    private static final long one_frame_time = 1000000;

    public static void trimVideo(final 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());
          String outputName = "678";
        if (inputFile.contains(".MOV")){
            outputName =  "CutVideo_" + timeStamp + ".mov";
        }else {
            outputName =  "CutVideo_" + timeStamp + ".mp4";
        }
         Log.e("输入格式",inputFile);
         Log.e("输出格式",outputName);
         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 " + Util.local_movie_path + "/" + outputName;
        String[] command = cmd.split(" ");
        try {
            FFmpeg.getInstance(context).execute(command, new ExecuteBinaryResponseHandler() {
                @Override
                public void onFailure(String s) {
                    Toast.makeText(context, R.string.toast_cut_error,Toast.LENGTH_SHORT).show();
                    Log.e("失败",s);
                }

                @Override
                public void onSuccess(String s) {
                    callback.onFinishTrim(null);
                    Log.e("成功",s);
                    Toast.makeText(context,R.string.toast_cut_success,Toast.LENGTH_SHORT).show();
                }
                @Override
                public void onStart() {
                    callback.onStartTrim();
                    Log.e("开始","1");
                }
                @Override
                public void onFinish() {
                    Log.e("完成","3");
                }
            });
        } catch (FFmpegCommandAlreadyRunningException e) {
            e.printStackTrace();
        }
    }

   
    }

    
}

上面是裁剪的方法可以直接调用,到这里就可以实现裁剪了。完整代码可以在下面留言

猜你喜欢

转载自blog.csdn.net/qq_33756493/article/details/71271180