Android OpenSLES播放wav demo
时间: 2023-08-29 17:07:09 浏览: 126
以下是一个简单的Android OpenSLES播放wav的demo,你可以参考一下:
```java
public class OpenSLESPlayer {
private static final String TAG = "OpenSLESPlayer";
private static final int BUFFER_SIZE = 4096;
private SLObjectItf mEngineObject;
private SLEngineItf mEngine;
private SLObjectItf mOutputMixObject;
private SLObjectItf mPlayerObject;
private SLPlayItf mPlayer;
private SLAndroidSimpleBufferQueueItf mBufferQueue;
private FileInputStream mFileInputStream;
private byte[] mBuffer;
public OpenSLESPlayer(Context context, String filePath) {
try {
mFileInputStream = new FileInputStream(filePath);
mBuffer = new byte[BUFFER_SIZE];
} catch (FileNotFoundException e) {
e.printStackTrace();
}
SLresult result = slCreateEngine();
if (result != SL_RESULT_SUCCESS) {
Log.e(TAG, "Failed to create engine");
return;
}
result = slCreateOutputMix();
if (result != SL_RESULT_SUCCESS) {
Log.e(TAG, "Failed to create output mix");
return;
}
result = slCreatePlayer();
if (result != SL_RESULT_SUCCESS) {
Log.e(TAG, "Failed to create player");
return;
}
result = slRealizePlayer();
if (result != SL_RESULT_SUCCESS) {
Log.e(TAG, "Failed to realize player");
return;
}
result = slGetInterfaces();
if (result != SL_RESULT_SUCCESS) {
Log.e(TAG, "Failed to get interfaces");
return;
}
result = slStartPlayer();
if (result != SL_RESULT_SUCCESS) {
Log.e(TAG, "Failed to start player");
return;
}
Log.i(TAG, "Player started");
}
private SLresult slCreateEngine() {
SLresult result;
result = slCreateEngineObject();
if (result != SL_RESULT_SUCCESS) {
return result;
}
result = slRealizeEngineObject();
if (result != SL_RESULT_SUCCESS) {
return result;
}
result = slGetEngineInterface();
if (result != SL_RESULT_SUCCESS) {
return result;
}
return SL_RESULT_SUCCESS;
}
private SLresult slCreateEngineObject() {
SLresult result;
result = slCreateEngine(...);//省略参数
if (result != SL_RESULT_SUCCESS) {
Log.e(TAG, "Failed to create engine object");
}
return result;
}
private SLresult slRealizeEngineObject() {
SLresult result;
result = slRealizeEngine(...);//省略参数
if (result != SL_RESULT_SUCCESS) {
Log.e(TAG, "Failed to realize engine object");
}
return result;
}
private SLresult slGetEngineInterface() {
SLresult result;
result = slGetInterface(...);//省略参数
if (result != SL_RESULT_SUCCESS) {
Log.e(TAG, "Failed to get engine interface");
}
return result;
}
private SLresult slCreateOutputMix() {
SLresult result;
result = slCreateOutputMixObject(...);//省略参数
if (result != SL_RESULT_SUCCESS) {
Log.e(TAG, "Failed to create output mix object");
}
return result;
}
private SLresult slCreatePlayer() {
SLresult result;
result = slCreateAudioPlayer(...);//省略参数
if (result != SL_RESULT_SUCCESS) {
Log.e(TAG, "Failed to create audio player");
}
return result;
}
private SLresult slRealizePlayer() {
SLresult result;
result = slRealizePlayerObject(...);//省略参数
if (result != SL_RESULT_SUCCESS) {
Log.e(TAG, "Failed to realize player object");
}
return result;
}
private SLresult slGetInterfaces() {
SLresult result;
result = slGetPlayerInterface(...);//省略参数
if (result != SL_RESULT_SUCCESS) {
Log.e(TAG, "Failed to get player interface");
return result;
}
result = slGetBufferQueueInterface();
if (result != SL_RESULT_SUCCESS) {
Log.e(TAG, "Failed to get buffer queue interface");
return result;
}
return SL_RESULT_SUCCESS;
}
private SLresult slStartPlayer() {
SLresult result;
result = mPlayer.Play(mPlayer, SL_BOOLEAN_TRUE);
if (result != SL_RESULT_SUCCESS) {
Log.e(TAG, "Failed to start player");
}
return result;
}
private SLresult slCreateEngine(...) {
//省略参数
}
private SLresult slRealizeEngine(...) {
//省略参数
}
private SLresult slGetInterface(...) {
//省略参数
}
private SLresult slCreateOutputMixObject(...) {
//省略参数
}
private SLresult slCreateAudioPlayer(...) {
//省略参数
}
private SLresult slRealizePlayerObject(...) {
//省略参数
}
private SLresult slGetPlayerInterface(...) {
//省略参数
}
private SLresult slGetBufferQueueInterface() {
SLresult result;
result = mPlayerObject.GetInterface(mPlayerObject, SL_IID_BUFFERQUEUE, mBufferQueue);
if (result != SL_RESULT_SUCCESS) {
Log.e(TAG, "Failed to get buffer queue interface");
}
return result;
}
public void start() {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
int bytesRead;
try {
bytesRead = mFileInputStream.read(mBuffer, 0, BUFFER_SIZE);
if (bytesRead > 0) {
mBufferQueue.Enqueue(...);//省略参数
} else {
break;
}
} catch (IOException e) {
e.printStackTrace();
}
}
try {
mFileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
mPlayerObject.Destroy(mPlayerObject);
mOutputMixObject.Destroy(mOutputMixObject);
mEngineObject.Destroy(mEngineObject);
}
});
thread.start();
}
}
```
这个demo中,我们首先创建了一个OpenSLES引擎,然后创建了一个输出混合对象和一个播放器对象。接着,我们通过SLPlayItf接口启动了播放器,并且通过SLAndroidSimpleBufferQueueItf接口向缓冲队列中添加数据。
最后,我们通过一个线程不断从文件中读取数据,并且将读取到的数据放入缓冲队列中,直到文件读取完毕。在播放完成后,我们需要销毁相关的对象。