diff --git a/app/src/main/java/com/frank/ffmpeg/activity/AudioHandleActivity.java b/app/src/main/java/com/frank/ffmpeg/activity/AudioHandleActivity.java
index c291159..40d546c 100644
--- a/app/src/main/java/com/frank/ffmpeg/activity/AudioHandleActivity.java
+++ b/app/src/main/java/com/frank/ffmpeg/activity/AudioHandleActivity.java
@@ -4,10 +4,10 @@ import android.annotation.SuppressLint;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
-import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
+import android.widget.LinearLayout;
import android.widget.ProgressBar;
import java.io.File;
@@ -23,29 +23,30 @@ import com.frank.ffmpeg.util.FileUtil;
* Created by frank on 2018/1/23.
*/
-public class AudioHandleActivity extends AppCompatActivity implements View.OnClickListener{
+public class AudioHandleActivity extends BaseActivity {
private final static String TAG = AudioHandleActivity.class.getSimpleName();
private final static String PATH = Environment.getExternalStorageDirectory().getPath();
- private String srcFile = PATH + File.separator + "tiger.mp3";
private String appendFile = PATH + File.separator + "test.mp3";
- private final static int MSG_BEGIN = 11;
- private final static int MSG_FINISH = 12;
+ private final static int MSG_BEGIN = 311;
+ private final static int MSG_FINISH = 312;
private ProgressBar progress_audio;
+ private LinearLayout layoutAudioHandle;
+ private int viewId;
@SuppressLint("HandlerLeak")
private Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
- switch (msg.what){
+ switch (msg.what) {
case MSG_BEGIN:
progress_audio.setVisibility(View.VISIBLE);
- setGone();
+ layoutAudioHandle.setVisibility(View.GONE);
break;
case MSG_FINISH:
progress_audio.setVisibility(View.GONE);
- setVisible();
+ layoutAudioHandle.setVisibility(View.VISIBLE);
break;
default:
break;
@@ -53,94 +54,58 @@ public class AudioHandleActivity extends AppCompatActivity implements View.OnCli
}
};
+ @Override
+ int getLayoutId() {
+ return R.layout.activity_audio_handle;
+ }
+
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_audio_handle);
initView();
}
private void initView() {
- progress_audio = (ProgressBar) findViewById(R.id.progress_audio);
- findViewById(R.id.btn_transform).setOnClickListener(this);
- findViewById(R.id.btn_cut).setOnClickListener(this);
- findViewById(R.id.btn_concat).setOnClickListener(this);
- findViewById(R.id.btn_mix).setOnClickListener(this);
- findViewById(R.id.btn_play_audio).setOnClickListener(this);
- findViewById(R.id.btn_play_opensl).setOnClickListener(this);
- findViewById(R.id.btn_audio_encode).setOnClickListener(this);
- findViewById(R.id.btn_pcm_concat).setOnClickListener(this);
- }
-
- private void setVisible() {
- findViewById(R.id.btn_transform).setVisibility(View.VISIBLE);
- findViewById(R.id.btn_cut).setVisibility(View.VISIBLE);
- findViewById(R.id.btn_concat).setVisibility(View.VISIBLE);
- findViewById(R.id.btn_mix).setVisibility(View.VISIBLE);
- findViewById(R.id.btn_play_audio).setVisibility(View.VISIBLE);
- findViewById(R.id.btn_play_opensl).setVisibility(View.VISIBLE);
- findViewById(R.id.btn_audio_encode).setVisibility(View.VISIBLE);
- findViewById(R.id.btn_pcm_concat).setVisibility(View.VISIBLE);
+ progress_audio = getView(R.id.progress_audio);
+ layoutAudioHandle = getView(R.id.layout_audio_handle);
+ initViewsWithClick(
+ R.id.btn_transform,
+ R.id.btn_cut,
+ R.id.btn_concat,
+ R.id.btn_mix,
+ R.id.btn_play_audio,
+ R.id.btn_play_opensl,
+ R.id.btn_audio_encode,
+ R.id.btn_pcm_concat);
}
- private void setGone() {
- findViewById(R.id.btn_transform).setVisibility(View.GONE);
- findViewById(R.id.btn_cut).setVisibility(View.GONE);
- findViewById(R.id.btn_concat).setVisibility(View.GONE);
- findViewById(R.id.btn_mix).setVisibility(View.GONE);
- findViewById(R.id.btn_play_audio).setVisibility(View.GONE);
- findViewById(R.id.btn_play_opensl).setVisibility(View.GONE);
- findViewById(R.id.btn_audio_encode).setVisibility(View.GONE);
- findViewById(R.id.btn_pcm_concat).setVisibility(View.GONE);
+ @Override
+ public void onViewClick(View view) {
+ viewId = view.getId();
+ selectFile();
}
@Override
- public void onClick(View v) {
- int handleType;
- switch (v.getId()){
- case R.id.btn_transform:
- handleType = 0;
- break;
- case R.id.btn_cut:
- handleType = 1;
- break;
- case R.id.btn_concat:
- handleType = 2;
- break;
- case R.id.btn_mix:
- handleType = 3;
- break;
- case R.id.btn_play_audio:
- handleType = 4;
- break;
- case R.id.btn_play_opensl:
- handleType = 5;
- break;
- case R.id.btn_audio_encode:
- handleType = 6;
- break;
- case R.id.btn_pcm_concat:
- handleType = 7;
- break;
- default:
- handleType = 0;
- break;
- }
- doHandleAudio(handleType);
+ void onSelectedFile(String filePath) {
+ doHandleAudio(filePath);
}
/**
* 调用ffmpeg处理音频
- * @param handleType handleType
+ * @param srcFile srcFile
*/
- private void doHandleAudio(int handleType){
+ private void doHandleAudio(final String srcFile) {
String[] commandLine = null;
- if (!FileUtil.checkFileExist(srcFile)){
+ if (!FileUtil.checkFileExist(srcFile)) {
+ return;
+ }
+ if (!FileUtil.isAudio(srcFile)) {
+ showToast(getString(R.string.wrong_audio_format));
return;
}
- switch (handleType){
- case 0://转码
+ switch (viewId) {
+ case R.id.btn_transform://转码
// String transformFile = PATH + File.separator + "transform.aac";
// commandLine = FFmpegUtil.transformAudio(srcFile, transformFile);
//使用mp3lame进行转码
@@ -149,25 +114,25 @@ public class AudioHandleActivity extends AppCompatActivity implements View.OnCli
Mp3Converter mp3Converter = new Mp3Converter();
mp3Converter.convertToMp3(inputFile, transformFile);
break;
- case 1://剪切
- String cutFile = PATH + File.separator + "cut.mp3";
+ case R.id.btn_cut://剪切(注意原文件与剪切文件格式一致)
+ String cutFile = PATH + File.separator + "cut.aac";
commandLine = FFmpegUtil.cutAudio(srcFile, 10, 15, cutFile);
break;
- case 2://合并,支持MP3、AAC、AMR等,不支持PCM裸流,不支持WAV(PCM裸流加音频头)
+ case R.id.btn_concat://合并,支持MP3、AAC、AMR等,不支持PCM裸流,不支持WAV(PCM裸流加音频头)
if (!FileUtil.checkFileExist(appendFile)){
return;
}
String concatFile = PATH + File.separator + "concat.mp3";
commandLine = FFmpegUtil.concatAudio(srcFile, appendFile, concatFile);
break;
- case 3://混合
+ case R.id.btn_mix://混合
if (!FileUtil.checkFileExist(appendFile)){
return;
}
String mixFile = PATH + File.separator + "mix.aac";
commandLine = FFmpegUtil.mixAudio(srcFile, appendFile, mixFile);
break;
- case 4://解码播放(AudioTrack)
+ case R.id.btn_play_audio://解码播放(AudioTrack)
new Thread(new Runnable() {
@Override
public void run() {
@@ -175,7 +140,7 @@ public class AudioHandleActivity extends AppCompatActivity implements View.OnCli
}
}).start();
return;
- case 5://解码播放(OpenSL ES)
+ case R.id.btn_play_opensl://解码播放(OpenSL ES)
new Thread(new Runnable() {
@Override
public void run() {
@@ -183,8 +148,8 @@ public class AudioHandleActivity extends AppCompatActivity implements View.OnCli
}
}).start();
return;
- case 6://音频编码
- //可编码成WAV、AAC。如果需要编码成MP3、AMR,ffmpeg需要重新编译,把MP3、AMR库enable
+ case R.id.btn_audio_encode://音频编码
+ //可编码成WAV、AAC。如果需要编码成MP3,ffmpeg需要重新编译,把MP3库enable
String pcmFile = PATH + File.separator + "concat.pcm";
String wavFile = PATH + File.separator + "new.wav";
//pcm数据的采样率,一般采样率为8000、16000、44100
@@ -193,7 +158,7 @@ public class AudioHandleActivity extends AppCompatActivity implements View.OnCli
int channel = 1;
commandLine = FFmpegUtil.encodeAudio(pcmFile, wavFile, sampleRate, channel);
break;
- case 7://PCM裸流音频文件合并
+ case R.id.btn_pcm_concat://PCM裸流音频文件合并
String srcPCM = PATH + File.separator + "audio.pcm";//第一个pcm文件
String appendPCM = PATH + File.separator + "audio.pcm";//第二个pcm文件
String concatPCM = PATH + File.separator + "concat.pcm";//合并后的文件
@@ -215,8 +180,8 @@ public class AudioHandleActivity extends AppCompatActivity implements View.OnCli
* 执行ffmpeg命令行
* @param commandLine commandLine
*/
- private void executeFFmpegCmd(final String[] commandLine){
- if(commandLine == null){
+ private void executeFFmpegCmd(final String[] commandLine) {
+ if(commandLine == null) {
return;
}
FFmpegCmd.execute(commandLine, new FFmpegCmd.OnHandleListener() {
diff --git a/app/src/main/java/com/frank/ffmpeg/activity/BaseActivity.java b/app/src/main/java/com/frank/ffmpeg/activity/BaseActivity.java
index 2501f0b..11166a5 100644
--- a/app/src/main/java/com/frank/ffmpeg/activity/BaseActivity.java
+++ b/app/src/main/java/com/frank/ffmpeg/activity/BaseActivity.java
@@ -54,12 +54,6 @@ public abstract class BaseActivity extends AppCompatActivity implements View.OnC
}
}
- protected void initViews(int... viewIds) {
- for (int viewId : viewIds) {
- getView(viewId);
- }
- }
-
protected void initViewsWithClick(int... viewIds) {
for (int viewId : viewIds) {
getView(viewId).setOnClickListener(this);
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 8cb844c..293fc14 100644
--- a/app/src/main/java/com/frank/ffmpeg/util/FileUtil.java
+++ b/app/src/main/java/com/frank/ffmpeg/util/FileUtil.java
@@ -16,6 +16,27 @@ import java.io.IOException;
public class FileUtil {
+ private final static String TYPE_MP3 = "mp3";
+ private final static String TYPE_AAC = "aac";
+ private final static String TYPE_AMR = "amr";
+ private final static String TYPE_FLAC = "flac";
+ private final static String TYPE_M4A = "m4a";
+ private final static String TYPE_WMA = "wma";
+ private final static String TYPE_WAV = "wav";
+ private final static String TYPE_OGG = "ogg";
+ private final static String TYPE_AC3 = "ac3";
+
+ private final static String TYPE_MP4 = "mp4";
+ private final static String TYPE_MKV = "mkv";
+ private final static String TYPE_WEBM = "webm";
+ private final static String TYPE_AVI = "avi";
+ private final static String TYPE_WMV = "wmv";
+ private final static String TYPE_FLV = "flv";
+ private final static String TYPE_TS = "ts";
+ private final static String TYPE_M3U8 = "m3u8";
+ private final static String TYPE_3GP = "3gp";
+ private final static String TYPE_MOV = "mov";
+
public static boolean concatFile(String srcFilePath, String appendFilePath, String concatFilePath){
if(TextUtils.isEmpty(srcFilePath)
|| TextUtils.isEmpty(appendFilePath)
@@ -75,7 +96,6 @@ public class FileUtil {
*/
public static boolean checkFileExist(String path){
if (TextUtils.isEmpty(path)) {
- Log.e("FileUtil", path + "is null!");
return false;
}
File file = new File(path);
@@ -86,4 +106,35 @@ public class FileUtil {
return true;
}
+ public static boolean isAudio(String path) {
+ if (TextUtils.isEmpty(path)) {
+ return false;
+ }
+ return path.endsWith(TYPE_MP3)
+ || path.endsWith(TYPE_AAC)
+ || path.endsWith(TYPE_AMR)
+ || path.endsWith(TYPE_FLAC)
+ || path.endsWith(TYPE_M4A)
+ || path.endsWith(TYPE_WMA)
+ || path.endsWith(TYPE_WAV)
+ || path.endsWith(TYPE_OGG)
+ || path.endsWith(TYPE_AC3);
+ }
+
+ public static boolean isVideo(String path) {
+ if (TextUtils.isEmpty(path)) {
+ return false;
+ }
+ return path.endsWith(TYPE_MP4)
+ || path.endsWith(TYPE_MKV)
+ || path.endsWith(TYPE_WEBM)
+ || path.endsWith(TYPE_WMV)
+ || path.endsWith(TYPE_AVI)
+ || path.endsWith(TYPE_FLV)
+ || path.endsWith(TYPE_3GP)
+ || path.endsWith(TYPE_TS)
+ || path.endsWith(TYPE_M3U8)
+ || path.endsWith(TYPE_MOV);
+ }
+
}
diff --git a/app/src/main/res/layout/activity_audio_handle.xml b/app/src/main/res/layout/activity_audio_handle.xml
index 5209489..f8d655c 100644
--- a/app/src/main/res/layout/activity_audio_handle.xml
+++ b/app/src/main/res/layout/activity_audio_handle.xml
@@ -3,85 +3,76 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
-
tools:context=".activity.AudioHandleActivity">
-
+ android:orientation="vertical"
+ android:gravity="center_horizontal">
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
+
-
+ android:layout_centerInParent="true"
+ android:visibility="gone"/>
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index acc4131..338032a 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -7,7 +7,7 @@
android:id="@+id/btn_audio"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginTop="10dp"
+ android:layout_marginTop="20dp"
android:layout_centerHorizontal="true"
android:text="@string/audio_handle"/>
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index f967573..f9710ee 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -66,5 +66,7 @@
请选择正确文件
文件不存在
请点击右上角菜单选择文件
+ 非音频文件
+ 非视频文件