Skip to content

Commit

Permalink
增加 限制最大录音时长
Browse files Browse the repository at this point in the history
  • Loading branch information
kecson committed Sep 18, 2018
1 parent 73a1df7 commit b351e48
Show file tree
Hide file tree
Showing 9 changed files with 162 additions and 55 deletions.
2 changes: 1 addition & 1 deletion libLame/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ apply plugin: 'com.android.library'

android {
compileSdkVersion 28
buildToolsVersion '27.0.3'
buildToolsVersion '28.0.2'
defaultConfig {
minSdkVersion 9
targetSdkVersion 9
Expand Down
45 changes: 39 additions & 6 deletions libLame/src/main/java/com/kecson/lame4android/Mp3Recorder.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.text.format.DateFormat;
import android.util.Log;
Expand All @@ -16,8 +18,8 @@ public class Mp3Recorder {

private static final String TAG = Mp3Recorder.class.getSimpleName();


private static final int DEFAULT_SAMPLING_RATE = 22050;
// 44100Hz是当前唯一能保证在所有设备上工作的采样率,在一些设备上还有22050, 16000或11025。
private static final int DEFAULT_SAMPLING_RATE = 44100;

private static final int FRAME_COUNT = 160;

Expand Down Expand Up @@ -46,6 +48,8 @@ public class Mp3Recorder {

private boolean mIsRecording = false;
private Context mContext;
private OnMaxDurationListener mMaxDurationListener;
private int mMaxDurationSecond;

public Mp3Recorder(Context context, int samplingRate, int channelConfig, PCMFormat audioFormat) {
mContext = context.getApplicationContext();
Expand All @@ -67,16 +71,20 @@ public Mp3Recorder(Context context) {
* thread.
*/
public void startRecording() throws IOException {
startRecording(null);
startRecording(-1);
}

public void startRecording(int max_duration_second) throws IOException {
startRecording(max_duration_second, null);
}

/**
* Start recording. Create an encoding thread. Start record from this
* thread.
*/
public void startRecording(File mp3File) throws IOException {
public void startRecording(int max_duration_second, File mp3File) throws IOException {
if (mIsRecording) return;

mMaxDurationSecond = max_duration_second;
Log.i(TAG, "Start recording, BufferSize = " + mBufferSize);
// Initialize mAudioRecord if it's null.
if (mAudioRecord == null) {
Expand All @@ -91,6 +99,24 @@ public void startRecording(File mp3File) throws IOException {
@Override
public void run() {
mIsRecording = true;
if (mMaxDurationSecond > 0) {
new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
@Override
public void run() {
if (mIsRecording) {
try {
stopRecording();
if (mMaxDurationListener != null) {
mMaxDurationListener.onMaxDuration(mMaxDurationSecond);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}, mMaxDurationSecond * 1000 + 100);
}

while (mIsRecording) {
int bytes = mAudioRecord.read(mBuffer, 0, mBufferSize);
if (bytes > 0) {
Expand Down Expand Up @@ -127,6 +153,7 @@ public void run() {

}
}.start();

}

/**
Expand Down Expand Up @@ -160,7 +187,6 @@ private void initAudioRecorder(File mp3File) throws IOException {
mAudioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,
mSamplingRate, mChannelConfig, mAudioFormat.getAudioFormat(),
mBufferSize);

// Setup RingBuffer. Currently is 10 times size of hardware buffer
// Initialize buffer to hold data
mRingBuffer = new RingBuffer(10 * mBufferSize);
Expand Down Expand Up @@ -198,4 +224,11 @@ public File getMp3File() {
return mMp3File;
}

public interface OnMaxDurationListener {
void onMaxDuration(int max_duration_second);
}

public void setOnMaxDurationListener(OnMaxDurationListener listener) {
mMaxDurationListener = listener;
}
}
2 changes: 1 addition & 1 deletion sample/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ apply plugin: 'kotlin-android-extensions'

android {
compileSdkVersion 28
buildToolsVersion '27.0.3'
buildToolsVersion '28.0.2'
defaultConfig {
minSdkVersion 14
targetSdkVersion 21
Expand Down
2 changes: 1 addition & 1 deletion sample/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
android:theme="@style/AppTheme">
<activity
android:name="com.kecson.sample.MainActivity"
android:label="@string/record_mp3">
>
<intent-filter>
<action android:name="android.intent.action.MAIN"/>

Expand Down
49 changes: 38 additions & 11 deletions sample/src/main/java/com/kecson/sample/LameActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,16 @@
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.text.format.Time;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.kecson.lame4android.Lame;
Expand All @@ -27,9 +29,9 @@

public class LameActivity extends AppCompatActivity {


private static final String TAG = "LameActivity";
public static final int NUM_CHANNELS = 1;
public static final int SAMPLE_RATE = 16000;
public static final int SAMPLE_RATE = 44100;
public static final int BITRATE = 128;
public static final int QUALITY = 2;
private AudioRecord mRecorder;
Expand All @@ -38,42 +40,67 @@ public class LameActivity extends AppCompatActivity {
private final String stopRecordingLabel = "停止录音";
private boolean mIsRecording = false;
private File mRawFile;
private File mEncodedFile;
private File mMp3File;
private Button mButton;
private TextView mTvMp3Path;
private Button mBtnPlayMp3;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_lame);

mButton = (Button) findViewById(R.id.button);
mTvMp3Path = ((TextView) findViewById(R.id.tv_mp3_path));
mBtnPlayMp3 = ((Button) findViewById(R.id.btn_open_mp3));
initRecorder();
Lame.init(SAMPLE_RATE, NUM_CHANNELS, SAMPLE_RATE, BITRATE, QUALITY);

mButton = (Button) findViewById(R.id.button);

mButton.setText(startRecordingLabel);

mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(final View v) {
if (!mIsRecording) {
mTvMp3Path.setText(null);
mBtnPlayMp3.setVisibility(View.GONE);
startRecord();
} else {
stopRecord();
mTvMp3Path.setText(mMp3File.getPath());
mBtnPlayMp3.setVisibility(View.VISIBLE);
}
}
});

mBtnPlayMp3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setAction(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(mMp3File), "audio/*");
startActivity(intent);
}
});
}

private void stopRecord() {
mButton.setText(startRecordingLabel);
mIsRecording = false;
mRecorder.stop();
mEncodedFile = getFile("mp3");
/* int result =*/ encodeFile(mRawFile.getAbsolutePath(), mEncodedFile.getAbsolutePath());
mMp3File = getFile("mp3");
/* int result =*/
encodeFile(mRawFile.getAbsolutePath(), mMp3File.getAbsolutePath());
Log.d(TAG, "stopRecord() called:" + mMp3File.getPath());
// if (result == 0) {
Toast.makeText(LameActivity.this, "Encoded to " + mEncodedFile.getName(), Toast.LENGTH_SHORT)
.show();
Toast.makeText(LameActivity.this, "Encoded to " + mMp3File.getName(), Toast.LENGTH_SHORT)
.show();
// }

if (mRawFile != null && mRawFile.exists()) {
mRawFile.delete();
}
}

private void startRecord() {
Expand Down Expand Up @@ -156,6 +183,6 @@ public void run() {
private File getFile(final String suffix) {
Time time = new Time();
time.setToNow();
return new File(Environment.getExternalStorageDirectory(), time.format("%Y%m%d%H%M%S") + "." + suffix);
return new File(getExternalCacheDir(), time.format("%Y%m%d%H%M%S") + "." + suffix);
}
}
48 changes: 41 additions & 7 deletions sample/src/main/java/com/kecson/sample/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,40 +2,74 @@ package com.kecson.sample

import android.content.Intent
import android.media.AudioRecord
import android.net.Uri
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import android.util.Log
import android.view.Menu
import android.view.MenuItem
import android.view.View
import android.widget.Button
import android.widget.TextView
import android.widget.ToggleButton
import com.kecson.lame4android.Mp3Recorder
import com.kecson.lame4android.demo.R
import java.io.File

class MainActivity : AppCompatActivity() {


private var mRecorder: AudioRecord? = null
private lateinit var button: ToggleButton


private lateinit var mTvMp3Path: TextView
private lateinit var mBtnPlayMp3: Button
private lateinit var mMp3File: File
private lateinit var mMp3Recorder: Mp3Recorder

public override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

setTitle(R.string.record_mp3)
mMp3Recorder = Mp3Recorder(this)
button = findViewById(R.id.button)
mTvMp3Path = findViewById(R.id.tv_mp3_path)
mBtnPlayMp3 = findViewById(R.id.btn_open_mp3)

button.setOnCheckedChangeListener { _, isChecked ->
if (isChecked) {
mMp3Recorder.startRecording()
mTvMp3Path.text = null
mBtnPlayMp3.visibility = View.GONE
//录音时间最大限制监听
mMp3Recorder.setOnMaxDurationListener { max_duration_second ->
Log.e(this@MainActivity.javaClass.simpleName, "max_duration_second : $max_duration_second")

button.isEnabled = false
button.isChecked = false
mMp3File = mMp3Recorder.mp3File
Log.d(this@MainActivity.javaClass.simpleName, "mp3 file : $mMp3File")
mTvMp3Path.text = mMp3File.path
mBtnPlayMp3.visibility = View.VISIBLE
button.isEnabled = true
}
//限制录音最大10s
mMp3Recorder.startRecording(10)

} else {
mMp3Recorder.stopRecording()
val mp3File = mMp3Recorder.mp3File
Log.d(this@MainActivity.javaClass.simpleName, "mp3 file : $mp3File")

mMp3File = mMp3Recorder.mp3File
Log.d(this@MainActivity.javaClass.simpleName, "mp3 file : $mMp3File")
mTvMp3Path.text = mMp3File.path
mBtnPlayMp3.visibility = View.VISIBLE
}
}

mBtnPlayMp3.setOnClickListener {
val intent = Intent()
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
intent.action = android.content.Intent.ACTION_VIEW
intent.setDataAndType(Uri.fromFile(mMp3File), "audio/*")
startActivity(intent)
}
}


Expand Down
45 changes: 21 additions & 24 deletions sample/src/main/res/layout/activity_lame.xml
Original file line number Diff line number Diff line change
@@ -1,39 +1,36 @@
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical">

<android.support.constraint.Guideline
android:id="@+id/guideline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_percent="0.5"/>

<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:text="先录音,录音完成后再转为MP3格式"
app:layout_constrainedHeight="true"
app:layout_constraintBottom_toTopOf="@+id/guideline"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="1"/>
android:text="先录音,录音完成后再转为MP3格式"/>

<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
app:layout_constrainedHeight="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/guideline"
app:layout_constraintVertical_bias="0"/>
android:text="开始录音"/>

<TextView
android:id="@+id/tv_mp3_path"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>

</android.support.constraint.ConstraintLayout>
<Button
android:id="@+id/btn_open_mp3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/play_mp3"
android:visibility="gone"
tools:visibility="visible"/>
</LinearLayout>
Loading

0 comments on commit b351e48

Please sign in to comment.