`
crazier9527
  • 浏览: 1008756 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

透过AudioTrack class来播放音频文件!

阅读更多

可以以左声道或者右声道来播放 音频文件

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.media.MediaPlayer;
import android.media.AudioManager;
import android.media.AudioTrack;
import android.media.AudioFormat;

public class LRChannel extends Activity {
    private Button lButton;
    private Button rButton;
    private TextView myTextView;
    private MediaPlayer mMediaPlayer01 = null;
    private AudioTrack aAudioTrack01 = null;
    private String strFilePath = "/sdcard/test.mp3";
    private float midVol = 0;
   
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        lButton = (Button) findViewById(R.id.ButtonL);
        rButton = (Button) findViewById(R.id.ButtonR);
        myTextView = (TextView) findViewById(R.id.myTextView);
        
        // left button response
        lButton.setOnClickListener(new Button.OnClickListener()
        {
          @Override
          public void onClick(View arg0)
          {
            // if ( checkSDCard() )
            // {
                // playVideo(strFilePath);
                playSound(strFilePath, 0);
            // }
          }
        });
        
        // right button response
        rButton.setOnClickListener(new Button.OnClickListener()
        {
          @Override
          public void onClick(View arg0)
          {
              playSound(strFilePath, 1);
          }
        });
    }
   
    private void playVideo(String strPath)
    {
        mMediaPlayer01 = new MediaPlayer();
        mMediaPlayer01.setAudioStreamType(AudioManager.STREAM_MUSIC);
        
        try
        {
            mMediaPlayer01.setDataSource(strPath);
        }
        catch (Exception e)
        {
            // TODO Auto-generated catch block
            myTextView.setText("setDataSource Exceeption:" + e.toString());
            e.printStackTrace();
        }
        
        try
        {
            mMediaPlayer01.prepare();
        }
        catch (Exception e)
        {
            // TODO Auto-generated catch block
            myTextView.setText("prepare Exceeption:"+e.toString());
            e.printStackTrace();
        }
        
        mMediaPlayer01.start();
        myTextView.setText("Playing");
        
        mMediaPlayer01.setOnCompletionListener(new MediaPlayer.OnCompletionListener()
        {
            public void onCompletion(MediaPlayer arg0)
            {
                // TODO Auto-generated method stub
                myTextView.setText("Playing stop!");
            }
        });
    }
   
    // iChannel = 0 means left channel test, iChannel = 1 means right channel test.
    private void playSound(String strPath, int iChannel)
    {
      // If now is playing...
      if ( aAudioTrack01 != null )
      {
          aAudioTrack01.release();
          aAudioTrack01 = null;
      }
      // Get the AudioTrack minimum buffer size
      int iMinBufSize = AudioTrack.getMinBufferSize(44100,
                          AudioFormat.CHANNEL_CONFIGURATION_STEREO,
                          AudioFormat.ENCODING_PCM_16BIT);
      if ( iMinBufSize == AudioTrack.ERROR_BAD_VALUE || iMinBufSize == AudioTrack.ERROR )
      {
          return;
      }
      // Constructor a AudioTrack object
      try
      {
          aAudioTrack01 = new AudioTrack(AudioManager.STREAM_MUSIC, 44100,
                    AudioFormat.CHANNEL_CONFIGURATION_STEREO,
                    AudioFormat.ENCODING_PCM_16BIT,
                    iMinBufSize,
                    AudioTrack.MODE_STREAM);
      }
      catch (IllegalArgumentException iae)
      {
          myTextView.setText("new AudioTrack Exceeption:" + iae.toString());
          iae.printStackTrace();
      }
      // Write data to buffer
      byte data[] = new byte[iMinBufSize];
      aAudioTrack01.write(data, 0, data.length);
      aAudioTrack01.write(data, 0, data.length);
      float lValue = 0;
      float rValue = 0;
      
      if ( iChannel == 0 )
      {
          lValue = 1.0f;
          rValue = 0.0f;
      }
      else if ( iChannel == 1 )
      {
          lValue = 0.0f;
          rValue = 1.0f;
      }
      
      aAudioTrack01.play();
      if ( aAudioTrack01.setStereoVolume(lValue, rValue) == AudioTrack.SUCCESS )
      {
          myTextView.setText("setStereoVolume successfully!");
      }
      aAudioTrack01.stop();
      if ( aAudioTrack01.setStereoVolume(midVol, midVol) == AudioTrack.SUCCESS )
      {
          myTextView.setText("Restore setStereoVolume successfully!");
      }
      aAudioTrack01.release();
      aAudioTrack01 = null;
    }
   
    private boolean checkSDCard()
    {
      if ( android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED) )
      {
          return true;
      }
      else
      {
          return false;
      }
    }
   
    @Override
    protected void onDestroy() {
        super.onDestroy();
        // TODO Auto-generated method stub
        if ( aAudioTrack01 != null ) {
            aAudioTrack01.setStereoVolume(midVol, midVol);
            aAudioTrack01.release();
            aAudioTrack01 = null;
        }
    }
   
}
 

在播放音频方面,AudioTrack可以设置的效果更多,如果你用MediaPlayer,在设置播放效果时不如AudioTrack!

分享到:
评论
4 楼 hzhbking 2012-05-09  
不会用
3 楼 sasuke38 2011-11-30  
请问怎么暂停,暂停后又怎么继续播放
2 楼 jiang4920 2011-10-25  
请问在哪儿里开始播放的?
1 楼 marine8888 2011-08-15  
hi,在playSound(musicPath,channel)中没有处理musicPath,playSound(...)的时候有声音吗?

相关推荐

    android使用AudioTrack低延迟播放音频文件

    这篇博客"android使用AudioTrack低延迟播放音频文件"详细介绍了如何利用`AudioTrack`来实现这一目标。 首先,`AudioTrack`的创建需要指定一些关键参数,包括音频格式(如采样率、位深度、声道数)、音频流类型(如...

    AudioTrack实现播放PCM音频文件

    总结来说,使用AudioTrack播放PCM音频文件涉及的关键知识点包括:PCM音频格式的理解、AudioTrack类的使用、音频参数设置、文件读取以及播放控制。通过熟练掌握这些技术,开发者可以实现自定义的音频播放功能,满足...

    android使用AudioTrack低延迟播放音频文件.rar

    `AudioTrack`类是Android提供的一种高级音频播放接口,它允许开发者直接控制音频缓冲区,从而实现更低的延迟播放。下面将详细探讨如何使用`AudioTrack`来实现这一目标。 首先,`AudioTrack`的创建需要几个关键参数...

    android AudioTrack播放PCM音频文件 rm格式视频.rar

    播放扩展名为rm格式的文件,不使用android 内置的Audio和video来播放PCM音频数据,通过通过解码得到PCM数据源,使用AudioTrack类实现音频文件的播放,本源码就是演示了如何使用AudioTrack来播放PCM音频数据,...

    Audiotrack 播放音频流

    在Android平台上,`AudioTrack`类是用于播放音频数据的核心组件。它允许开发者将音频数据送入设备的音频硬件进行播放,支持多种音频格式。在本文中,我们将深入探讨`AudioTrack`的工作原理、使用方法以及如何处理PCM...

    Android音频系统AudioTrack使用方法详解

    同时,AudioTrack也可以用于播放PCM数据流的音频文件,如WAV格式的音频文件。 AudioTrack是Android音频系统中播放音频的重要组件,了解AudioTrack的使用方法和工作原理,可以帮助开发者更好地使用AudioTrack进行...

    audiotrack 播放音频

    在Android系统中,`AudioTrack`是用于在设备上播放音频数据的核心类。它允许开发者直接控制音频硬件,实现低延迟、高性能的音频播放。本文将深入探讨`AudioTrack`的工作原理、使用方法以及相关注意事项。 一、`...

    Android MediaCodec解码AAC,AudioTrack播放PCM音频

    7. **播放PCM音频**: 使用`AudioTrack`类来播放解码后的PCM数据。`AudioTrack`是一个直接音频输出接口,可以将音频数据传送到设备的音频硬件进行播放。你需要设置适当的音频属性,如采样率、通道数和位深度,确保与...

    android 使用 audiotrack和audiorecord c++代码

    `AudioTrack`是Android系统提供的用于播放音频数据的类,它可以将PCM(脉冲编码调制)数据发送到音频硬件进行播放。创建`AudioTrack`对象时,需要提供音频格式(如采样率、位深度、通道数)、缓冲区大小以及播放模式...

    Android 使用 AudioRecord 和 AudioTrack 完成音频PCM数据的采集和播放,并读写音频wav文件。

    Android 使用 AudioRecord 和 AudioTrack 完成音频PCM数据的采集和播放,并读写音频wav文件。 封装好的Java代码,可同时录制PCM和WAV文件。自己定义存储位置。 Android提供了AudioRecord和MediaRecord。MediaRecord...

    audiotrack播放PCM音频数据的例子

    一个使用audiotrack播放PCM音频数据的DEMO,上传的代码工程中有个音频数据文件夹,包含了用于测试的PCM数据文件,详情请看readme.txt;另外代码附详细说明,走过路过的都不要错过了,喜欢就顶下吧

    使用audiotrack播放pcm音频数据(android)

    RT,一个使用audiotrack播放PCM音频数据的DEMO,上传的代码工程中有个音频数据文件夹,包含了用于测试的PCM数据文件,详情请看readme.txt;另外代码附详细说明,走过路过的都不要错过了,喜欢就顶下吧

    android使用audioRecord和audioTrack实现语音录音播放与即时播放

    `AudioRecord`和`AudioTrack`是Android SDK提供的一对关键类,分别用于录音和播放音频数据。这两个类允许开发者进行低级别的音频操作,实现更加灵活和高效的声音处理。接下来,我们将深入探讨如何使用`AudioRecord`...

    AudioTrack播放pcm文件,波形显示

    在Android平台上,AudioTrack类是系统提供的一种API,允许开发者直接播放原始的音频数据,例如PCM格式的文件。本文将深入探讨如何使用AudioTrack播放PCM文件,并展示波形,同时结合给定的文件信息,我们可以推测这是...

    Android端AudioTrack以及OpenSL ES结合ffmpeg播放mp3文件

    本篇将深入探讨如何使用`AudioTrack`、OpenSL ES以及ffmpeg库来实现mp3文件的播放。这四个关键技术是Android原生音频处理的重要组成部分,它们分别是: 1. **AudioTrack**: Android SDK中的一个类,用于向音频硬件...

    Android audiotrack 播放pcm

    下面我们将详细探讨如何使用`AudioTrack`来播放PCM音频。 首先,创建一个`AudioTrack`实例是必要的。你需要指定音频的参数,如声道数(单声道或立体声)、采样率(例如44100Hz)、位深度(通常为16位)以及音频格式...

    AudioRecord录音 AudioTrack播放

    AudioRecord和AudioTrack是Android SDK提供的两个核心类,分别用于录音和播放音频数据。这两个类是实现Android设备上音频输入输出的基础。 AudioRecord类允许开发者从设备的麦克风获取原始的PCM(脉冲编码调制)...

    android音频发射器,audiotrack方波,音频通信

    在Android平台上,音频处理是一个非常重要的领域,尤其对于开发者来说,理解如何利用音频API来创建、播放和控制声音是至关重要的。"android音频发射器,audiotrack方波,音频通信"这个标题揭示了我们将要探讨的核心...

    C++ 播放音频流(PCM裸流)

    本篇文章将深入探讨如何使用C++来播放音频流,特别是针对PCM(脉冲编码调制)裸流。PCM是一种常见的数字音频编码方式,它直接对模拟音频信号进行采样和量化,形成数字信号。 首先,我们要理解PCM裸流的本质。PCM...

    音频录制和播放示例

    本示例“音频录制和播放示例”提供了一个基础的实现方式,利用了Android SDK中的AudioRecord和AudioTrack类。下面我们将深入探讨这两个核心组件以及它们在音频处理中的作用。 AudioRecord是Android提供的一个API,...

Global site tag (gtag.js) - Google Analytics