android實現錄音
㈠ android 如何實現 邊錄音 同時顯示 歌詞評分有原理,代碼就好了。。
歌曲播放時歌詞同步顯示,我們需要讀取以上歌詞文件的每一行轉換成成一個個歌詞實體,可根據當前播放器的播放進度與每句歌詞的開始時間,得到當前屏幕中央高亮顯示的那句歌詞
我們需要讀取以上歌詞文件的每一行轉換成成一個個歌詞實體:
代碼如下:
public class LyricObject {
public int begintime; // 開始時間
public int endtime; // 結束時間
public int timeline; // 單句歌詞用時
public String lrc; // 單句歌詞
}
可根據當前播放器的播放進度與每句歌詞的開始時間,得到當前屏幕中央高亮顯示的那句歌詞。在UI線程中另起線程,通過回調函數 onDraw() 每隔100ms重新繪制屏幕,實現歌詞平滑滾動的動畫效果。MainActivity代碼如下:
代碼如下:
import java.io.IOException;
import android.app.Activity;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
public class MainActivity extends Activity {
/** Called when the activity is first created. */
private LyricView lyricView;
private MediaPlayer mediaPlayer;
private Button button;
private SeekBar seekBar;
private String mp3Path;
private int INTERVAL=45;//歌詞每行的間隔
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// this.requestWindowFeature(Window.FEATURE_NO_TITLE);
// getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.main);
mp3Path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/LyricSync/1.mp3";
lyricView = (LyricView) findViewById(R.id.mylrc);
mediaPlayer = new MediaPlayer();
// this.requestWindowFeature(Window.FEATURE_NO_TITLE);
ResetMusic(mp3Path);
SerchLrc();
lyricView.SetTextSize();
button = (Button) findViewById(R.id.button);
button.setText("播放");
seekBar = (SeekBar) findViewById(R.id.seekbarmusic);
seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
// TODO Auto-generated method stub
if (fromUser) {
mediaPlayer.seekTo(progress);
lyricView.setOffsetY(220 - lyricView.SelectIndex(progress)
* (lyricView.getSIZEWORD() + INTERVAL-1));
}
}
});
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if (mediaPlayer.isPlaying()) {
button.setText("播放");
mediaPlayer.pause();
} else {
button.setText("暫停");
mediaPlayer.start();
lyricView.setOffsetY(220 - lyricView.SelectIndex(mediaPlayer.getCurrentPosition())
* (lyricView.getSIZEWORD() + INTERVAL-1));
}
}
});
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
ResetMusic(mp3Path);
lyricView.SetTextSize();
lyricView.setOffsetY(200);
mediaPlayer.start();
}
});
seekBar.setMax(mediaPlayer.getDuration());
new Thread(new runable()).start();
}
public void SerchLrc() {
String lrc = mp3Path;
lrc = lrc.substring(0, lrc.length() - 4).trim() + ".lrc".trim();
LyricView.read(lrc);
lyricView.SetTextSize();
lyricView.setOffsetY(350);
}
public void ResetMusic(String path) {
mediaPlayer.reset();
try {
mediaPlayer.setDataSource(mp3Path);
mediaPlayer.prepare();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
class runable implements Runnable {
@Override
public void run() {
// TODO Auto-generated method stub
while (true) {
try {
Thread.sleep(100);
if (mediaPlayer.isPlaying()) {
lyricView.setOffsetY(lyricView.getOffsetY() - lyricView.SpeedLrc());
lyricView.SelectIndex(mediaPlayer.getCurrentPosition());
seekBar.setProgress(mediaPlayer.getCurrentPosition());
mHandler.post(mUpdateResults);
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
Handler mHandler = new Handler();
Runnable mUpdateResults = new Runnable() {
public void run() {
lyricView.invalidate(); // 更新視圖
}
};
}
㈡ 如何使Android錄音實現內錄功能
之前在做直播的時候需要使用到內錄功能,比如經常看到游戲主播在直播玩游戲,游戲的聲音不是通過MIC錄制的,而是內錄完成的。故在此記錄一下。
相信大家都很熟悉Android如果錄音的了:
int frequency = 44100; int audioEncoding = AudioFormat.ENCODING_PCM_16BIT; int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO; int minBufferSize = AudioRecord.getMinBufferSize(frequency, channelConfiguration, audioEncoding); int audioSource = MediaRecorder.AudioSource.MIC;
AudioRecord audioRecord = new AudioRecord(audioSource, frequency,
channelConfiguration, audioEncoding, minBufferSize);
audioRecord.startRecording();
...
AudioSource輸入源介紹
項目
介紹
許可權
DEFAULT 默認。在源碼 system/media/audio/include/system/audio.h配置默認項 無
MIC 麥克風 無
VOICE_UPLINK 電話錄音上行線路 android.permission.CAPTURE_AUDIO_OUTPUT,系統許可權不允許第三方app使用
VOICE_DOWNLINK 電話錄音下行線路 android.permission.CAPTURE_AUDIO_OUTPUT,系統許可權不允許第三方app使用
VOICE_CALL 電話錄音上下線路 android.permission.CAPTURE_AUDIO_OUTPUT,系統許可權不允許第三方app使用
CAMCORDER 攝像頭的麥克風 無
VOICE_RECOGNITION 語音識別 無
VOICE_COMMUNICATION 網路電話 無
REMOTE_SUBMIX 傳輸到遠程的音頻混合流。默認情況下如何用該項錄音,本地揚聲器或者耳機的聲音將會被截走 android.permission.CAPTURE_AUDIO_OUTPUT,系統許可權不允許第三方app使用
好了,現在我們知道了REMOTE_SUBMIX可以實現內錄功能了。有兩點比較麻煩:
需要系統許可權
會截走揚聲器和耳機的聲音,也就是說再錄音時本地無法播放聲音
- LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)
- LOCAL_MODULE_TAGS := optional
- LOCAL_SRC_FILES := $(call all-java-files-under, src)
- LOCAL_PACKAGE_NAME := YourApp
- LOCAL_CERTIFICATE := platform
- LOCAL_PROGUARD_FLAG_FILES := proguard.flagsinclude $(BUILD_PACKAGE)include $(call all-makefiles-under,$(LOCAL_PATH))
- audio_devices_t AudioPolicyManager::getDeviceForStrategy(routing_strategy strategy, bool fromCache)
- if (mAvailableOutputDevices.getDevice(AUDIO_DEVICE_OUT_REMOTE_SUBMIX, String8("0")) != 0) { device2 = availableOutputDeviceTypes & AUDIO_DEVICE_OUT_REMOTE_SUBMIX;
- }
- if (mAvailableOutputDevices.getDevice(AUDIO_DEVICE_OUT_REMOTE_SUBMIX, String8("0")) != 0) { device2 = availableOutputDeviceTypes & AUDIO_DEVICE_OUT_REMOTE_SUBMIX; device2 |= (availableOutputDeviceTypes & AUDIO_DEVICE_OUT_WIRED_HEADPHONE); device2 |= (availableOutputDeviceTypes & AUDIO_DEVICE_OUT_SPEAKER);
- }
- int audioSource = MediaRecorder.AudioSource.MIC;
- int audioSource = MediaRecorder.AudioSource.REMOTE_SUBMIX;
系統許可權問題
這個對我來說比較好辦,因為我是直接在android設備板子上開發,可以直接使用系統簽名編譯。首先在AndroidManifest.xml添加
android:sharedUserId="android.uid.system"
其次,
第一種方法:
adb shell 執行:
signapk.jar platform.x509.pem platform.pk8 app-unsigned.apk signed.apk
adb push signed.apk /system/app
第二種方法:
編寫Android.mk : 設置簽名為platform
截走揚聲器和耳機的聲音問題
修改framework下av/services/audiopolicy/AudioPolicyManager.cpp
getDeviceForStrategy方法下找到
修改為
意思是聲音輸出的設備添加了耳機和揚聲器,這里可根據實際情況設置。
至此,將最開始的錄音代碼
改成
就可以實現內錄功能了。
<br/>
ps:
在不修改源碼的情況下,第三方app目前暫不知如何實現內錄。
延伸閱讀
5.0以後請求Android錄屏默認會彈出確認框,但在系統app下請求就不會彈出了(具體可以去看源碼)。這也是為了谷歌為了安全考慮。
不過5.0的時候這個彈框卻是一個大漏洞,被國內360發現了,給你們鏈接^_^
Android 5.0屏幕錄制漏洞
㈢ android中怎麼實現錄音並且分段
需要實時錄得話,中間會有延遲的,就是錄制完一段,再錄另一段的時候中間會卡頓下,然後你把mediaRecorder設置上錄制監聽器setOnInfoListener,它會回調的,然後重新初始化錄制器,再錄制。對應錄制中間一定會有延遲,但是延遲可以調節參數到最小的毫秒,這樣底層文件存儲自動保存,即可完成多個視頻分段存儲。
㈣ Android錄音API都是有哪些有什麼經典的案例么
我建議你參考Android API官方文檔,錄制音頻使用MediaRecorder這個類,
步驟大致為:
1,創建MediaRecorder實例
2,設置音頻源 setAudioSource()
3,設置輸出格式 setOutputFormat()
4,設置輸出文件(路徑)setOutputFile()
5,設置音頻編碼 setAudioEncoder()
6,音頻初始化,調用prepare()
7,調用start()開始錄制音頻
8,調用stop()結束錄制音頻
9,調用release()釋放資源
常式如下:
privatevoidstartRecording(){
mRecorder=newMediaRecorder();
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mRecorder.setOutputFile(mFileName);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
try{
mRecorder.prepare();
}catch(IOExceptione){
Log.e(LOG_TAG,"prepare()failed");
}
mRecorder.start();
}
privatevoidstopRecording(){
mRecorder.stop();
mRecorder.release();
mRecorder=null;
}
還需注意,
1)上述程序還需添加android.permission.WRITE_EXTERNAL_STORAGE和
android.permission.RECORD_AUDIO兩個許可權。
2)Android模擬器上無法錄制音頻,需在真機上測試。
上面程序是我記的筆記,就是參考的Android官方文檔,放到你的Activity里的某個按鈕事件里調用就行了,音頻參數什麼的看著自己調吧。
㈤ 安卓手機怎麼錄音
若使用的vivo手機,可以參考以下信息:
一、若是指錄音機軟體
我們的手機都有自帶的錄音機軟體。在桌面找到錄音機軟體點擊進入錄音機軟體,點擊下方的圓形按鈕,即可開始錄音;在錄音過程中點擊「‖」按鈕可以暫停錄音,再次點擊可繼續錄音,點擊「✓」按鈕即可結束錄音並保存錄音文件。
其他系統:進入文件管理--手機存儲/本地文件/所有文件--Record/錄音文件夾--即可查看通話錄音。
註:通話錄音的保存路徑不支持修改。
若有更多疑問,可進入vivo官網--我的--在線客服--下滑底部--在線客服--輸入人工客服進入咨詢了解。