精华内容
下载资源
问答
  • 本demo实现的是Android中利用AudioRecord实时录制音频转化为MP3格式的音频的实例,可以实现录制的开始、暂停、停止等功能。
  • 直接将电脑音频录制成MP3格式。制作手机铃声最佳。
  • 原标题:电脑怎么录音,电脑录制音频的方法当我们电脑唱歌或者与别人聊天时要录音,用手机录音可能就比较麻烦,也不知道手机录制的音质如何。这个时候如果有一款电脑录音软件可以录制电脑播放的声音那就好了。那么...

    原标题:电脑怎么录音,电脑录制音频的方法

    当我们用电脑唱歌或者与别人聊天时要录音,用手机录音可能就比较麻烦,也不知道手机录制的音质如何。这个时候如果有一款电脑录音软件可以录制电脑播放的声音那就好了。那么电脑怎么录音,电脑录制音频的方法?通过下面的文章我来告诉大家用电脑的时候需要录音该怎么做。

    7868ecb8a9074da7a241f30ec3021817.png

    1、打开电脑上安装的迅捷录音软件,就会看见该录音软件的功能界面可以依次点击熟悉熟悉功能。

    f0feb22be731d5bf38aa794dfed27e2a.png

    2、格式选择里面有MP3和WAV两种音频格式可以选择,对音质要求比较高的用户建议选择WAV格式(WAV是未经过压缩,音质方面不会出现失真)。

    b5a1156484c679e8d49b4d86a23670fa.png

    3、声音来源是用来选择录制模式的,有“全部”、“仅系统声音”和“仅麦克风声音”三种选择,选择“仅麦克风声音”来做演示例子。

    c9daed373fb87742b4a019a14153f673.png

    4、录音格式和录制环境都选择好后要自定义录好后音频的保存地点了,点击“更改目录”选择想要保存的地点。

    ceeabed17dc0fa04e1e37e1f864f2bd1.png

    5、点击“开始录制”就可以录制音频了,可以录歌、录声音或者电脑发出的声音,录好后点击“暂停录制”,然后录制的音频素材就会自动保存到选择的保存地点。

    5311045f3e69a6c1303f4649cb2e20ae.png

    以上就是用录音软件录制电脑声音的方法,有需要录制电脑声音的用户可以照着上面的步骤来实践操作,还有这些操作步骤不是固定的不用非按照这个步骤来操作,有些步骤是可以调换的。

    录音软件www.xunjieshipin.com/download-audiorecorder返回搜狐,查看更多

    责任编辑:

    展开全文
  • 不得不说,前端技术发展真是日新月异,有人实现了js版本的lame编码器,可以直接在浏览器端录制MP3音频。lamejs介绍最初有个开源项目libmp3lame-js,直接将 lame 源码编译为 js版本,后来有人基于libmp3lam...

    13年的时候做过html5录音,一个问题是保存的wav格式文件很大,当初用了一个迂回的方式,上传到服务器后调用 lame 编码器转换,但由于文件大,上传较慢。不得不说,前端技术发展真是日新月异,有人实现了js版本的lame编码器,可以直接在浏览器端录制MP3音频。

    lamejs介绍

    最初有个开源项目 libmp3lame-js ,直接将 lame 源码编译为 js版本,后来有人基于 libmp3lame 使用 js 进行了重写,就是如今的 lamejs 项目。相比libmp3lame ,自身体积更小,而且能实现更快的编码速度。据介绍说,编码一个132秒长度的音频仅需6.5秒。

    录制mp3音频

    我对代码进行了梳理和封装,已发布到Github,参见 mp3-recorder。对实现过程有兴趣或对使用lamejs有兴趣的,可以参考我的源码。支持Firefox 及 Webkit浏览器。

    采用64kbps比特率,录制一分钟音频长度约为480KB。

    942111895fe3607622c371a0899849a1.png

    调用示例

    /*

    MP3的采样频率分为 48000 44100 32000 24000 22050 16000 12050 8000

    比特率值与现实音频对照(仅供参考)

    16Kbps=电话音质

    24Kbps=增加电话音质、短波广播、长波广播、欧洲制式中波广播

    40Kbps=美国制式中波广播

    56Kbps=话音

    64Kbps=增加话音(手机铃声最佳比特率设定值、手机单声道MP3播放器最佳设定值)

    112Kbps=FM调频立体声广播

    128Kbps=磁带(手机立体声MP3播放器最佳设定值、低档MP3播放器最佳设定值)

    160Kbps=HIFI高保真(中高档MP3播放器最佳设定值)

    192Kbps=CD(高档MP3播放器最佳设定值)

    256Kbps=Studio音乐工作室(音乐发烧友适用)

    */

    //唯一影响mp3文件大小的参数为 bitRate

    //sampleRate 仅供特殊需求的人使用

    var recorder = new MP3Recorder({

    //numChannels: 1, //声道数,默认为1

    //sampleRate: 8000, //采样率,一般由设备提供,比如 48000

    bitRate: 64, //比特率,不要低于64,否则可能录制无声音(人声)

    //录音结束事件

    complete: function (data, type) {

    //blob为mp3音频数据

    var blob = new Blob(data, { type: type });

    }

    });

    //开始录音

    recorder.start(onSuccess, onError);

    //停止录音

    recorder.stop();

    //暂停录音

    recorder.pause();

    //恢复录音

    recorder.resume();

    使用很简单,demo有详细代码,在此就不多说了。

    代码下载

    写在最后

    如果本文或本项目对您有帮助的话,请不吝点个赞。欢迎交流!

    MP3的采样率和比特率

    我们听mp3,看电影都会注意到两个参数,常见的有采样率44.1KHz,比特率192Kbps,那么什么是采样率,什么是比特率?他们是什么关系呢?下面就我们就来简单做个解释: 把模拟音频信号转成数字音频信 ...

    HTML5 audio 如何实现播放多个MP3音频

    标签是HTML5中的新标签,定义声音用于嵌入音频内容,比如音乐或其他音频流.用的比较多音频格式是.mp3. 标签常用属性如下表 属性 值 描述 au ...

    Android || IOS录制mp3语音文件方法

    Android Android Supported Media Formats : http://developer.android.com/guide/appendix/media-formats. ...

    HTML5之Audio音频标签学习

    HTML5中的新元素标签 src:音频文件路径. autobuffer:设置是否在页面加载时自动缓冲音频. autoplay:设置音频是否自动播放. loop:设置音频是否要循环播放. control ...

    HTML5媒体(音频/视频)

    摘要: 在HTML5出现之前,web媒体大部分通过Flash来实现.这种方式造成了文件大加载慢,影响网站性能,开发难度高,维护麻烦,不易扩展等.这就导致HTML5自己开始支持媒体功能.HTML5 DO ...

    HTML5学习笔记 音频

    HTML5提供了播放音频的标准. Web上的音频 直到现在,仍然不存在一项旨在网页上播放音频的标准. 今天,大多数音频是通过插件比如flash来播放的.然而,并非所有的浏览器都拥有同样的插件. hmt ...

    Python 爬取所有51VOA网站的Learn a words文本及mp3音频

    Python 爬取所有51VOA网站的Learn a words文本及mp3音频 #!/usr/bin/env python # -*- coding: utf-8 -*- #Python 爬取所有5 ...

    mp3 音频 音乐 tag ID3 ID3V1 ID3V2 标签 读取信息 获得图片 jpeg bmp 图片转换等

    mp3 音频 音乐 tag ID3 ID3V1 ID3V2 标签 读取信息 获得图片 jpeg bmp 图片转换(上) MP3文件格式(二)---ID3v2 图:ID3V1标签结构 图:ID3V2标签 ...

    获取mp3文件的采样率

    /** * 获取mp3文件的采样率 * @param filefullname 文件完整路径 * @return 采样率 */public int getMp3SampleRate(String fi ...

    随机推荐

    Win7+Ubuntu双系统安装完成后时间不一致相差大概8小时

    Win7+Ubuntu双系统时间不一致 解决方法: 第一种在Windows下进行如下修改: 在 注册表项:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Con ...

    Maven 在sts不会自动下载包的问题

    1.查看maven配置setting.xml是否有设置远程仓库 2.sts是否正确配置指定了setting.xml 3.是否开启线上下载,如下图

    C#顺序表(数据结构)

    xmfdsh我近来心情实在不好,只因为这两天课比较少,然后一下子时间太多,不知道干什么,心情郁闷......这是要闹哪样?这都让我一个郁闷了一个晚上.闲来无聊,回顾下之前学的C#数据结构,数据结构的重 ...

    读懂IL代码就这么简单

    展开全文
  • 录制音频和在手机系统中获取音频

    千次阅读 2015-12-21 16:13:28
    这里有两种获取音频的方式: 1.录音保存获取音频 点击开始录音按钮之后的... /* **************************************************************** * * 开始录音 ... private void startAudio() { // 创建

    <span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">这里有两种获取音频的方式:</span>

    1.录音保存获取音频

    点击开始录音按钮之后的开始录音,设置录音的状态,已经设置stop按钮停止录音按钮可以点击

    	/* ****************************************************************
    	 * 
    	 * 开始录音
    	 */
    	private void startAudio() {
    		// 创建录音频文件
    		// 这种创建方式生成的文件名是随机的
    		fileAudioName = "audio" + GetSystemDateTime.now()
    				+ StringTools.getRandomString(2) + ".mp3";
    		mediaRecorder = new MediaRecorder();
    		// 设置录音的来源为麦克风
    		mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    		mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
    		mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
    		mediaRecorder.setOutputFile(filePath + "/" + fileAudioName);
    		try {
    			mediaRecorder.prepare();
    			mediaRecorder.start();
    			textViewLuYinState.setText("录音中。。。");
    
    			fileAudio = new File(filePath + "/" + fileAudioName);
    			buttonStart.setEnabled(false);
    			buttonStop.setEnabled(true);
    			listViewAudio.setEnabled(false);
    			isLuYin = true;
    		} catch (IllegalStateException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    
    	}

    然后录音有两种结束方式,一种是倒计时结束自动结束,一种是点击停止按钮停止录音

    按钮点击

    		// 停止按钮
    		buttonStop.setOnClickListener(new OnClickListener() {
    			@Override
    			public void onClick(View v) {
    				// TODO Auto-generated method stub
    				Toast.makeText(LuYinActivity.this, "录音时间到", Toast.LENGTH_SHORT).show();
                    <span style="white-space:pre">		</span>timedown.stop();
    				stopAudion();
    				rcChat_popup.setVisibility(View.GONE);
                    timedown.setVisibility(View.GONE);
    			}
    		});
    		

    调用的stopAudion方法,在listView中添加文件显示,更新listView同时更新数据库。

    	/* ******************************************************
    	 * 
    	 * 停止录制
    	 */
    	private void stopAudion() {
    		if (null != mediaRecorder) {
                mHandler.removeCallbacks(mPollTask);
    			// 停止录音
    			mediaRecorder.stop();
    			mediaRecorder.release();
    			mediaRecorder = null;
    			textViewLuYinState.setText("录音停止了");
    
    			// 开始键能够按下
    			buttonStart.setEnabled(true);
    			buttonStop.setEnabled(false);
    			listViewAudio.setEnabled(true);
    			String filePath_adapter = filePath + "/" + fileAudioName;
    			addItem(fileAudioName,filePath_adapter);
    			adapter.notifyDataSetChanged();
    	        volume.setImageResource(R.drawable.amp1);
    		}
    	}
    另一种,倒计时结束自动结束,Chronometer用来显示倒计时,Chronometer是一个控件,每一秒自动刷新

    	   private void initTimer(long total) {
    	        this.timeTotalInS = total;
    	        this.timeLeftInS = total;
    	        timedown.setOnChronometerTickListener(new Chronometer.OnChronometerTickListener() {
    	            @Override
    	            public void onChronometerTick(Chronometer chronometer) {
    	                if (timeLeftInS <= 0) {
    	                    Toast.makeText(LuYinActivity.this, "录音时间到", Toast.LENGTH_SHORT).show();
    	                    timedown.stop();
    	                    //录音停止
    	                    stopAudion();
    	                    rcChat_popup.setVisibility(View.GONE);
    	                    timedown.setVisibility(View.GONE);
    	                    return;
    	                }
    	                timeLeftInS--;
    	                refreshTimeLeft();
    	            }
    	        });
    	    }


    结束之后自动保存到之前初始化的地址:mediaRecorder.setOutputFile(filePath + "/" + fileAudioName);


    2.在手机中扫描获取音频然后添加到自己的数据库,由数据库中设置歌单的方式读出来

    点击from_file然后跳转Activity:

    	public void getFiles(){	
    		if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
    			Toast.makeText(this, "暂无外部存储", Toast.LENGTH_SHORT).show();
    			return;
    		}
    
    		new Thread(new Runnable() {
    			
    			@Override
    			public void run() {
    				
    				Uri mImageUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
    				ContentResolver mContentResolver = SearchMP3.this.getContentResolver();
    
    				Cursor mCursor = getContentResolver().query(
    						MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null,
    						MediaStore.MediaColumns.TITLE);
    				
    				while (mCursor.moveToNext()) {
    					//获取文件的路径
    					String filePath = mCursor.getString(mCursor
    							.getColumnIndex(MediaStore.Audio.AudioColumns.DATA));
    					
    					//获取文件的标题
    					String fileTitle = mCursor.getString(mCursor
    							.getColumnIndex(MediaStore.Audio.AudioColumns.TITLE));
    					
    					//获取该文件的时间
    					String fileTime = mCursor.getString(mCursor
    							.getColumnIndex(MediaStore.Audio.AudioColumns.TITLE));
    					
    					long modify = mCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATE_MODIFIED);
    					
    
    					int isMusic = mCursor.getInt(mCursor
    							.getColumnIndex(MediaStore.Audio.Media.IS_MUSIC)); // 是否为音乐
    										
    					if (isMusic!=0) {
    						
    						Map<String, String> map = new HashMap<String, String>();
    						map.put("fileTitle", fileTitle);
    						map.put("filePath", filePath);
    						map.put("fileTime", fileTime);
    						mGruopMap.put(filePath, map);
    						
    					} else {
    						//如果已经扫描过。。。。。不做处理
    					}
    				}
    				
    				mCursor.close();
    				
    				//通知Handler扫描图片完成
    				mHandler.sendEmptyMessage(SCAN_OK);
    			}
    		}).start();
    		
    		
    	}
    	


    	/**
    	 * 组装分组界面listView的数据源,因为我们扫描手机的时候将图片信息放在HashMap中
    	 * 所以需要遍历HashMap将数据组装成List
    	 * 
    	 * @param mGruopMap
    	 * @return
    	 */
    	private List<FileBean> makeFileList(HashMap<String, Map<String, String>> mGruopMap){
    		if(mGruopMap.size() == 0){
    			return null;
    		}
    		List<FileBean> list = new ArrayList<FileBean>();
    		
    		Iterator<Map.Entry<String, Map<String, String>>> it = mGruopMap.entrySet().iterator();
    		while (it.hasNext()) {
    			Map.Entry<String, Map<String, String>> entry = it.next();
    			FileBean mFileBean = new FileBean();
    			String key = entry.getKey();
    			Map<String, String> map = entry.getValue();
    			
    			mFileBean.setFilePath(map.get("filePath"));
    			mFileBean.setFileTime(map.get("fileTime"));
    			mFileBean.setFileTitle(map.get("fileTitle"));
    			
    			list.add(mFileBean);
    		}		
    		return list;
    		
    	}
    listview的自定义adapter:更新"确定(1)"括号里面的数字

    package com.monkeylluffy.recorder;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;
    
    import org.w3c.dom.Text;
    
    import com.monkeylluffy.recorder.tools.FileBean;
    import com.nineoldandroids.animation.AnimatorSet;
    import com.nineoldandroids.animation.ObjectAnimator;
    
    import android.content.Context;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.CheckBox;
    import android.widget.Checkable;
    import android.widget.CompoundButton;
    import android.widget.CompoundButton.OnCheckedChangeListener;
    import android.widget.TextView;
    
    public class AddFileAdapter extends BaseAdapter{
    
    	private List<FileBean> list;
    	protected LayoutInflater mInflater;
    	private TextView textView;
    	
    	public AddFileAdapter(Context context,List<FileBean> list,TextView textView){
    		this.list = list;
    		this.mInflater = LayoutInflater.from(context);
    		this.textView = textView;
    		
    	}
    	
    	@Override
    	public int getCount() {
    		// TODO Auto-generated method stub
    		return list.size();
    	}
    
    	@Override
    	public Object getItem(int position) {
    		// TODO Auto-generated method stub
    		return list.get(position);
    	}
    
    	@Override
    	public long getItemId(int position) {
    		// TODO Auto-generated method stub
    		return position;
    	}
    
    	@Override
    	public View getView(final int position, View convertView, ViewGroup parent) {
    		// TODO Auto-generated method stub
    		final ViewHolder viewHolder;
    		FileBean mFileBean = list.get(position);
    		String path = mFileBean.getFilePath();
    		if(convertView == null){
    			viewHolder = new ViewHolder();
    			convertView = mInflater.inflate(R.layout.additem, null);
    			viewHolder.mTextViewPath = (TextView) convertView.findViewById(R.id.filePath);
    			viewHolder.mTextViewTitle = (TextView) convertView.findViewById(R.id.fileTitle);
    			viewHolder.mChoose = (CheckBox) convertView.findViewById(R.id.filechoose);
    			convertView.setTag(viewHolder);
    		}else{
    			viewHolder = (ViewHolder) convertView.getTag();
    		}
    		
    		viewHolder.mTextViewTitle.setText(mFileBean.getFileTitle());
    		viewHolder.mTextViewPath.setText(mFileBean.getFilePath());
    		viewHolder.mChoose.setOnCheckedChangeListener(new OnCheckedChangeListener() {
    			
    			@Override
    			public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
    				// TODO Auto-generated method stub
    				if(!mSelectMap.containsKey(position) || !mSelectMap.get(position)){
    					addAnimation(viewHolder.mChoose);
    				}
    				mSelectMap.put(position, isChecked);
    				textView.setText("确定("+getSelectItems().size()+")");
    				
    			}
    		});	
    		viewHolder.mChoose.setChecked(mSelectMap.containsKey(position) ? mSelectMap.get(position) : false);
    		
    				
    		return convertView;
    		
    	}
    	
    	/**
    	 * 获取选中的Item的position
    	 * @return
    	 */
    	public List<Integer> getSelectItems(){
    		List<Integer> list = new ArrayList<Integer>();
    		for(Iterator<Map.Entry<Integer, Boolean>> it = mSelectMap.entrySet().iterator(); it.hasNext();){
    			Map.Entry<Integer, Boolean> entry = it.next();
    			if(entry.getValue()){
    				list.add(entry.getKey());
    			}
    		}
    		
    		return list;
    	}
    	
    	/**
    	 * 给CheckBox加点击动画,利用开源库nineoldandroids设置动画 
    	 * @param view
    	 */
    	private void addAnimation(View view){
    		float [] vaules = new float[]{0.5f, 0.6f, 0.7f, 0.8f, 0.9f, 1.0f, 1.1f, 1.2f, 1.3f, 1.25f, 1.2f, 1.15f, 1.1f, 1.0f};
    		AnimatorSet set = new AnimatorSet();
    		set.playTogether(ObjectAnimator.ofFloat(view, "scaleX", vaules), 
    				ObjectAnimator.ofFloat(view, "scaleY", vaules));
    				set.setDuration(150);
    		set.start();
    	}
    	
    	
    	private HashMap<Integer, Boolean> mSelectMap = new HashMap<Integer, Boolean>();
    	
    	public static class ViewHolder{
    		public TextView mTextViewTitle;
    		public TextView mTextViewPath;
    		public CheckBox mChoose;
    	}
    }


    点击确定:通过adpter中返回的position,将这几个的数据添加到数据库中,然后在页面读出来:

    		title_right.setOnClickListener(new OnClickListener() {
    			
    			@Override
    			public void onClick(View v) {
    				// TODO Auto-generated method stub
    				//添加数据库,跳转参数的设置
    				Toast.makeText(SearchMP3.this, "选中 " + adapter.getSelectItems().size() + " item", Toast.LENGTH_LONG).show();
    				List<Integer> theList = adapter.getSelectItems();
    			    db = myDBHelper.getWritableDatabase();
    				for (int i = 0; i < theList.size(); i++) {
    					FileBean fileBean = list.get(theList.get(i));
    					ContentValues values1 = new ContentValues();
    			        values1.put("filePath", fileBean.getFilePath());
    			        values1.put("fileName", fileBean.getFileTitle());
    			        //参数依次是:表名,强行插入null值得数据列的列名,一行记录的数据
    			        db.insert("songlist", null, values1);
    			        
    			        Toast.makeText(SearchMP3.this, "插入完毕~", Toast.LENGTH_SHORT).show();
    				}
    				
    				Intent intent = new Intent(SearchMP3.this,LuYinActivity.class);
    				startActivity(intent);
    			}
    		});





    //此处有几处瑕疵,晚上修改,xml明天上传

    1.在添加时没有避免列表中已经有的就不在扫描出来

    2.在点击确定的时候,应该做的是finish(),用startResultActivity和setResult()







    展开全文
  • 剪辑转换MP3音频格式 录制MP3 制作自己的语音专辑 剪辑自己的手机铃声
  • 1、录制音频首先配置音频参数,为了保证能转mp3格式: //录音设置 NSMutableDictionary *recordSetting = [[NSMutableDictionary alloc] init]; //设置录音格式 AVFormatIDKey==kAudioFormatLinearPCM ...

    1、录制音频首先配置音频参数,为了保证能转mp3格式:

     //录音设置
        NSMutableDictionary *recordSetting = [[NSMutableDictionary alloc] init];
        //设置录音格式  AVFormatIDKey==kAudioFormatLinearPCM
        [recordSetting setValue:[NSNumber numberWithInt:kAudioFormatLinearPCM] forKey:AVFormatIDKey];
        //设置录音采样率(Hz) 如:AVSampleRateKey==8000/44100/96000(影响音频的质量), 采样率必须要设为11025才能使转化成mp3格式后不会失真
        [recordSetting setValue:[NSNumber numberWithFloat:11025.0] forKey:AVSampleRateKey];
        //录音通道数  1 或 2 ,要转换成mp3格式必须为双通道
        [recordSetting setValue:[NSNumber numberWithInt:2] forKey:AVNumberOfChannelsKey];
        //线性采样位数  8、16、24、32
        [recordSetting setValue:[NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey];
        //录音的质量
        [recordSetting setValue:[NSNumber numberWithInt:AVAudioQualityHigh] forKey:AVEncoderAudioQualityKey];
    
        _audioRecorder = [[AVAudioRecorder alloc] initWithURL:[NSURL fileURLWithPath:path] settings:recordSetting error:&error];

    录音过程不赘述直接调用方法:

    /// 开始录音
    /**
     开始录音
    
     @param name 文件名
     */
    - (void)recordBeginWithName:(NSString *)name;

    录音时间回调:

    [ZYRecordTool sharedZYRecordTool].durationTimeBlock = ^(id time) {
                        self.time = [time intValue];
             };

    2、使用lame将caf转换成mp3格式,方便多端统一

    #pragma mark - 转换mp3
    - (void)transformCAFToMP3 {
        NSString *name = [NSString stringWithFormat:@"%@.mp3", fileName];
        mp3FilePath = [NSURL URLWithString:[NSTemporaryDirectory() stringByAppendingString:name]];
    
    
        @try {
            int read, write;
    
            FILE *pcm = fopen([[recordUrl absoluteString] cStringUsingEncoding:1], "rb");   //source 被转换的音频文件位置
            fseek(pcm, 4*1024, SEEK_CUR);                                                   //skip file header
            FILE *mp3 = fopen([[mp3FilePath absoluteString] cStringUsingEncoding:1], "wb"); //output 输出生成的Mp3文件位置
    
            const int PCM_SIZE = 8192;
            const int MP3_SIZE = 8192;
            short int pcm_buffer[PCM_SIZE*2];
            unsigned char mp3_buffer[MP3_SIZE];
    
            lame_t lame = lame_init();
            lame_set_in_samplerate(lame, 11025.0);
            lame_set_VBR(lame, vbr_default);
            lame_init_params(lame);
    
            do {
                read = fread(pcm_buffer, 2*sizeof(short int), PCM_SIZE, pcm);
                if (read == 0)
                    write = lame_encode_flush(lame, mp3_buffer, MP3_SIZE);
                else
                    write = lame_encode_buffer_interleaved(lame, pcm_buffer, read, mp3_buffer, MP3_SIZE);
    
                fwrite(mp3_buffer, write, 1, mp3);
    
            } while (read != 0);
    
            lame_close(lame);
            fclose(mp3);
            fclose(pcm);
        }
        @catch (NSException *exception) {
            NSLog(@"%@",[exception description]);
        }
        @finally {
            audioFileSavePath = mp3FilePath;
            NSLog(@"MP3生成成功: %@",audioFileSavePath);
        }
    }

    3、距离感应+播放

    近距离改用听筒播放,并且熄灭屏幕。一般情况使用扬声器播放,屏幕不改变。
    播放相关不赘述,设置距离感应:

    //设置距离感应开启
         [[UIDevice currentDevice] setProximityMonitoringEnabled:YES];
        //    监听距离
        if ([UIDevice currentDevice].proximityMonitoringEnabled == YES) {
    
            [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sensorStateChange:)name:UIDeviceProximityStateDidChangeNotification object:nil];
    
        }
        //扬声器播放
        [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];

    通知监听事件:

    #pragma mark - 处理监听 距离感应
    -(void)sensorStateChange:(NSNotificationCenter *)notification;
    
    {
    
        //如果此时手机靠近面部放在耳朵旁,那么声音将通过听筒输出,并将屏幕变暗
        if ([[UIDevice currentDevice] proximityState] == YES){
    
            NSLog(@"Device is close to user");
            [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
    
        }else{
    
            NSLog(@"Device is not close to user");
            [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
        }
    
    }
    

    播放结束,或者终止播放一定记住要移除监听器,关闭距离感应:

        [[NSNotificationCenter defaultCenter] removeObserver:self name:UIDeviceProximityStateDidChangeNotification object:nil];
         [[UIDevice currentDevice] setProximityMonitoringEnabled:NO];
    

    demo:https://github.com/MrCoderDing/AudioRecoderAndTransformMP3

    展开全文
  • 很多人认为,电脑录制的文件是不能转换格式,其实并不是这样的,电脑录制的音频文件转换为MP3格式大家是可以借助工具完成,如今市面上出现了很多的音频转换工具,它可以把音频的格式进行不同的变化但是大家却不知道...
  • 这是MP3录制和显示声音波形的一个故事。
  • 不得不说,前端技术发展真是日新月异,有人实现了js版本的lame编码器,可以直接在浏览器端录制MP3音频。 lamejs介绍 最初有个开源项目libmp3lame-js,直接将 lame 源码编译为 js版本,后来有人基于libmp...
  • MediaRecorder录制音频文件

    千次阅读 2017-06-08 23:57:20
    MediaRecorder录制音频文件使用手机麦克风硬件和Android系统MediaRecorder类实现。步骤: 在activity_main文件上添加两个按钮,分别为开始按钮和停止按钮。 //获取按钮 record = (Button)findViewById(R.id.record)...
  • Android手机一般都提供麦克风的硬件,而Android系统可以利用该硬件来录制音频。 为了在Android应用中录制音频,Android提供了MediaRecorder类,使用MediaRecorder录制音频的过程很简单,步骤如下: 1:创建...
  • 电脑录音软件怎么?现在提到录音软件可能很多小伙伴第一时间想到的都是手机录音,因为大家都习惯了使用手机使得电脑录音软件不断被忽略。接下来小编就带领大家重新回到电脑录音软件,教你通过电脑录制高质量的音频...
  • 续上篇本人写的H5录制音频demo,加上一些在...H5录制的wav音频(因为wav可以兼容大部分浏览器且安卓不支持MP3,所以wav)在网页不支持播放 原因分析:可能是因为H5录制的wav格式音频编码不是很正确,audio标签识...
  • 是最常见的一种音频格式,很早由于只能手机还未普及,流行的MP3是很多人业余必备的一种娱乐设备,至今MP3格式音频依然很常见,并没有因为时代在发展而淘汰,其实最常见的还有WAV格式,音质更加接近无损,但是...
  • 最简单的大家应该都使用过,就是我们手机或者电脑自带的录音软件,这些起来很简单,但是一般功能都比较单一,无法满足我们的需求,如果我们想录制电脑系统发出的声音该怎么办呢?那内录音频工具哪个好,怎么录制...
  • 【实例简介】后端为 asp.net【实例截图】【核心代码】Html5网页JavaScript录制MP3音频Html5网页JavaScript录制MP3音频录制停止上传调试信息:var recorder = new MP3Recorder({debug:true,funOk: function () {...
  • Android手机一般都提供麦克风的硬件,而Android系统可以利用该硬件来录制音频。 为了在Android应用中录制音频,Android提供了MediaRecorder类,使用MediaRecorder录制音频的过程很简单,步骤如下: Step1:创建...
  • Android 开发 ... MediaRecorder类是Android sdk提供的一个专门用于音视频录制,一般利用手机麦克风采集音频和摄像头采集图像.这个类是属于简单的音频录制类,录制音频简单容易但是对音频流的控制也比较...
  • 有时候我们下载到手机本地之后,就是mp3模式的,那么我们如果想导出去,应该如何操作呢,有很多朋友应该是感到非常困惑的,接下来就为大家介绍一下,应该如何快速一键将喜马拉雅的音频文件导出。我们如果已经下载了...
  • AudioRecord录制音频文件并存储本地

    千次阅读 2016-09-12 17:09:25
    // NewAudioName可播放的音频文件 private static final String NewAudioName = "/sdcard/new.wav"; 这是初始化的一些数据。 isRecord = true; new Thread(new AudioRecordThread()).start(); ...
  • 生活中我们除了喜欢用手机拍照外,用手机进行录音也是一件必不可少的喜好,录音的内容五花八门,这无疑也是从另一方面更为形象的记录了当时的场景。可像手机照片误删恢复一样,在使用手机的时候,也很容易出现误删...
  • 在iOS或Android中录制音频的React Native应用程序
  • 手机音频》参数与选择

    千次阅读 2019-08-21 09:56:21
    一、手机音频:智能手机音频处理电路主要处理手机的声音信号。它主要负责接收和发射音频信号,是实现手机音频交互的关键电路。智能手机音频处理电路主要包括:音频信号处理芯片、音频功率放大器、耳机信号放大器、...
  • 尤其是在追剧的时候,听到有趣的声音或者经典的语句总想录制下来,但是碍于手机无法在线录制,通过手机录制电脑上的声音又有杂音等等一系列的问题,那如何将倾城时光录制成MP3格式呢? 1、首先手机目前是无法实现...
  • 音频录制是不管生活还是...1、首先我们要明白的是录制屏幕声音,即系统内部声音,像平时手机中使用的录音机只能录制手机以外的其他声音,录制屏幕声音需要在电脑上进行; 2、在电脑上运行一个音频录制工具——迅...
  • Android录制mp3格式

    千次阅读 2016-01-27 11:55:21
    前言最近做一个即时通信类的项目...工具MP3格式是一个开源项目转的,[MP3lame](http://lame.sourceforge.net/),由于该项目用到了jni,所以需要大家配置好ndk环境,环境配置在此就不多说了,大家可以自行百度,最新的

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,690
精华内容 2,676
关键字:

如何用手机录音频mp3