增加视频抽帧

pull/107/head
xufulong 7 years ago
parent d6912e7155
commit 224ccd6179
  1. 26
      app/src/main/java/com/frank/ffmpeg/activity/VideoHandleActivity.java
  2. 22
      app/src/main/java/com/frank/ffmpeg/util/FFmpegUtil.java
  3. 6
      app/src/main/java/com/frank/ffmpeg/util/FileUtil.java
  4. 196
      app/src/main/res/layout/activity_video_handle.xml
  5. 1
      app/src/main/res/values/strings.xml

@ -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;
}

@ -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(" ");
}
}

@ -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;
}

@ -5,120 +5,114 @@
android:layout_height="match_parent"
tools:context="com.frank.ffmpeg.activity.VideoHandleActivity">
<Button
android:id="@+id/btn_video_transform"
<ProgressBar
android:id="@+id/progress_video"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="10dp"
android:text="@string/video_transform"/>
android:layout_centerInParent="true"
android:visibility="gone"/>
<Button
android:id="@+id/btn_video_cut"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_below="@id/btn_video_transform"
android:layout_marginTop="10dp"
android:text="@string/video_cut"/>
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:orientation="vertical">
<Button
android:id="@+id/btn_video_transform"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="@string/video_transform"/>
<Button
android:id="@+id/btn_video_concat"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_below="@id/btn_video_cut"
android:layout_marginTop="10dp"
android:text="@string/video_concat"
android:visibility="gone"/>
<Button
android:id="@+id/btn_video_cut"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="@string/video_cut"/>
<Button
android:id="@+id/btn_screen_shot"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_below="@id/btn_video_concat"
android:layout_marginTop="10dp"
android:text="@string/video_screen_shot"/>
<Button
android:id="@+id/btn_video_concat"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="@string/video_concat"
android:visibility="gone"/>
<Button
android:id="@+id/btn_water_mark"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_below="@id/btn_screen_shot"
android:layout_marginTop="10dp"
android:text="@string/video_water_mark"/>
<Button
android:id="@+id/btn_screen_shot"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="@string/video_screen_shot"/>
<Button
android:id="@+id/btn_generate_gif"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_below="@id/btn_water_mark"
android:layout_marginTop="10dp"
android:text="@string/video_to_gif"/>
<Button
android:id="@+id/btn_water_mark"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="@string/video_water_mark"/>
<Button
android:id="@+id/btn_screen_record"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_below="@id/btn_generate_gif"
android:layout_marginTop="10dp"
android:text="@string/video_screen_record"
android:visibility="gone"/>
<Button
android:id="@+id/btn_generate_gif"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="@string/video_to_gif"/>
<Button
android:id="@+id/btn_combine_video"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_below="@id/btn_screen_record"
android:layout_marginTop="10dp"
android:text="@string/video_from_photo"/>
<Button
android:id="@+id/btn_screen_record"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="@string/video_screen_record"
android:visibility="gone"/>
<ProgressBar
android:id="@+id/progress_video"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:visibility="gone"/>
<Button
android:id="@+id/btn_combine_video"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="@string/video_from_photo"/>
<Button
android:id="@+id/btn_play_video"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_below="@id/btn_combine_video"
android:layout_marginTop="10dp"
android:text="@string/video_play"/>
<Button
android:id="@+id/btn_play_video"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="@string/video_play"/>
<Button
android:id="@+id/btn_multi_video"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_below="@id/btn_play_video"
android:layout_marginTop="10dp"
android:text="@string/video_multi"/>
<Button
android:id="@+id/btn_multi_video"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="@string/video_multi"/>
<Button
android:id="@+id/btn_reverse_video"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_below="@id/btn_multi_video"
android:layout_marginTop="10dp"
android:text="@string/video_reverse"/>
<Button
android:id="@+id/btn_reverse_video"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="@string/video_reverse"/>
<Button
android:id="@+id/btn_denoise_video"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_below="@id/btn_reverse_video"
android:layout_marginTop="10dp"
android:text="@string/video_denoise"/>
<Button
android:id="@+id/btn_denoise_video"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="@string/video_denoise"/>
<Button
android:id="@+id/btn_to_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="@string/video_image"/>
</LinearLayout>
</ScrollView>
</RelativeLayout>

@ -37,6 +37,7 @@
<string name="video_multi">画面拼接</string>
<string name="video_reverse">视频倒播</string>
<string name="video_denoise">视频降噪</string>
<string name="video_image">视频转图片</string>
<string name="swap">切换</string>
<string name="start">开始</string>

Loading…
Cancel
Save