Android 音频 OpenSL ES PCM数据播放

本文档详细介绍了如何在Android应用中利用OpenSL ES播放PCM音频数据,通过Eclipse创建工程,设置布局XML,创建Activity类,并在C++层处理音频播放逻辑。通过这种方式,开发者可以实现更快、更低延迟的音频播放,适用于自定义播放器的开发。关键步骤包括创建引擎、创建播放器、释放资源等,同时提供了PCM数据的参数配置,如采样率44100,声道数2,编码为16BIT。
摘要由CSDN通过智能技术生成

        PCM 数据播放在开发中也经常使用,例如自己编写播放器,解码之后的音频PCM数据,就可以通过OpenSL 播放,比用Java层的AudioTrack更快,延迟更低。

        下面我们编写OpenSL PCM播放,播放的主要逻辑是从文件读取PCM数据然后播放,代码编写环境Eclipse。

一、 Eclipse 创建Android工程

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

<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"
    tools:context=".URIActivity" >

    <Button
        android:id="@+id/btn_play"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="18dp"
        android:text="播放" />

</LinearLayout>
布局文件就一个播放按钮

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

package com.example.testopensl;

import com.example.audio.R;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;

public class AudioTrackActivity extends Activity implements OnClickListener {

	private static String URI_PCM = "/mnt/sdcard/pm.pcm";

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

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_audio_track);
		findViewById(R.id.btn_play).setOnClickListener(this);
		createEngine();

	}

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.btn_play:
			createAudioPlayer(URI_PCM);
			break;
		}
	}

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

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

	public static native boolean createAudioPlayer(String uri);

	public static native void setPlayingAudioPlayer(boolean isPlaying);

	public static native void setVolumeAudioPlayer(int millibel);

	public static native void setMutAudioPlayer(boolean mute);

	public static native void shutdown();
}

四、编写日志头文件,用于日志输出, 创建/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_AudioTrackActivity.h

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

#ifndef _Included_com_example_testopensl_AudioTrackActivity
#define _Included_com_example_testopensl_AudioTrackActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值