当前位置:首页 » 安卓系统 » android实现录音

android实现录音

发布时间: 2025-06-05 18:55:10

㈠ 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可以实现内录功能了。有两点比较麻烦:

  • 需要系统权限

  • 会截走扬声器和耳机的声音,也就是说再录音时本地无法播放声音

  • 系统权限问题

    这个对我来说比较好办,因为我是直接在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

  • 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))

  • 截走扬声器和耳机的声音问题

    修改framework下av/services/audiopolicy/AudioPolicyManager.cpp

  • audio_devices_t AudioPolicyManager::getDeviceForStrategy(routing_strategy strategy, bool fromCache)

  • getDeviceForStrategy方法下找到

  • 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;

  • 就可以实现内录功能了。
    <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官网--我的--在线客服--下滑底部--在线客服--输入人工客服进入咨询了解。

热点内容
学习通自动答题脚本电脑版 发布:2025-06-07 01:56:46 浏览:937
javaexceljxl 发布:2025-06-07 01:50:11 浏览:424
u盘分文件夹车载 发布:2025-06-07 01:34:45 浏览:134
安卓9系统日志收集在哪里 发布:2025-06-07 01:26:17 浏览:445
密码扑克怎么看 发布:2025-06-07 01:18:19 浏览:912
黑马php就业班 发布:2025-06-07 01:15:33 浏览:558
数据库练习答案 发布:2025-06-07 01:13:29 浏览:795
在c语言中函数名的存储类别为外部 发布:2025-06-07 00:50:38 浏览:587
安卓系统如何下载游戏不要钱 发布:2025-06-07 00:29:08 浏览:793
我的世界基岩版java互通的服务器 发布:2025-06-07 00:26:32 浏览:282