您的位置:首页 > 移动开发 > Android开发

Android 音频 OpenSL ES URI播放

2014-11-20 15:56 309 查看
上篇文章我们介绍了OpenSL ES 架构,这里我们将编写OpenSL ES URI播放音频,代码编写环境Eclipse ,Eclipse编写C/C++ 需要CDT插件, 新版本的adt-bundle 已经自带CDT。

一、 Eclipse 创建Android工程

二、 布局XML 创建文件 /res/layout/main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" >
</LinearLayout>

<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" >
</LinearLayout>

<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" >
</LinearLayout>

<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" >

<Button
android:id="@+id/uri_soundtrack"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="URI初始化" />

<Button
android:id="@+id/pause_uri"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="URI暂停" />

<Button
android:id="@+id/play_uri"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="URI播放" />

</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" >

<Button
android:id="@+id/uri_mute"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="URI静音" />

<Button
android:id="@+id/uri_unmute"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="URI恢复静音" />

</LinearLayout>

<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" >

<Button
android:id="@+id/uri_solo_left"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="URI左独唱" />

<Button
android:id="@+id/uri_solo_right"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="URI右独唱" />

</LinearLayout>

<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" >

<Button
android:id="@+id/uri_mute_left"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="左边静音" />

<Button
android:id="@+id/uri_mute_right"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="右边静音" />
<Button
android:id="@+id/uri_get_channel_num"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="声道数量" />

</LinearLayout>

<SeekBar
android:id="@+id/volume_uri"
android:max="100"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

</LinearLayout>


三、Activity类 创建/src/com/example/testopensl/URIActivity.java

package com.example.testopensl;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.Toast;

public class URIActivity extends Activity implements OnClickListener {

/** 音频地址 */
private static final String URI = "/mnt/sdcard/fa.mp3";

private boolean mMuteLeft = false;
private boolean mMuteRight = false;

static {
System.loadLibrary("TestAudio");
}

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
createEngine();
findViewById(R.id.uri_soundtrack).setOnClickListener(this);
findViewById(R.id.pause_uri).setOnClickListener(this);
findViewById(R.id.play_uri).setOnClickListener(this);
findViewById(R.id.uri_mute).setOnClickListener(this);
findViewById(R.id.uri_unmute).setOnClickListener(this);
findViewById(R.id.uri_solo_left).setOnClickListener(this);
findViewById(R.id.uri_solo_right).setOnClickListener(this);
findViewById(R.id.uri_mute_left).setOnClickListener(this);
findViewById(R.id.uri_mute_right).setOnClickListener(this);
findViewById(R.id.uri_get_channel_num).setOnClickListener(this);
((SeekBar) findViewById(R.id.volume_uri)).setOnSeekBarChangeListener(new OnSeekBarChangeListener() {

@Override
public void onStopTrackingTouch(SeekBar seekBar) {
int attenuation = 100 - seekBar.getProgress();
int millibel = attenuation * -50;
setVolumeUriAudioPlayer(millibel);
}

@Override
public void onStartTrackingTouch(SeekBar seekBar) {

}

@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {

}
});
;

}

@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.uri_soundtrack:
createUriAudioPlayer(URI);
break;
case R.id.pause_uri:
setPlayingUriAudioPlayer(false);
break;
case R.id.play_uri:
setPlayingUriAudioPlayer(true);
break;
case R.id.uri_mute:
setMuteUriAudioPlayer(true);
break;
case R.id.uri_unmute:
setMuteUriAudioPlayer(false);
break;
case R.id.uri_solo_left:
setChannelSoloUriAudioPlayer(0, true);
break;
case R.id.uri_solo_right:
setChannelSoloUriAudioPlayer(1, true);
break;
case R.id.uri_mute_left:
setChannelMuteUriAudioPlayer(0, mMuteLeft = !mMuteLeft);
break;
case R.id.uri_mute_right:
setChannelMuteUriAudioPlayer(1, mMuteRight = !mMuteRight);
break;
case R.id.uri_get_channel_num:
int num = getNumChannelsUriAudioPlayer();
Toast.makeText(this, "声道数量 :" + num, Toast.LENGTH_SHORT).show();
break;
}
}

@Override
protected void onDestroy() {
super.onDestroy();
shutdown();
}

/** Native methods, implemented in jni folder */
public static native void createEngine();

public static native boolean createUriAudioPlayer(String uri);

public static native void setPlayingUriAudioPlayer(boolean isPlaying);

public static native void setChannelMuteUriAudioPlayer(int chan, boolean mute);

