VideoHandleActivity接入基类Activity

VideoHandleActivity接入基类Activity
pull/107/head
xufulong 5 years ago
parent b9e149ba28
commit 8157a2d6e0
  1. 4
      app/src/main/java/com/frank/ffmpeg/activity/AudioHandleActivity.java
  2. 230
      app/src/main/java/com/frank/ffmpeg/activity/VideoHandleActivity.java
  3. 7
      app/src/main/java/com/frank/ffmpeg/activity/VideoPlayerActivity.java
  4. 1
      app/src/main/res/layout/activity_video_handle.xml

@ -63,6 +63,7 @@ public class AudioHandleActivity extends BaseActivity {
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
hideActionBar();
initView(); initView();
} }
@ -77,7 +78,8 @@ public class AudioHandleActivity extends BaseActivity {
R.id.btn_play_audio, R.id.btn_play_audio,
R.id.btn_play_opensl, R.id.btn_play_opensl,
R.id.btn_audio_encode, R.id.btn_audio_encode,
R.id.btn_pcm_concat); R.id.btn_pcm_concat
);
} }
@Override @Override

@ -6,33 +6,28 @@ import android.os.Bundle;
import android.os.Environment; import android.os.Environment;
import android.os.Handler; import android.os.Handler;
import android.os.Message; import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.util.Log; import android.util.Log;
import android.view.View; import android.view.View;
import android.view.Window; import android.widget.LinearLayout;
import android.view.animation.BounceInterpolator;
import android.widget.ProgressBar; import android.widget.ProgressBar;
import com.frank.ffmpeg.FFmpegCmd; import com.frank.ffmpeg.FFmpegCmd;
import com.frank.ffmpeg.R; import com.frank.ffmpeg.R;
import com.frank.ffmpeg.floating.FloatPlayerView;
import com.frank.ffmpeg.floating.FloatWindow;
import com.frank.ffmpeg.floating.MoveType;
import com.frank.ffmpeg.floating.Screen;
import com.frank.ffmpeg.format.VideoLayout; import com.frank.ffmpeg.format.VideoLayout;
import com.frank.ffmpeg.util.FFmpegUtil; import com.frank.ffmpeg.util.FFmpegUtil;
import com.frank.ffmpeg.util.FileUtil; import com.frank.ffmpeg.util.FileUtil;
import java.io.File; import java.io.File;
public class VideoHandleActivity extends AppCompatActivity implements View.OnClickListener{ public class VideoHandleActivity extends BaseActivity {
private static final String TAG = VideoHandleActivity.class.getSimpleName(); private static final String TAG = VideoHandleActivity.class.getSimpleName();
private static final int MSG_BEGIN = 101; private static final int MSG_BEGIN = 101;
private static final int MSG_FINISH = 102; private static final int MSG_FINISH = 102;
private static final String PATH = Environment.getExternalStorageDirectory().getPath(); private static final String PATH = Environment.getExternalStorageDirectory().getPath();
private static final String srcFile = PATH + File.separator + "hello.mp4";
private static final String appendVideo = PATH + File.separator + "test.mp4";
private ProgressBar progress_video; private ProgressBar progress_video;
private LinearLayout layoutVideoHandle;
private int viewId;
@SuppressLint("HandlerLeak") @SuppressLint("HandlerLeak")
private Handler mHandler = new Handler(){ private Handler mHandler = new Handler(){
@ -42,11 +37,11 @@ public class VideoHandleActivity extends AppCompatActivity implements View.OnCli
switch (msg.what){ switch (msg.what){
case MSG_BEGIN: case MSG_BEGIN:
progress_video.setVisibility(View.VISIBLE); progress_video.setVisibility(View.VISIBLE);
setGone(); layoutVideoHandle.setVisibility(View.GONE);
break; break;
case MSG_FINISH: case MSG_FINISH:
progress_video.setVisibility(View.GONE); progress_video.setVisibility(View.GONE);
setVisible(); layoutVideoHandle.setVisibility(View.VISIBLE);
break; break;
default: default:
break; break;
@ -54,147 +49,76 @@ public class VideoHandleActivity extends AppCompatActivity implements View.OnCli
} }
}; };
@Override
int getLayoutId() {
return R.layout.activity_video_handle;
}
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
if (getSupportActionBar() != null){
getSupportActionBar().hide();
}
setContentView(R.layout.activity_video_handle);
hideActionBar();
intView(); intView();
} }
private void intView() { private void intView() {
progress_video = (ProgressBar)findViewById(R.id.progress_video); progress_video = getView(R.id.progress_video);
findViewById(R.id.btn_video_transform).setOnClickListener(this); layoutVideoHandle = getView(R.id.layout_video_handle);
findViewById(R.id.btn_video_cut).setOnClickListener(this); initViewsWithClick(
findViewById(R.id.btn_video_concat).setOnClickListener(this); R.id.btn_video_transform,
findViewById(R.id.btn_screen_shot).setOnClickListener(this); R.id.btn_video_cut,
findViewById(R.id.btn_water_mark).setOnClickListener(this); R.id.btn_video_concat,
findViewById(R.id.btn_generate_gif).setOnClickListener(this); R.id.btn_screen_shot,
findViewById(R.id.btn_screen_record).setOnClickListener(this); R.id.btn_water_mark,
findViewById(R.id.btn_combine_video).setOnClickListener(this); R.id.btn_generate_gif,
findViewById(R.id.btn_play_video).setOnClickListener(this); R.id.btn_screen_record,
findViewById(R.id.btn_multi_video).setOnClickListener(this); R.id.btn_combine_video,
findViewById(R.id.btn_reverse_video).setOnClickListener(this); R.id.btn_play_video,
findViewById(R.id.btn_denoise_video).setOnClickListener(this); R.id.btn_multi_video,
findViewById(R.id.btn_to_image).setOnClickListener(this); R.id.btn_reverse_video,
findViewById(R.id.btn_pip).setOnClickListener(this); R.id.btn_denoise_video,
} R.id.btn_to_image,
R.id.btn_pip
private void setVisible() { );
findViewById(R.id.btn_video_transform).setVisibility(View.VISIBLE);
findViewById(R.id.btn_video_cut).setVisibility(View.VISIBLE);
findViewById(R.id.btn_video_concat).setVisibility(View.GONE);
findViewById(R.id.btn_screen_shot).setVisibility(View.VISIBLE);
findViewById(R.id.btn_water_mark).setVisibility(View.VISIBLE);
findViewById(R.id.btn_generate_gif).setVisibility(View.VISIBLE);
findViewById(R.id.btn_screen_record).setVisibility(View.GONE);
findViewById(R.id.btn_combine_video).setVisibility(View.VISIBLE);
findViewById(R.id.btn_play_video).setVisibility(View.VISIBLE);
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);
findViewById(R.id.btn_pip).setVisibility(View.VISIBLE);
} }
private void setGone() { @Override
findViewById(R.id.btn_video_transform).setVisibility(View.GONE); public void onViewClick(View view) {
findViewById(R.id.btn_video_cut).setVisibility(View.GONE); viewId = view.getId();
findViewById(R.id.btn_video_concat).setVisibility(View.GONE); selectFile();
findViewById(R.id.btn_screen_shot).setVisibility(View.GONE);
findViewById(R.id.btn_water_mark).setVisibility(View.GONE);
findViewById(R.id.btn_generate_gif).setVisibility(View.GONE);
findViewById(R.id.btn_screen_record).setVisibility(View.GONE);
findViewById(R.id.btn_combine_video).setVisibility(View.GONE);
findViewById(R.id.btn_play_video).setVisibility(View.GONE);
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);
findViewById(R.id.btn_pip).setVisibility(View.GONE);
} }
@Override @Override
public void onClick(View v) { void onSelectedFile(String filePath) {
int handleType; doHandleVideo(filePath);
switch (v.getId()){
case R.id.btn_video_transform:
handleType = 0;
break;
case R.id.btn_video_cut:
handleType = 1;
break;
case R.id.btn_video_concat:
handleType = 2;
break;
case R.id.btn_screen_shot:
handleType = 3;
break;
case R.id.btn_water_mark:
handleType = 4;
break;
case R.id.btn_generate_gif:
handleType = 5;
break;
case R.id.btn_screen_record:
handleType = 6;
break;
case R.id.btn_combine_video:
handleType = 7;
break;
case R.id.btn_play_video:
handleType = 8;
break;
case R.id.btn_multi_video:
handleType = 9;
break;
case R.id.btn_reverse_video:
handleType = 10;
break;
case R.id.btn_denoise_video:
handleType = 11;
break;
case R.id.btn_to_image:
handleType = 12;
break;
case R.id.btn_pip:
handleType = 13;
break;
default:
handleType = 0;
break;
}
doHandleVideo(handleType);
} }
/** /**
* 调用ffmpeg处理视频 * 调用ffmpeg处理视频
* @param handleType handleType * @param srcFile srcFile
*/ */
private void doHandleVideo(int handleType){ private void doHandleVideo(String srcFile) {
String[] commandLine = null; String[] commandLine = null;
switch (handleType){ if (!FileUtil.checkFileExist(srcFile)) {
case 0://视频转码:mp4转flv、wmv, 或者flv、wmv转Mp4 return;
if (!FileUtil.checkFileExist(srcFile)){ }
return; if (!FileUtil.isVideo(srcFile)) {
} showToast(getString(R.string.wrong_video_format));
return;
}
switch (viewId){
case R.id.btn_video_transform://视频转码:mp4转flv、wmv, 或者flv、wmv转Mp4
String transformVideo = PATH + File.separator + "transformVideo.flv"; String transformVideo = PATH + File.separator + "transformVideo.flv";
commandLine = FFmpegUtil.transformVideo(srcFile, transformVideo); commandLine = FFmpegUtil.transformVideo(srcFile, transformVideo);
break; break;
case 1://视频剪切 case R.id.btn_video_cut://视频剪切
if (!FileUtil.checkFileExist(srcFile)){
return;
}
String cutVideo = PATH + File.separator + "cutVideo.mp4"; String cutVideo = PATH + File.separator + "cutVideo.mp4";
int startTime = 0; int startTime = 0;
int duration = 20; int duration = 20;
commandLine = FFmpegUtil.cutVideo(srcFile, startTime, duration, cutVideo); commandLine = FFmpegUtil.cutVideo(srcFile, startTime, duration, cutVideo);
break; break;
case 2://视频合并 case R.id.btn_video_concat://视频合并
// commandLine = FFmpegUtil.toTs(srcFile, ts1); // commandLine = FFmpegUtil.toTs(srcFile, ts1);
// concatStep ++; // concatStep ++;
// String concatVideo = PATH + File.separator + "concatVideo.mp4"; // String concatVideo = PATH + File.separator + "concatVideo.mp4";
@ -210,49 +134,39 @@ public class VideoHandleActivity extends AppCompatActivity implements View.OnCli
// } catch (Exception e) { // } catch (Exception e) {
// e.printStackTrace(); // e.printStackTrace();
// } // }
//
// commandLine = FFmpegUtil.concatVideo(srcFile, concatFile.getAbsolutePath(), concatVideo); // commandLine = FFmpegUtil.concatVideo(srcFile, concatFile.getAbsolutePath(), concatVideo);
break; break;
case 3://视频截图 case R.id.btn_screen_shot://视频截图
if (!FileUtil.checkFileExist(srcFile)){
return;
}
String screenShot = PATH + File.separator + "screenShot.jpg"; String screenShot = PATH + File.separator + "screenShot.jpg";
String size = "1080x720"; String size = "1080x720";
commandLine = FFmpegUtil.screenShot(srcFile, size, screenShot); commandLine = FFmpegUtil.screenShot(srcFile, size, screenShot);
break; break;
case 4://视频添加水印 case R.id.btn_water_mark://视频添加水印
if (!FileUtil.checkFileExist(appendVideo)){
return;
}
//1、图片 //1、图片
String photo = PATH + File.separator + "launcher.png"; String photo = PATH + File.separator + "launcher.png";
String photoMark = PATH + File.separator + "photoMark.mp4"; String photoMark = PATH + File.separator + "photoMark.mp4";
commandLine = FFmpegUtil.addWaterMark(appendVideo, photo, photoMark); commandLine = FFmpegUtil.addWaterMark(srcFile, photo, photoMark);
//2、文字 //2、文字
// String text = "Hello,FFmpeg"; // String text = "Hello,FFmpeg";
// String textPath = PATH + File.separator + "text.jpg"; // String textPath = PATH + File.separator + "text.jpg";
// boolean result = BitmapUtil.textToPicture(textPath, text, this); // boolean result = BitmapUtil.textToPicture(textPath, text, this);
// Log.i(TAG, "text to pitcture result=" + result); // Log.i(TAG, "text to pitcture result=" + result);
// String textMark = PATH + File.separator + "textMark.mp4"; // String textMark = PATH + File.separator + "textMark.mp4";
// commandLine = FFmpegUtil.addWaterMark(appendVideo, textPath, textMark); // commandLine = FFmpegUtil.addWaterMark(srcFile, textPath, textMark);
break; break;
case 5://视频转成gif case R.id.btn_generate_gif://视频转成gif
if (!FileUtil.checkFileExist(srcFile)){
return;
}
String Video2Gif = PATH + File.separator + "Video2Gif.gif"; String Video2Gif = PATH + File.separator + "Video2Gif.gif";
int gifStart = 30; int gifStart = 30;
int gifDuration = 5; int gifDuration = 5;
commandLine = FFmpegUtil.generateGif(srcFile, gifStart, gifDuration, Video2Gif); commandLine = FFmpegUtil.generateGif(srcFile, gifStart, gifDuration, Video2Gif);
break; break;
case 6://屏幕录制 case R.id.btn_screen_record://屏幕录制
// String screenRecord = PATH + File.separator + "screenRecord.mp4"; // String screenRecord = PATH + File.separator + "screenRecord.mp4";
// String screenSize = "320x240"; // String screenSize = "320x240";
// int recordTime = 10; // int recordTime = 10;
// commandLine = FFmpegUtil.screenRecord(screenSize, recordTime, screenRecord); // commandLine = FFmpegUtil.screenRecord(screenSize, recordTime, screenRecord);
break; break;
case 7://图片合成视频 case R.id.btn_combine_video://图片合成视频
//图片所在路径,图片命名格式img+number.jpg //图片所在路径,图片命名格式img+number.jpg
String picturePath = PATH + File.separator + "img/"; String picturePath = PATH + File.separator + "img/";
if (!FileUtil.checkFileExist(picturePath)){ if (!FileUtil.checkFileExist(picturePath)){
@ -261,10 +175,12 @@ public class VideoHandleActivity extends AppCompatActivity implements View.OnCli
String combineVideo = PATH + File.separator + "combineVideo.mp4"; String combineVideo = PATH + File.separator + "combineVideo.mp4";
commandLine = FFmpegUtil.pictureToVideo(picturePath, combineVideo); commandLine = FFmpegUtil.pictureToVideo(picturePath, combineVideo);
break; break;
case 8://视频解码播放 case R.id.btn_play_video://视频解码播放
startActivity(new Intent(VideoHandleActivity.this, VideoPlayerActivity.class)); Intent playIntent = new Intent(VideoHandleActivity.this, VideoPlayerActivity.class);
playIntent.putExtra("videoHandlePath", srcFile);
startActivity(playIntent);
return; return;
case 9://视频画面拼接:分辨率、时长、封装格式不一致时,先把视频源转为一致 case R.id.btn_multi_video://视频画面拼接:分辨率、时长、封装格式不一致时,先把视频源转为一致
String input1 = PATH + File.separator + "input1.mp4"; String input1 = PATH + File.separator + "input1.mp4";
String input2 = PATH + File.separator + "input2.mp4"; String input2 = PATH + File.separator + "input2.mp4";
String outputFile = PATH + File.separator + "multi.mp4"; String outputFile = PATH + File.separator + "multi.mp4";
@ -273,25 +189,15 @@ public class VideoHandleActivity extends AppCompatActivity implements View.OnCli
} }
commandLine = FFmpegUtil.multiVideo(input1, input2, outputFile, VideoLayout.LAYOUT_HORIZONTAL); commandLine = FFmpegUtil.multiVideo(input1, input2, outputFile, VideoLayout.LAYOUT_HORIZONTAL);
break; break;
case 10://视频反序倒播 case R.id.btn_reverse_video://视频反序倒播
String output = PATH + File.separator + "reverse.mp4"; String output = PATH + File.separator + "reverse.mp4";
if (!FileUtil.checkFileExist(srcFile)){
return;
}
commandLine = FFmpegUtil.reverseVideo(srcFile, output); commandLine = FFmpegUtil.reverseVideo(srcFile, output);
break; break;
case 11://视频降噪 case R.id.btn_denoise_video://视频降噪
String denoise = PATH + File.separator + "denoise.mp4"; String denoise = PATH + File.separator + "denoise.mp4";
if (!FileUtil.checkFileExist(srcFile)){
return;
}
commandLine = FFmpegUtil.denoiseVideo(srcFile, denoise); commandLine = FFmpegUtil.denoiseVideo(srcFile, denoise);
break; break;
case 12://视频转图片 case R.id.btn_to_image://视频转图片
String srcFile = PATH + File.separator + "beyond.mp4";
if (!FileUtil.checkFileExist(srcFile)){
return;
}
String imagePath = PATH + File.separator + "Video2Image/";//图片保存路径 String imagePath = PATH + File.separator + "Video2Image/";//图片保存路径
File imageFile = new File(imagePath); File imageFile = new File(imagePath);
if (!imageFile.exists()){ if (!imageFile.exists()){
@ -305,7 +211,7 @@ public class VideoHandleActivity extends AppCompatActivity implements View.OnCli
int mFrameRate = 10;//帧率(从视频中每秒抽多少帧) int mFrameRate = 10;//帧率(从视频中每秒抽多少帧)
commandLine = FFmpegUtil.videoToImage(srcFile, mStartTime, mDuration, mFrameRate, imagePath); commandLine = FFmpegUtil.videoToImage(srcFile, mStartTime, mDuration, mFrameRate, imagePath);
break; break;
case 13://两个视频合成画中画 case R.id.btn_pip://两个视频合成画中画
String inputFile1 = PATH + File.separator + "beyond.mp4"; String inputFile1 = PATH + File.separator + "beyond.mp4";
String inputFile2 = PATH + File.separator + "small_girl.mp4"; String inputFile2 = PATH + File.separator + "small_girl.mp4";
if (!FileUtil.checkFileExist(inputFile1) && !FileUtil.checkFileExist(inputFile2)){ if (!FileUtil.checkFileExist(inputFile1) && !FileUtil.checkFileExist(inputFile2)){
@ -328,8 +234,8 @@ public class VideoHandleActivity extends AppCompatActivity implements View.OnCli
* 执行ffmpeg命令行 * 执行ffmpeg命令行
* @param commandLine commandLine * @param commandLine commandLine
*/ */
private void executeFFmpegCmd(final String[] commandLine){ private void executeFFmpegCmd(final String[] commandLine) {
if(commandLine == null){ if(commandLine == null) {
return; return;
} }
FFmpegCmd.execute(commandLine, new FFmpegCmd.OnHandleListener() { FFmpegCmd.execute(commandLine, new FFmpegCmd.OnHandleListener() {

@ -1,6 +1,7 @@
package com.frank.ffmpeg.activity; package com.frank.ffmpeg.activity;
import android.os.Bundle; import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import android.view.SurfaceHolder; import android.view.SurfaceHolder;
import android.view.SurfaceView; import android.view.SurfaceView;
@ -23,6 +24,8 @@ public class VideoPlayerActivity extends BaseActivity implements SurfaceHolder.C
private boolean surfaceCreated; private boolean surfaceCreated;
private String videoPath;
@Override @Override
int getLayoutId() { int getLayoutId() {
return R.layout.activity_video_player; return R.layout.activity_video_player;
@ -32,6 +35,7 @@ public class VideoPlayerActivity extends BaseActivity implements SurfaceHolder.C
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
videoPath = getIntent().getStringExtra("videoHandlePath");
initView(); initView();
initPlayer(); initPlayer();
showToast(getString(R.string.please_click_select)); showToast(getString(R.string.please_click_select));
@ -53,6 +57,9 @@ public class VideoPlayerActivity extends BaseActivity implements SurfaceHolder.C
@Override @Override
public void surfaceCreated(SurfaceHolder holder) { public void surfaceCreated(SurfaceHolder holder) {
surfaceCreated = true; surfaceCreated = true;
if (!TextUtils.isEmpty(videoPath)) {
startPlay(videoPath);
}
} }
@Override @Override

@ -16,6 +16,7 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<LinearLayout <LinearLayout
android:id="@+id/layout_video_handle"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:gravity="center_horizontal" android:gravity="center_horizontal"

Loading…
Cancel
Save