zoukankan      html  css  js  c++  java
  • 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();
        }
    }
    

    截图

    我是天王盖地虎的分割线

  • 相关阅读:
    springboot2 整合雪花算法,并兼容分布式部署
    docker 在 linux 搭建私有仓库
    jdbc 几种关系型数据库的连接 和 driver_class,以及简单的使用
    springboot2 整合发送邮件的功能
    oracle 唯一新约束 和 逻辑删除的 冲突处理办法
    oracle 一些常见操作方法
    spring-cloud-stream 整合 rabbitmq
    springboot2 整合 rabbitmq
    docker 安装 rabbitmq 消息队列
    网络统计学目录
  • 原文地址:https://www.cnblogs.com/yydcdut/p/4725728.html
Copyright © 2011-2022 走看看