public static native void setChannelSoloUriAudioPlayer(int chan, boolean solo);

public static native int getNumChannelsUriAudioPlayer();

public static native void setVolumeUriAudioPlayer(int millibel);

public static native void setMuteUriAudioPlayer(boolean mute);

public static native void enableStereoPositionUriAudioPlayer(boolean enable);

public static native void setStereoPositionUriAudioPlayer(int permille);

public static native void shutdown();

}


在Activity onCreate时候我们调用了JNI本地方法createEngine这个比较重要的。

四、编写日志头文件,用于日志输出, 创建/jni/log.h 文件

#ifndef LOG_H_
#define LOG_H_

#include <android/log.h>

#ifndef DGB
#define DGB 0
#endif

#ifndef LOG_TAG
#define LOG_TAG __FILE__
#endif

#ifndef ALOGD
#if DGB
#define ALOGD(...) \
__android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#else
#define ALOGD(...)   ((void)0)
#endif
#endif

#endif /* LOG_H_ */


五、用javah命令 生成jni 头文件. 文件目录/jni/com_example_testopensl_URIActivity.h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_testopensl_URIActivity */

#ifndef _Included_com_example_testopensl_URIActivity
#define _Included_com_example_testopensl_URIActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class:     com_example_testopensl_URIActivity
* Method:    createEngine
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_example_testopensl_URIActivity_createEngine
(JNIEnv *, jclass);

/*
* Class:     com_example_testopensl_URIActivity
* Method:    createBufferQueueAudioPlayer
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_example_testopensl_URIActivity_createBufferQueueAudioPlayer
(JNIEnv *, jclass);

/*
* Class:     com_example_testopensl_URIActivity
* Method:    createAssetAudioPlayer
* Signature: (Ljava/lang/String;)Z
*/
JNIEXPORT jboolean JNICALL Java_com_example_testopensl_URIActivity_createAssetAudioPlayer
(JNIEnv *, jclass, jstring);

/*
* Class:     com_example_testopensl_URIActivity
* Method:    setPlayingAssetAudioPlayer
* Signature: (Z)V
*/
JNIEXPORT void JNICALL Java_com_example_testopensl_URIActivity_setPlayingAssetAudioPlayer
(JNIEnv *, jclass, jboolean);

/*
* Class:     com_example_testopensl_URIActivity
* Method:    createUriAudioPlayer
* Signature: (Ljava/lang/String;)Z
*/
JNIEXPORT jboolean JNICALL Java_com_example_testopensl_URIActivity_createUriAudioPlayer
(JNIEnv *, jclass, jstring);

/*
* Class:     com_example_testopensl_URIActivity
* Method:    setPlayingUriAudioPlayer
* Signature: (Z)V
*/
JNIEXPORT void JNICALL Java_com_example_testopensl_URIActivity_setPlayingUriAudioPlayer
(JNIEnv *, jclass, jboolean);

/*
* Class:     com_example_testopensl_URIActivity
* Method:    setLoopingUriAudioPlayer
* Signature: (Z)V
*/
JNIEXPORT void JNICALL Java_com_example_testopensl_URIActivity_setLoopingUriAudioPlayer
(JNIEnv *, jclass, jboolean);

/*
* Class:     com_example_testopensl_URIActivity
* Method:    setChannelMuteUriAudioPlayer
* Signature: (IZ)V
*/
JNIEXPORT void JNICALL Java_com_example_testopensl_URIActivity_setChannelMuteUriAudioPlayer
(JNIEnv *, jclass, jint, jboolean);

/*
* Class:     com_example_testopensl_URIActivity
* Method:    setChannelSoloUriAudioPlayer
* Signature: (IZ)V
*/
JNIEXPORT void JNICALL Java_com_example_testopensl_URIActivity_setChannelSoloUriAudioPlayer
(JNIEnv *, jclass, jint channel, jboolean solo);

/*
* Class:     com_example_testopensl_URIActivity
* Method:    getNumChannelsUriAudioPlayer
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_com_example_testopensl_URIActivity_getNumChannelsUriAudioPlayer
(JNIEnv *, jclass);

/*
* Class:     com_example_testopensl_URIActivity
* Method:    setVolumeUriAudioPlayer
* Signature: (I)V
*/
JNIEXPORT void JNICALL Java_com_example_testopensl_URIActivity_setVolumeUriAudioPlayer
(JNIEnv *, jclass, jint);

