26 多媒体处理之音频处理

在上一章中,我们深入探讨了图像处理,例如图像的加载、编辑和保存。接下来,我们将转向音频处理,学习如何在安卓应用中播放、录制和处理音频。音频处理在各种应用中都是至关重要的,特别是在音乐播放器、录音应用和游戏等领域。

1. 音频播放

在安卓中,播放音频可以使用 MediaPlayer 类,该类提供了丰富的接口来管理音频播放。下面是一个基本的音频播放示例。

示例:简单的音频播放

假设我们要播放保存在 res/raw 目录下的音频文件 sound.mp3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import android.media.MediaPlayer;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;

public class AudioActivity extends AppCompatActivity {
private MediaPlayer mediaPlayer;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_audio);

// 初始化 MediaPlayer
mediaPlayer = MediaPlayer.create(this, R.raw.sound);
}

@Override
protected void onDestroy() {
// 释放资源
if (mediaPlayer != null) {
mediaPlayer.release();
mediaPlayer = null;
}
super.onDestroy();
}

// 播放音频
public void playAudio() {
if (mediaPlayer != null) {
mediaPlayer.start();
}
}

// 暂停音频
public void pauseAudio() {
if (mediaPlayer != null && mediaPlayer.isPlaying()) {
mediaPlayer.pause();
}
}

// 停止音频
public void stopAudio() {
if (mediaPlayer != null) {
mediaPlayer.stop();
mediaPlayer.prepareAsync(); // 准备为下一次播放
}
}
}

在这个示例中,我们通过 MediaPlayer.create() 方法创建了一个 MediaPlayer 实例。然后,我们可以通过调用 start()pause()stop() 方法来控制音频的播放。

2. 音频录制

除了播放音频,录制音频也是常见的需求。安卓提供了 AudioRecord 类来处理音频录制。下面是一个简单的音频录制示例。

示例:简单的音频录制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import androidx.appcompat.app.AppCompatActivity;
import java.io.FileOutputStream;
import java.io.IOException;

public class RecordActivity extends AppCompatActivity {
private static final int RECORDER_AUDIO_SOURCE = MediaRecorder.AudioSource.MIC;
private static final int RECORDER_OUTPUT_FORMAT = AudioFormat.ENCODING_PCM_16BIT;
private static final int RECORDER_CHANNELS = AudioFormat.CHANNEL_IN_MONO;
private static final int RECORDER_SAMPLERATE = 44100;
private static final String FILE_PATH = Environment.getExternalStorageDirectory().getPath() + "/recorded_audio.pcm";

private AudioRecord audioRecord;
private boolean isRecording = false;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_record);
}

public void startRecording() {
audioRecord = new AudioRecord(RECORDER_AUDIO_SOURCE, RECORDER_SAMPLERATE,
RECORDER_CHANNELS, RECORDER_OUTPUT_FORMAT, AudioRecord.getMinBufferSize(RECORDER_SAMPLERATE, RECORDER_CHANNELS, RECORDER_OUTPUT_FORMAT));

audioRecord.startRecording();
isRecording = true;

new Thread(new Runnable() {
@Override
public void run() {
writeAudioData();
}
}).start();
}

private void writeAudioData() {
byte[] data = new byte[1024];
try (FileOutputStream os = new FileOutputStream(FILE_PATH)) {
while (isRecording) {
int read = audioRecord.read(data, 0, data.length);
if (read > 0) {
os.write(data, 0, read);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}

public void stopRecording() {
if (audioRecord != null) {
isRecording = false;
audioRecord.stop();
audioRecord.release();
audioRecord = null;
}
}
}

在这个示例中,AudioRecord 类用于录制音频。我们在独立的线程中执行录制操作,以避免阻塞主线程。录制的音频以 PCM 格式保存到指定文件中。

3. 音频效果处理

对于音频效果的处理,安卓提供了一些额外的工具,比如 AudioEffect 类。可以添加效果如混响、均衡器等。下面是一个使用均衡器的简单示例。

示例:添加均衡器效果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import android.media.audiofx.Equalizer;
import android.media.MediaPlayer;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;

public class EqualizerActivity extends AppCompatActivity {
private MediaPlayer mediaPlayer;
private Equalizer equalizer;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_equalizer);

mediaPlayer = MediaPlayer.create(this, R.raw.sound);
equalizer = new Equalizer(0, mediaPlayer.getAudioSessionId());
equalizer.setEnabled(true);

// 设置均衡器频带
for (short i = 0; i < equalizer.getNumberOfBands(); i++) {
equalizer.setBandLevel(i, (short) (equalizer.getBandLevelRange()[1] / 2));
}
}

@Override
protected void onDestroy() {
if (equalizer != null) {
equalizer.release();
}
if (mediaPlayer != null) {
mediaPlayer.release();
}
super.onDestroy();
}
}

在这个示例中,我们创建了一个均衡器,并为每个频带设置了中间的增益水平。这种处理可以增强音频的听感,适用于音乐应用。

4. 小结

在这一章中,我们学习了如何通过 MediaPlayer 播放音频、通过 AudioRecord 进行音频录制,以及如何使用 Equalizer 添加音频效果。这些基本的音频处理功能可以为许多类型的应用提供支持,尤其是那些需要音频交互的应用。

在下一章中,我们将讨论如何对应用进行签名,这一点对于发布应用至关重要。随着我们逐步构建应用,理解正确的签名步骤将为我们提供必要的

26 多媒体处理之音频处理

https://zglg.work/android-app-dev/26/

作者

IT教程网(郭震)

发布于

2024-08-14

更新于

2024-08-15

许可协议

分享转发

学习下节

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论