亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android實現伴奏錄音合成MP3

2019-10-21 21:26:51
字體:
來源:轉載
供稿:網友

本文實例為大家分享了Android實現伴奏錄音合成MP3的具體代碼,供大家參考,具體內容如下

基本實現思路如下:

1.利用android自帶的錄音類(AudioRecord)實現錄音.

 /**  * 播放伴奏  */ private MediaPlayer player; /**  * 返回按鈕  */ private ImageView btnBack; /**  * 切換歌曲  */ private Button btnSwitchSong; /**  * 伴唱時長  */ private TextView tv_recod_time; /**  * 歌詞VIEW  */ private LyricView lv_lyric; /**  * 開始錄制  */ private Button btnPlay; /**  * 標題  */ private TextView ivTitle; private boolean canPlay = true; private boolean isPause = false;  /***  * 背景音樂模式  */ private BackgroudMusicMode mode = BackgroudMusicMode.Accompany; /**  * 歌曲id  */ private String songId; /**  * 歌曲名稱  */ private String songName; /**  * 歌手名字  */ private String singerName; /**  * 伴奏文件  */ private File file; /**  * 是否正在錄制  */ private boolean isStart = false; /**  * 錄音狀態  */ private boolean starting = false; /**  * 伴奏時間  */ private int bztimetmp = 0; /**  * 伴奏時間  */ private String bztime = "";  /**  * 錄制時間  */ private int recordTimeLength=0; /**  * 更新伴奏時間  */ private RecordTask rt = null;  /**  * 錄制頻率,單位hz.這里的值注意了,寫的不好,可能實例化AudioRecord對象的時候,會出錯。我開始寫成11025就不行。這取決于硬件設備  * 設置音頻采樣率,44100是目前的標準,但是某些設備仍然支持22050,16000,11025  */ private int sampleRateInHz = 44100; /**  * 設置音頻的錄制的聲道CHANNEL_IN_STEREO為雙聲道,CHANNEL_CONFIGURATION_MONO為單聲道  */ private int channelConfig = AudioFormat.CHANNEL_CONFIGURATION_MONO;  /**  * 音頻數據格式:PCM 16位每個樣本。保證設備支持。PCM 8位每個樣本。不一定能得到設備支持。  */ private int audioFormat = AudioFormat.ENCODING_PCM_16BIT;  /**  * 調整播放音量  */ private AudioManager audioManager;  /**  * 最大音量  */ private int maxVolume = 0;  /**  * 當前音量  */ private int currentVolume = 0;  /**  * AudioRecord 寫入緩沖區大小  */ protected int m_in_buf_size; /**  * 錄制音頻對象  */ private AudioRecord mRecorder; /**  * 錄入的字節數組  */ private byte[] m_in_bytes; /**  * 存放錄入字節數組的大小  */ private LinkedList<byte[]> m_in_q; /**  * AudioTrack 播放緩沖大小  */ private int m_out_buf_size; /**  * 播放音頻對象  */ private AudioTrack mAudioTrack; /**  * 播放的字節數組  */ private byte[] m_out_bytes; /**  * 錄制音頻線程  */ private Thread record; /**  * 播放音頻線程  */ private Thread play; /**  * 讓線程停止的標志  */ private boolean flag = true; /**  * 是否啟動回聲  */ private boolean room_flag = true;  /***上面有個播放歌詞的組件  /***  * 初始化  */ private void init() {    audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);  maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_VOICE_CALL);  currentVolume = audioManager.getStreamVolume(AudioManager.STREAM_VOICE_CALL);  registerHeadsetPlugReceiver();  ycApplication = (YueChangApplication) getApplication();  coverDao = new CoverDao(getApplicationContext());  Bundle bundle = getIntent().getExtras();  songId = bundle.getString("songId");  songName = bundle.getString("songName");  singerName = bundle.getString("singerName");  if (songId != null) {   // AudioRecord 得到錄制最小緩沖區的大小   m_in_buf_size = AudioRecord.getMinBufferSize(sampleRateInHz, channelConfig, audioFormat);   // 實例化播放音頻對象   mRecorder = new AudioRecord(MediaRecorder.AudioSource.MIC, sampleRateInHz, channelConfig, audioFormat,     m_in_buf_size);   // 實例化一個字節數組,長度為最小緩沖區的長度   m_in_bytes = new byte[m_in_buf_size];   // 實例化一個鏈表,用來存放字節組數   m_in_q = new LinkedList<byte[]>();    // AudioTrack 得到播放最小緩沖區的大小   m_out_buf_size = AudioTrack.getMinBufferSize(sampleRateInHz, channelConfig, audioFormat);   // 實例化播放音頻對象   mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRateInHz, channelConfig, audioFormat,     m_out_buf_size, AudioTrack.MODE_STREAM);   // 實例化一個長度為播放最小緩沖大小的字節數組   m_out_bytes = new byte[m_out_buf_size];   record = new Thread(new recordSound());   //   if(ycApplication.isHeadsetplug()){    //   }else{//    m_out_trk = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRateInHz, channelConfig, audioFormat,//      m_out_buf_size, AudioTrack.MODE_STREAM);//   }      } }   /**  *  * 類描述:錄音線程   *  * @version 1.0  */ class recordSound implements Runnable {  @Override  public void run() {   // 初始化輸出流   DataOutputStream dos = null;   try {    File audioFile = new File(SongUtil.getRecordSingPCMPath(songId));    // 初始化輸出流    dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(audioFile)));    byte[] bytes_pkg;    if (mRecorder.getState() == AudioRecord.STATE_UNINITIALIZED) {     // 實例化播放音頻對象     mRecorder = new AudioRecord(MediaRecorder.AudioSource.MIC, sampleRateInHz, channelConfig,       audioFormat, m_in_buf_size);    }     // 開始錄音    mRecorder.startRecording();    while (flag) {     int size = mRecorder.read(m_in_bytes, 0, m_in_buf_size);     bytes_pkg = m_in_bytes.clone();     if (m_in_q.size() >= 2) {      m_in_q.removeFirst();     }     m_in_q.add(bytes_pkg);     if ((ycApplication.isHeadsetplug() && ycApplication.isOpenInEarphone())       || (!ycApplication.isHeadsetplug() && ycApplication.isOpenInSpeaker())) {      //Log.d(SingSingleActivity.this.getClass().getName(), "啟動錄音播放1");      if (play == null||!room_flag) {       //Log.d(SingSingleActivity.this.getClass().getName(), "啟動錄音播放2");       room_flag = true;       play = new Thread(new playRecord());       // 啟動播放線程       play.start();      }      } else {      if(room_flag||play != null){       //Log.d(SingSingleActivity.this.getClass().getName(), "關閉錄音播放1");       room_flag = false;       if (play != null) {        play.interrupt();       }       play = null;      }     }     // 寫入PCM文件     dos.write(bytes_pkg, 0, size);     dos.flush();    }    } catch (Exception e) {    // TODO: handle exception    e.printStackTrace();   } finally {    try {     // 關閉錄音     if (mRecorder != null) {      try {       if (mRecorder.getState() == AudioRecord.STATE_INITIALIZED) {        // 關閉錄音        mRecorder.stop();        mRecorder.release();       }      } catch (Exception e2) {       // TODO: handle exception      }     }     if (dos != null) {      dos.close();     }    } catch (Exception e2) {     // TODO: handle exception     e2.printStackTrace();    }   }   } }

2.錄音完成后,調用開源工具(Mad)實現PCM合成輸出到MP3文件.

主要調用的合成方法:

/*** * 方法描述:本地方法調用JNI合并mp3PCM與sourcePCM * @param sourcePCM * @param mp3PCM * @param mixPCM * @return */ public static native int mix2PCMToPCM(String sourcePCM, String mp3PCM, String mixPCM);  String recordPCMPath = SongUtil.getRecordSingPCMPath(songId); //錄音生成的PCM文件      String accompanyPCMPath = SongUtil.getAccompanySongPCMPath(songId); //伴奏解碼生成的PCM文件      String mixPCMPath = SongUtil.getMixSingPCMPath(songId); //合成后的PCM文件      String mixMP3Path = SongUtil.getMixSingMp3Path(songId); //合成后的MP3文件      // 混音      int code = SongEncodeUtil.mix2PCMToPCM(recordPCMPath, accompanyPCMPath, mixPCMPath);      if (code == 0) {       // 轉換混合后音頻格式 TO mp3       int i = SimpleLame.convert(mixPCMPath, mixMP3Path, m_in_buf_size);       Log.i(SingSingleActivity.this.getClass().getName(), "轉換" + i + "混音完成");       saveMp3File(mixMP3Path);      }

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久深夜福利免费观看| 日韩精品免费观看| 亚洲福利视频网站| 欧美激情高清视频| 亚洲乱码一区av黑人高潮| 97超级碰在线看视频免费在线看| 色综合久久久888| 性色av一区二区三区在线观看| 欧美美最猛性xxxxxx| 国产欧美一区二区三区在线| 亚洲精品99久久久久中文字幕| 国产亚洲精品美女| 日韩精品视频中文在线观看| 亚洲肉体裸体xxxx137| 91av国产在线| 日韩av色在线| 中文字幕精品一区二区精品| 欧美在线观看视频| 欧美性xxxxx极品| 欧美性猛交xxxx富婆弯腰| 97视频免费在线观看| 国产精品一区久久久| 国产视频久久网| 日本精品中文字幕| 日韩激情视频在线| 亚洲第一区第一页| 成人在线中文字幕| 97在线视频一区| 成人黄色在线播放| 亚洲字幕一区二区| www.日韩欧美| 国产精品v日韩精品| 中文.日本.精品| 91精品免费看| 日韩国产精品亚洲а∨天堂免| 国语自产偷拍精品视频偷| 色综合亚洲精品激情狠狠| 欧洲成人性视频| 国产成人精品在线视频| 精品久久久久久中文字幕一区奶水| 亚洲欧美国产精品专区久久| 精品香蕉在线观看视频一| 日韩成人在线播放| 精品久久久久久久久久久久久久| 国产日韩精品综合网站| 国产视频在线一区二区| 日韩美女免费线视频| 深夜精品寂寞黄网站在线观看| 日韩精品一区二区视频| 国产精品专区一| 国产精品成久久久久三级| 国产亚洲在线播放| 亚洲综合日韩中文字幕v在线| 最近中文字幕mv在线一区二区三区四区| 亚洲护士老师的毛茸茸最新章节| 欧美激情乱人伦一区| 久久精品中文字幕免费mv| 欧美成人在线网站| 亚洲一区中文字幕| 欧美高清电影在线看| 欧美高清视频免费观看| 91精品国产自产在线老师啪| 日本道色综合久久影院| 久久精品视频亚洲| 国产精品久久中文| 91av视频在线观看| 欧美激情在线狂野欧美精品| 91在线观看免费观看| 国产精品日韩av| 精品国产91久久久久久老师| 亚洲视频在线观看| 日本sm极度另类视频| 久久久亚洲天堂| 国产精品久久久久久久久久东京| 91免费版网站入口| 久久精品国产69国产精品亚洲| 日韩亚洲欧美中文在线| 亚洲日韩欧美视频| 欧美精品videos| 亚洲免费高清视频| 麻豆国产va免费精品高清在线| 亚洲v日韩v综合v精品v| 欧美午夜精品在线| 欧美日韩免费区域视频在线观看| 日韩中文字幕国产| 久青草国产97香蕉在线视频| 亚洲精品成人网| 欧美大肥婆大肥bbbbb| 亚洲aⅴ男人的天堂在线观看| 欧美多人乱p欧美4p久久| 中国日韩欧美久久久久久久久| 中文字幕欧美在线| 亚洲精品一区二区三区婷婷月| 97在线观看免费高清| 色综合久久悠悠| 欧美性黄网官网| 日韩成人在线视频观看| 亚洲成人久久电影| 久久久久久午夜| 久久综合免费视频| 国模吧一区二区三区| 国产婷婷成人久久av免费高清| 欧美一级淫片丝袜脚交| 久久韩剧网电视剧| 国产精品18久久久久久麻辣| 亚洲精品视频网上网址在线观看| 亚洲精品ady| 久久久精品视频成人| 45www国产精品网站| 欧美成人免费一级人片100| 国产在线精品自拍| 日韩精品视频在线观看免费| 国产啪精品视频| 国产日韩欧美在线视频观看| 精品久久香蕉国产线看观看gif| 精品久久久久久久久久久| 国产91色在线|免| 欧美日韩国产一区中文午夜| 91久久在线观看| 国产在线观看精品一区二区三区| 91日本在线视频| 日韩av在线直播| 91夜夜揉人人捏人人添红杏| 成人激情视频网| 日韩精品欧美国产精品忘忧草| 国产精品99久久久久久久久| 久久久精品美女| 黑丝美女久久久| 国语对白做受69| 亚洲精品之草原avav久久| 国产97色在线| 中文字幕亚洲激情| 午夜欧美大片免费观看| 国产精品久久久亚洲| 日韩av网站导航| 国产中文欧美精品| 国产精品欧美一区二区三区奶水| 成人网在线视频| 午夜欧美大片免费观看| 欧美插天视频在线播放| 国产精品美女久久久久av超清| 在线视频一区二区| 91国语精品自产拍在线观看性色| 国产精品亚洲精品| 69久久夜色精品国产69| 久久激情五月丁香伊人| 日韩欧美精品网址| 久久中国妇女中文字幕| 亚洲国产精久久久久久久| 国产亚洲精品美女久久久| 亚洲美女av在线播放| 国产精品入口夜色视频大尺度| 欧美日韩中文字幕| 国产性猛交xxxx免费看久久| 成人h视频在线| 欧美xxxx做受欧美| 欧美精品久久久久久久久久| 欧美一级高清免费| 中文字幕亚洲无线码在线一区| 久久精品中文字幕电影| 亚洲国产欧美久久| 91在线观看免费观看| 久久久久久中文| 久热精品视频在线|