/*
* Class:     com_example_testopensl_URIActivity
* Method:    setMuteUriAudioPlayer
* Signature: (Z)V
*/
JNIEXPORT void JNICALL Java_com_example_testopensl_URIActivity_setMuteUriAudioPlayer
(JNIEnv *, jclass, jboolean);

/*
* Class:     com_example_testopensl_URIActivity
* Method:    enableStereoPositionUriAudioPlayer
* Signature: (Z)V
*/
JNIEXPORT void JNICALL Java_com_example_testopensl_URIActivity_enableStereoPositionUriAudioPlayer
(JNIEnv *, jclass, jboolean);

/*
* Class:     com_example_testopensl_URIActivity
* Method:    setStereoPositionUriAudioPlayer
* Signature: (I)V
*/
JNIEXPORT void JNICALL Java_com_example_testopensl_URIActivity_setStereoPositionUriAudioPlayer
(JNIEnv *, jclass, jint);

/*
* Class:     com_example_testopensl_URIActivity
* Method:    shutdown
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_example_testopensl_URIActivity_shutdown
(JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif


六、JNI的实现 /jni/com_example_testopensl_URIActivity.cpp

/** log */
#define LOG_TAG "URIActivity"
#define DGB 1

#include <jni.h>
#include <assert.h>
#include <stdio.h>
#include <log.h>
#include <SLES/OpenSLES.h>
#include <SLES/OpenSLES_Android.h>
#include "com_example_testopensl_URIActivity.h"

// engine interfaces
static SLObjectItf engineObject = NULL;
static SLEngineItf engineEngine;

// output mix interfaces
static SLObjectItf outputMixObject = NULL;

// URI player interfaces
static SLObjectItf uriPlayerObject = NULL;
static SLPlayItf uriPlayerPlay;
static SLSeekItf uriPlayerSeek;
static SLMuteSoloItf uriPlayerMuteSolo;
static SLVolumeItf uriPlayerVolume;

/*
* Class:     com_example_testopensl_URIActivity
* Method:    createEngine
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_example_testopensl_URIActivity_createEngine(JNIEnv *env, jclass clazz) {
SLresult result;

// create engine
result = slCreateEngine(&engineObject, 0, NULL, 0, NULL, NULL);
assert(SL_RESULT_SUCCESS == result);
(void) result;

// realize the engine
result = (*engineObject)->Realize(engineObject, SL_BOOLEAN_FALSE);
assert(SL_RESULT_SUCCESS == result);
(void) result;

// get the engine interface, which is needed in order to create other objects
result = (*engineObject)->GetInterface(engineObject, SL_IID_ENGINE, &engineEngine);
assert(SL_RESULT_SUCCESS == result);
(void) result;

// create output mix
result = (*engineEngine)->CreateOutputMix(engineEngine, &outputMixObject, 0, 0, 0);
assert(SL_RESULT_SUCCESS == result);
(void) result;

// realize the output mix
result = (*outputMixObject)->Realize(outputMixObject, SL_BOOLEAN_FALSE);
assert(SL_RESULT_SUCCESS == result);
(void) result;

}

/*
* Class:     com_example_testopensl_URIActivity
* Method:    createUriAudioPlayer
* Signature: (Ljava/lang/String;)Z
*/
JNIEXPORT jboolean JNICALL Java_com_example_testopensl_URIActivity_createUriAudioPlayer(JNIEnv *env, jclass jobject, jstring uri) {

SLresult result;
const char* utf8Uri = env->GetStringUTFChars(uri, NULL);

if (utf8Uri == NULL) {
return false;
}

ALOGD("uri : %s", utf8Uri);

SLDataLocator_URI loc_uri = { SL_DATALOCATOR_URI, (SLchar *) utf8Uri };
SLDataFormat_MIME format_mime = { SL_DATAFORMAT_MIME, NULL,
SL_CONTAINERTYPE_UNSPECIFIED };
SLDataSource audioSrc = { &loc_uri, &format_mime };

// configure audio sink
SLDataLocator_OutputMix loc_outmix = { SL_DATALOCATOR_OUTPUTMIX, outputMixObject };
SLDataSink audioSnk = { &loc_outmix, NULL };

// create audio player
const SLInterfaceID ids[3] = { SL_IID_SEEK, SL_IID_MUTESOLO, SL_IID_VOLUME };
const SLboolean req[3] = { SL_BOOLEAN_TRUE, SL_BOOLEAN_TRUE, SL_BOOLEAN_TRUE };
result = (*engineEngine)->CreateAudioPlayer(engineEngine, &uriPlayerObject, &audioSrc, &audioSnk, 3, ids, req);
// note that an invalid URI is not detected here, but during prepare/prefetch on Android,
// or possibly during Realize on other platforms
assert(SL_RESULT_SUCCESS == result);
(void) result;

// realize the player
result = (*uriPlayerObject)->Realize(uriPlayerObject, SL_BOOLEAN_FALSE);
// this will always succeed on Android, but we check result for portability to other platforms
if (SL_RESULT_SUCCESS != result) {
(*uriPlayerObject)->Destroy(uriPlayerObject);
uriPlayerObject = NULL;
return JNI_FALSE;
}

// get the play interface
result = (*uriPlayerObject)->GetInterface(uriPlayerObject, SL_IID_PLAY, &uriPlayerPlay);
assert(SL_RESULT_SUCCESS == result);
(void) result;

// get the seek interface
result = (*uriPlayerObject)->GetInterface(uriPlayerObject, SL_IID_SEEK, &uriPlayerSeek);

assert(SL_RESULT_SUCCESS == result);
(void) result;

// get the mute/solo interface
result = (*uriPlayerObject)->GetInterface(uriPlayerObject, SL_IID_MUTESOLO, &uriPlayerMuteSolo);
assert(SL_RESULT_SUCCESS == result);
(void) result;

// get the volume interface
result = (*uriPlayerObject)->GetInterface(uriPlayerObject, SL_IID_VOLUME, &uriPlayerVolume);
assert(SL_RESULT_SUCCESS == result);
(void) result;

env->ReleaseStringUTFChars(uri, utf8Uri);
return true;
}

