Android -- AudioPlayer

AudioPlayer

主要是实现边录边播(AudioRecord+AudioTrack)以及对音频的实时处理(如会说话的汤姆猫、语音)

优点:语音的实时处理,可以用代码实现各种音频的封装

缺点:输出是PCM语音数据,如果保存成音频文件,是不能够被播放器播放的,所以必须先写代码实现数据编码以及压缩

示例:

使用AudioRecord类录音,并实现WAV格式封装。录音20s,输出的音频文件大概为3.5M左右(已写测试代码)

Demo

public class SoundActivity extends Activity implements  AdapterView.OnItemClickListener
        , MediaPlayer.OnCompletionListener {
  public static final String DIR = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "1122" + File.separator;

  private ListView mListView;
  private SoundAdapter mAdapter;
  private MediaPlayer mMediaPlayer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sound);
        mListView = (ListView) findViewById(R.id.lv_sound);
        mListView.setOnItemClickListener(this);
        initListView();
        initMediaPlayer();
    }

    private void initMediaPlayer() {
        mMediaPlayer = new MediaPlayer();
        mMediaPlayer.setOnCompletionListener(this);
    }

    private void initListView() {
        mAdapter = new SoundAdapter(SoundActivity.this, DIR);
        mListView.setAdapter(mAdapter);
    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        String fileName = (String) mAdapter.getItem(position);
        String file = DIR + fileName;

        try {
            if (mMediaPlayer.isPlaying()) {
                mMediaPlayer.stop();
            }
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            mMediaPlayer.reset();
            mMediaPlayer.setDataSource(file);
            mMediaPlayer.prepare();
            mMediaPlayer.start();
        } catch (IOException e) {
            e.printStackTrace();
        }


    }

    @Override
    public void onCompletion(MediaPlayer mp) {
        mMediaPlayer.reset();
    }

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

public class SoundAdapter extends BaseAdapter {
    private Context mContext;

    private File mDir;
    private int mTotalNumber = 0;
    private List<String> mFileNameList;

    public SoundAdapter(Context context, String dirPath) {
        mContext = context;
        mDir = new File(dirPath);
        mTotalNumber = mDir.list().length;
        mFileNameList = Arrays.asList(mDir.list());
    }

    @Override
    public int getCount() {
        return mTotalNumber;
    }

    @Override
    public Object getItem(int position) {
        return mFileNameList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder vh;
        if (convertView == null) {
            vh = new ViewHolder();
            convertView = LayoutInflater.from(mContext).inflate(R.layout.item, null);
            vh.textView = (TextView) convertView.findViewById(R.id.text_view);
            convertView.setTag(vh);
        } else {
            vh = (ViewHolder) convertView.getTag();
        }
        vh.textView.setText(mFileNameList.get(position));
        return convertView;
    }

    class ViewHolder {
        TextView textView;
    }

    @Override
    public void notifyDataSetChanged() {
        mTotalNumber = mDir.list().length;
        mFileNameList = Arrays.asList(mDir.list());
        super.notifyDataSetChanged();
    }
}

截图

122209154896420.jpg

我是天王盖地虎的分割线

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值