diff --git a/app/src/main/java/com/frank/ffmpeg/activity/VideoHandleActivity.java b/app/src/main/java/com/frank/ffmpeg/activity/VideoHandleActivity.java index bfccd2f..f2d0630 100644 --- a/app/src/main/java/com/frank/ffmpeg/activity/VideoHandleActivity.java +++ b/app/src/main/java/com/frank/ffmpeg/activity/VideoHandleActivity.java @@ -9,6 +9,7 @@ import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; +import android.view.Window; import android.widget.ProgressBar; import com.frank.ffmpeg.FFmpegCmd; import com.frank.ffmpeg.R; @@ -51,6 +52,10 @@ public class VideoHandleActivity extends AppCompatActivity implements View.OnCli @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + requestWindowFeature(Window.FEATURE_NO_TITLE); + if (getSupportActionBar() != null){ + getSupportActionBar().hide(); + } setContentView(R.layout.activity_video_handle); intView(); @@ -70,6 +75,7 @@ public class VideoHandleActivity extends AppCompatActivity implements View.OnCli findViewById(R.id.btn_multi_video).setOnClickListener(this); findViewById(R.id.btn_reverse_video).setOnClickListener(this); findViewById(R.id.btn_denoise_video).setOnClickListener(this); + findViewById(R.id.btn_to_image).setOnClickListener(this); } private void setVisible() { @@ -85,6 +91,7 @@ public class VideoHandleActivity extends AppCompatActivity implements View.OnCli findViewById(R.id.btn_multi_video).setVisibility(View.VISIBLE); findViewById(R.id.btn_reverse_video).setVisibility(View.VISIBLE); findViewById(R.id.btn_denoise_video).setVisibility(View.VISIBLE); + findViewById(R.id.btn_to_image).setVisibility(View.VISIBLE); } private void setGone() { @@ -100,6 +107,7 @@ public class VideoHandleActivity extends AppCompatActivity implements View.OnCli findViewById(R.id.btn_multi_video).setVisibility(View.GONE); findViewById(R.id.btn_reverse_video).setVisibility(View.GONE); findViewById(R.id.btn_denoise_video).setVisibility(View.GONE); + findViewById(R.id.btn_to_image).setVisibility(View.GONE); } @Override @@ -142,6 +150,9 @@ public class VideoHandleActivity extends AppCompatActivity implements View.OnCli case R.id.btn_denoise_video: handleType = 11; break; + case R.id.btn_to_image: + handleType = 12; + break; default: handleType = 0; break; @@ -265,6 +276,21 @@ public class VideoHandleActivity extends AppCompatActivity implements View.OnCli } commandLine = FFmpegUtil.denoiseVideo(srcFile, denoise); break; + case 12://视频转图片 + String srcFile = PATH + File.separator + "beyond.mp4"; + if (!FileUtil.checkFileExist(srcFile)){ + return; + } + String imagePath = PATH + File.separator + "Video2Image/";//图片保存路径 + File imageFile = new File(imagePath); + if (!imageFile.exists()){ + imageFile.mkdir(); + } + int mStartTime = 10;//开始时间 + int mDuration = 20;//持续时间(注意开始时间+持续时间之和不能大于视频总时长) + int mFrameRate = 10;//帧率(从视频中每秒抽多少帧) + commandLine = FFmpegUtil.videoToImage(srcFile, mStartTime, mDuration, mFrameRate, imagePath); + break; default: break; } diff --git a/app/src/main/java/com/frank/ffmpeg/util/FFmpegUtil.java b/app/src/main/java/com/frank/ffmpeg/util/FFmpegUtil.java index b0dab7b..fa07f50 100644 --- a/app/src/main/java/com/frank/ffmpeg/util/FFmpegUtil.java +++ b/app/src/main/java/com/frank/ffmpeg/util/FFmpegUtil.java @@ -5,6 +5,8 @@ import android.util.Log; import com.frank.ffmpeg.format.VideoLayout; +import java.util.Locale; + /** * ffmpeg工具:拼接命令行处理音视频 * Created by frank on 2018/1/23. @@ -277,4 +279,24 @@ public class FFmpegUtil { return reverseVideo.split(" "); } + /** + * 视频抽帧转成图片 + * @param inputFile 输入文件 + * @param startTime 开始时间 + * @param duration 持续时间 + * @param frameRate 帧率 + * @param targetFile 输出文件 + * + * @return 视频抽帧的命令行 + */ + public static String[] videoToImage(String inputFile, int startTime, int duration, int frameRate, String targetFile){ + //-ss:开始时间,单位为秒 + //-t:持续时间,单位为秒 + //-r:帧率,每秒抽多少帧 + String toImage = "ffmpeg -i %s -ss %s -t %s -r %s %s"; + toImage = String.format(Locale.CHINESE, toImage, inputFile, startTime, duration, frameRate, targetFile); + toImage = toImage + "%3d.jpg"; + return toImage.split(" "); + } + } diff --git a/app/src/main/java/com/frank/ffmpeg/util/FileUtil.java b/app/src/main/java/com/frank/ffmpeg/util/FileUtil.java index 4db0264..8405c61 100644 --- a/app/src/main/java/com/frank/ffmpeg/util/FileUtil.java +++ b/app/src/main/java/com/frank/ffmpeg/util/FileUtil.java @@ -1,6 +1,8 @@ package com.frank.ffmpeg.util; import android.text.TextUtils; +import android.util.Log; + import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; @@ -73,11 +75,11 @@ public class FileUtil { */ public static boolean checkFileExist(String path){ if (TextUtils.isEmpty(path)) { - throw new NullPointerException(path + "is null!"); + Log.e("FileUtil", path + "is null!"); } File file = new File(path); if(!file.exists()){ - throw new NullPointerException(path + " is not exist!"); + Log.e("FileUtil", path + " is not exist!"); } return true; } diff --git a/app/src/main/res/layout/activity_video_handle.xml b/app/src/main/res/layout/activity_video_handle.xml index e41413d..8ea597c 100644 --- a/app/src/main/res/layout/activity_video_handle.xml +++ b/app/src/main/res/layout/activity_video_handle.xml @@ -5,120 +5,114 @@ android:layout_height="match_parent" tools:context="com.frank.ffmpeg.activity.VideoHandleActivity"> -