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
三、Activity类 创建/src/com/example/testopensl/URIActivity.java
在Activity onCreate时候我们调用了JNI本地方法createEngine这个比较重要的。
四、编写日志头文件,用于日志输出, 创建/jni/log.h 文件
五、用javah命令 生成jni 头文件. 文件目录/jni/com_example_testopensl_URIActivity.h
六、JNI的实现 /jni/com_example_testopensl_URIActivity.cpp
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 编译文件
八、AndroidManifest 配置
编写完Eclipse 结构图如下:
运行之后界面图如下:
至此代码已经编写完毕,运行后,首先我们点击URI初始化,然后点击URI播放。
URI初始化即调用Java_com_example_testopensl_URIActivity_createUriAudioPlayer 创建播放器
URI播放即调用Java_com_example_testopensl_URIActivity_setPlayingUriAudioPlayer 改变播放的状态为播放状态就可以播放
其他的对应的操作对播放器的控制
从上面我们可以看到OpenSL和MediaPlayer相比接口更细粒度
一、 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相比接口更细粒度
相关文章推荐
- android使用opensl es进行简单的音频播放
- Android 音频 OpenSL ES PCM数据播放
- Android通过OpenSL ES播放音频套路详解
- Android 音频,视频资源管理与播放
- Android学习记录--音频视频播放
- Android AudioTrack 播放音频
- Android提高第二十篇之MediaPlayer播放网络音频
- android stagefright 播放MP3音频 打印信息分析
- 【Android Training - Multimedia】管理音频播放[Lesson 3 - 当音频输出设备突然改变]
- android-MediaPlayer的基本使用-播放音频视频
- Android中音频的播放
- Android中的音频播放(MediaPlayer和SoundPool)
- Android播放音频文件
- Android提高第二十篇之MediaPlayer播放网络音频
- 【Android Training - Multimedia】管理音频播放[Lesson 1 - 控制app的音量]
- 24、从头学Android之多媒体--使用MediaPlayer播放音频
- Android中的音频播放(MediaPlayer和SoundPool)
- Android学习04音频的播放之SoundPool与MediaPlayer
- Android提高第二十篇之MediaPlayer播放网络音频
- 基于android多媒体框架实现播放APE音频的实现