/*
* Class:     com_example_testopensl_URIActivity
* Method:    setPlayingUriAudioPlayer
* Signature: (Z)V
*/
JNIEXPORT void JNICALL Java_com_example_testopensl_URIActivity_setPlayingUriAudioPlayer(JNIEnv *, jclass, jboolean isPlaying) {
SLresult result;

// make sure the URI audio player was created
if (uriPlayerPlay != NULL) {
// set the player's state
result = (*uriPlayerPlay)->SetPlayState(uriPlayerPlay, isPlaying ? SL_PLAYSTATE_PLAYING : SL_PLAYSTATE_PAUSED);
assert(SL_RESULT_SUCCESS == result);
}
}

/*
* Class:     com_example_testopensl_URIActivity
* Method:    setChannelMuteUriAudioPlayer
* Signature: (IZ)V
*/
JNIEXPORT void JNICALL Java_com_example_testopensl_URIActivity_setChannelMuteUriAudioPlayer(JNIEnv *, jclass, jint channel, jboolean mute) {
SLresult result;
if (uriPlayerMuteSolo != NULL) {
result = (*uriPlayerMuteSolo)->SetChannelMute(uriPlayerMuteSolo, channel, mute);
assert(SL_RESULT_SUCCESS == result);
}
}

/*
* Class:     com_example_testopensl_URIActivity
* Method:    setChannelSoloUriAudioPlayer
* Signature: (IZ)V
*/
JNIEXPORT void JNICALL Java_com_example_testopensl_URIActivity_setChannelSoloUriAudioPlayer(JNIEnv *, jclass, jint channel, jboolean solo) {
SLresult result;
if (uriPlayerMuteSolo != NULL) {
result = (*uriPlayerMuteSolo)->SetChannelSolo(uriPlayerMuteSolo, channel, solo);
assert(SL_RESULT_SUCCESS == result);
}
}

/*
* Class:     com_example_testopensl_URIActivity
* Method:    getNumChannelsUriAudioPlayer
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_com_example_testopensl_URIActivity_getNumChannelsUriAudioPlayer(JNIEnv *, jclass) {
SLresult result;
if (uriPlayerMuteSolo != NULL) {
SLuint8 chanelNumbes;
result = (*uriPlayerMuteSolo)->GetNumChannels(uriPlayerMuteSolo, &chanelNumbes);
assert(SL_RESULT_SUCCESS == result);
if (result == SL_RESULT_SUCCESS) {
return chanelNumbes;
}
}
return 0;
}

/*
* Class:     com_example_testopensl_URIActivity
* Method:    setVolumeUriAudioPlayer
* Signature: (I)V
*/
JNIEXPORT void JNICALL Java_com_example_testopensl_URIActivity_setVolumeUriAudioPlayer(JNIEnv *, jclass, jint index) {
SLresult result;

if (NULL != uriPlayerVolume) {
SLmillibel value;
result = (*uriPlayerVolume)->GetMaxVolumeLevel(uriPlayerVolume, &value);
if (result == SL_RESULT_SUCCESS) {
ALOGD("max %d set %d", value, index);
}

result = (*uriPlayerVolume)->SetVolumeLevel(uriPlayerVolume, index);
assert(SL_RESULT_SUCCESS == result);
}
}

