package com.frank.ffmpeg.activity; import android.annotation.SuppressLint; import android.content.Intent; import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; import android.widget.ProgressBar; import com.frank.ffmpeg.FFmpegCmd; import com.frank.ffmpeg.R; import com.frank.ffmpeg.util.FFmpegUtil; import java.io.File; public class VideoHandleActivity extends AppCompatActivity implements View.OnClickListener{ private static final String TAG = VideoHandleActivity.class.getSimpleName(); private static final int MSG_BEGIN = 101; private static final int MSG_FINISH = 102; 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; @SuppressLint("HandlerLeak") private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what){ case MSG_BEGIN: progress_video.setVisibility(View.VISIBLE); setGone(); break; case MSG_FINISH: progress_video.setVisibility(View.GONE); setVisible(); break; default: break; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_video_handle); intView(); } private void intView() { progress_video = (ProgressBar)findViewById(R.id.progress_video); findViewById(R.id.btn_video_transform).setOnClickListener(this); findViewById(R.id.btn_video_cut).setOnClickListener(this); findViewById(R.id.btn_video_concat).setOnClickListener(this); findViewById(R.id.btn_screen_shot).setOnClickListener(this); findViewById(R.id.btn_water_mark).setOnClickListener(this); findViewById(R.id.btn_generate_gif).setOnClickListener(this); findViewById(R.id.btn_screen_record).setOnClickListener(this); findViewById(R.id.btn_combine_video).setOnClickListener(this); findViewById(R.id.btn_play_video).setOnClickListener(this); } 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); } private void setGone() { findViewById(R.id.btn_video_transform).setVisibility(View.GONE); findViewById(R.id.btn_video_cut).setVisibility(View.GONE); findViewById(R.id.btn_video_concat).setVisibility(View.GONE); 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); } @Override public void onClick(View v) { int handleType; 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; default: handleType = 0; break; } doHandleVideo(handleType); } /** * 调用ffmpeg处理视频 * @param handleType handleType */ private void doHandleVideo(int handleType){ String[] commandLine = null; switch (handleType){ case 0://视频转码 String transformVideo = PATH + File.separator + "transformVideo.wmv"; commandLine = FFmpegUtil.transformVideo(srcFile, transformVideo); break; case 1://视频剪切 String cutVideo = PATH + File.separator + "cutVideo.mp4"; int startTime = 0; int duration = 20; commandLine = FFmpegUtil.cutVideo(srcFile, startTime, duration, cutVideo); break; case 2://视频合并 // commandLine = FFmpegUtil.toTs(srcFile, ts1); // concatStep ++; // String concatVideo = PATH + File.separator + "concatVideo.mp4"; // String appendVideo = PATH + File.separator + "test.mp4"; // File concatFile = new File(PATH + File.separator + "fileList.txt"); // try { // FileOutputStream fileOutputStream = new FileOutputStream(concatFile); // fileOutputStream.write(("file \'" + srcFile + "\'").getBytes()); // fileOutputStream.write("\n".getBytes()); // fileOutputStream.write(("file \'" + appendVideo + "\'").getBytes()); // fileOutputStream.flush(); // fileOutputStream.close(); // } catch (Exception e) { // e.printStackTrace(); // } // // commandLine = FFmpegUtil.concatVideo(srcFile, concatFile.getAbsolutePath(), concatVideo); break; case 3://视频截图 String screenShot = PATH + File.separator + "screenShot.jpg"; String size = "1080x720"; commandLine = FFmpegUtil.screenShot(srcFile, size, screenShot); break; case 4://视频添加水印 //1、图片 String photo = PATH + File.separator + "launcher.png"; String photoMark = PATH + File.separator + "photoMark.mp4"; commandLine = FFmpegUtil.addWaterMark(appendVideo, photo, photoMark); //2、文字 //String text = "Hello,FFmpeg"; //String textPath = PATH + File.separator + "text.jpg"; //boolean result = BitmapUtil.textToPicture(textPath, text, this); //Log.i(TAG, "text to pitcture result=" + result); //String textMark = PATH + File.separator + "textMark.mp4"; //commandLine = FFmpegUtil.addWaterMark(appendVideo, photo, textMark); break; case 5://视频转成gif String Video2Gif = PATH + File.separator + "Video2Gif.gif"; int gifStart = 30; int gifDuration = 5; commandLine = FFmpegUtil.generateGif(srcFile, gifStart, gifDuration, Video2Gif); break; case 6://屏幕录制 // String screenRecord = PATH + File.separator + "screenRecord.mp4"; // String screenSize = "320x240"; // int recordTime = 10; // commandLine = FFmpegUtil.screenRecord(screenSize, recordTime, screenRecord); break; case 7://图片合成视频 //图片所在路径,图片命名格式img+number.jpg String picturePath = PATH + File.separator + "img/"; String combineVideo = PATH + File.separator + "combineVideo.mp4"; commandLine = FFmpegUtil.pictureToVideo(picturePath, combineVideo); break; case 8://视频解码播放 startActivity(new Intent(VideoHandleActivity.this, VideoPlayerActivity.class)); return; default: break; } executeFFmpegCmd(commandLine); } /** * 执行ffmpeg命令行 * @param commandLine commandLine */ private void executeFFmpegCmd(final String[] commandLine){ if(commandLine == null){ return; } FFmpegCmd.execute(commandLine, new FFmpegCmd.OnHandleListener() { @Override public void onBegin() { Log.i(TAG, "handle video onBegin..."); mHandler.obtainMessage(MSG_BEGIN).sendToTarget(); } @Override public void onEnd(int result) { Log.i(TAG, "handle video onEnd..."); mHandler.obtainMessage(MSG_FINISH).sendToTarget(); } }); } }