/*
* Class:     com_example_testopensl_URIActivity
* Method:    setMuteUriAudioPlayer
* Signature: (Z)V
*/
JNIEXPORT void JNICALL Java_com_example_testopensl_URIActivity_setMuteUriAudioPlayer(JNIEnv *, jclass, jboolean mute) {
SLresult result;
if (NULL != uriPlayerVolume) {
result = (*uriPlayerVolume)->SetMute(uriPlayerVolume, mute);
assert(SL_RESULT_SUCCESS == result);
}
}

/*
* Class:     com_example_testopensl_URIActivity
* Method:    enableStereoPositionUriAudioPlayer
* Signature: (Z)V
*/
JNIEXPORT void JNICALL Java_com_example_testopensl_URIActivity_enableStereoPositionUriAudioPlayer(JNIEnv *, jclass, jboolean) {

}

/*
* Class:     com_example_testopensl_URIActivity
* Method:    setStereoPositionUriAudioPlayer
* Signature: (I)V
*/
JNIEXPORT void JNICALL Java_com_example_testopensl_URIActivity_setStereoPositionUriAudioPlayer(JNIEnv *, jclass, jint) {

}

/*
* Class:     com_example_testopensl_URIActivity
* Method:    shutdown
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_example_testopensl_URIActivity_shutdown(JNIEnv *, jclass) {

// destroy URI audio player object, and invalidate all associated interfaces
if (uriPlayerObject != NULL) {
(*uriPlayerObject)->Destroy(uriPlayerObject);
uriPlayerObject = NULL;
uriPlayerPlay = NULL;
uriPlayerSeek = NULL;
uriPlayerMuteSolo = NULL;
uriPlayerVolume = NULL;
}

// destroy output mix object, and invalidate all associated interfaces
if (outputMixObject != NULL) {
(*outputMixObject)->Destroy(outputMixObject);
outputMixObject = NULL;
}

// destroy engine object, and invalidate all associated interfaces
if (engineObject != NULL) {
(*engineObject)->Destroy(engineObject);
engineObject = NULL;
engineEngine = NULL;
}
}
使用OpenSL ES主要导入SLES/OpenSLES.h ,SLES/OpenSLES_Android.h 两个头文件,前一个是标准的头文件,后面是Android中特有的,有些方法本Demo中未实现,可以自己实现,下面是方法说明:

Java_com_example_testopensl_URIActivity_createEngine 创建引擎

Java_com_example_testopensl_URIActivity_createUriAudioPlayer 创建播放器

Java_com_example_testopensl_URIActivity_setPlayingUriAudioPlayer 改变播放器的状态

Java_com_example_testopensl_URIActivity_setChannelMuteUriAudioPlayer 声道静音

Java_com_example_testopensl_URIActivity_setChannelSoloUriAudioPlayer 声道独唱

Java_com_example_testopensl_URIActivity_getNumChannelsUriAudioPlayer 获取声道数量

Java_com_example_testopensl_URIActivity_setVolumeUriAudioPlayer 设置播放器音量

Java_com_example_testopensl_URIActivity_setMuteUriAudioPlayer 静音

Java_com_example_testopensl_URIActivity_shutdown 资源释放

七、创建/jni/Android.mk 编译文件

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := TestAudio
LOCAL_SRC_FILES := com_example_testopensl_URIActivity.cpp \

LOCAL_LDLIBS += -llog -lOpenSLES -landroid

include $(BUILD_SHARED_LIBRARY)
LOCAL_LDLIBS 需要加llog、lOpenSLES、landroid 编译链接库

八、AndroidManifest 配置
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.testopensl"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="19" />

<uses-permission android:name="android.permission.INTERNET" />

<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.testopensl.URIActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

</manifest>

编写完Eclipse 结构图如下:



运行之后界面图如下:



至此代码已经编写完毕,运行后,首先我们点击URI初始化,然后点击URI播放。

URI初始化即调用Java_com_example_testopensl_URIActivity_createUriAudioPlayer 创建播放器

URI播放即调用Java_com_example_testopensl_URIActivity_setPlayingUriAudioPlayer 改变播放的状态为播放状态就可以播放

其他的对应的操作对播放器的控制

从上面我们可以看到OpenSL和MediaPlayer相比接口更细粒度
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: