A20安卓系统采用AudioRecord类和tinycap录音有噪声怎么解决 2C

我使用的美睿视讯蜂鸟A20开发板,SDK版本为a20_hummingbird_v3.0_v4,使用方案为wing-k70,在安卓系统下采用AndioRecord类和tinycap录音都有很大的噪声(采用tinycap录音需要稍微修改tinyalsa库,下面有修改后的tinyalsa库及tinycap,以及录音的样本),有谁知道问题出在哪里吗?非常感谢指导。另外采用tinycap在linux系统下录音没有噪声(蜂鸟A20开发板美睿视讯有提供Linux系统SDK)。蜂鸟A20开发板
录音参数采样字节序录音波形
好像不能添加附件,如果需要修改后的tinyalsa库和tinycap找我。小弟感激不尽,这问题困扰我很久了!!!!

1个回答

上面有张图搞错了录音波形图如下图片说明

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
AudioRecord录音 保存的数据值都为0
同一套安卓代码,换个设备后,打印buffer里保存的数据值都为0,播放没有声音,请问怎么解决?(跟声道个数应该没关系吧?) short[] buffer = new short[recBufSize]; while (isRecording) { readsize = audioRecord.read(buffer, 0, recBufSize); synchronized (inBuf) { for (int i = 0; i < readsize; i += rateX) { inBuf.add(buffer[i]); } } ... }
使用AudioRecord在安卓设备上开发录音功能
有两个程序用AudioRecord实现录音功能,两个不能能同时开同时录音,但是现在需要实现两个apk同时开的时候可以正常使用,请各位大神指教,有什么解决方法木有?
android中使用AudioRecord实现录音
要求:需要实现一直录音,保存的时候需要分段保存 个人想法:先把录制的数据放在缓存中,当缓存数据达到一定的大小就保存在文件中。 本人代码实现不了,希望得到帮忙一下!谢谢了
求救!!!!!Android 使用AudioRecord录音不正常
package com.example.testmediarecorder; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import android.app.Activity; import android.graphics.PixelFormat; import android.media.AudioFormat; import android.media.AudioRecord; import android.media.MediaRecorder; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.view.Window; import android.view.WindowManager; import android.widget.Button; public class MainActivity extends Activity { // 音频获取源 private int audioSource = MediaRecorder.AudioSource.MIC; // 设置音频采样率,44100是目前的标准,但是某些设备仍然支持22050,16000,11025 private static int sampleRateInHz = 44100; // 设置音频的录制的声道CHANNEL_IN_STEREO为双声道,CHANNEL_CONFIGURATION_MONO为单声道 private static int channelConfig2 = AudioFormat.CHANNEL_CONFIGURATION_MONO; private static int channelConfig = AudioFormat.CHANNEL_IN_STEREO; // 音频数据格式:PCM 16位每个样本。保证设备支持。PCM 8位每个样本。不一定能得到设备支持。 private static int audioFormat = AudioFormat.ENCODING_PCM_16BIT; // 缓冲区字节大小 private int bufferSizeInBytes = 0; private Button Start; private Button Stop; private AudioRecord audioRecord; private boolean isRecord = false;// 设置正在录制的状态 //AudioName裸音频数据文件 private static final String AudioName = "mnt/sdcard/love.raw"; //NewAudioName可播放的音频文件 private static final String NewAudioName = "mnt/sdcard/new.wav"; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().setFormat(PixelFormat.TRANSLUCENT);// 让界面横屏 requestWindowFeature(Window.FEATURE_NO_TITLE);// 去掉界面标题 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); // 重新设置界面大小 setContentView(R.layout.activity_main); init(); } private void init() { Start = (Button) this.findViewById(R.id.start); Stop = (Button) this.findViewById(R.id.stop); Start.setOnClickListener(new TestAudioListener()); Stop.setOnClickListener(new TestAudioListener()); creatAudioRecord(); } private void creatAudioRecord() { // 获得缓冲区字节大小 bufferSizeInBytes = AudioRecord.getMinBufferSize(sampleRateInHz, channelConfig, audioFormat); // 创建AudioRecord对象 audioRecord = new AudioRecord(audioSource, sampleRateInHz, channelConfig, audioFormat, bufferSizeInBytes); } class TestAudioListener implements OnClickListener { @Override public void onClick(View v) { if (v == Start) { startRecord(); } if (v == Stop) { stopRecord(); } } } private void startRecord() { audioRecord.startRecording(); // 让录制状态为true isRecord = true; // 开启音频文件写入线程 new Thread(new AudioRecordThread()).start(); } private void stopRecord() { close(); } private void close() { if (audioRecord != null) { System.out.println("stopRecord"); isRecord = false;//停止文件写入 audioRecord.stop(); audioRecord.release();//释放资源 audioRecord = null; } } class AudioRecordThread implements Runnable { @Override public void run() { writeDateTOFile();//往文件中写入裸数据 copyWaveFile(AudioName, NewAudioName);//给裸数据加上头文件 } } /** * 这里将数据写入文件,但是并不能播放,因为AudioRecord获得的音频是原始的裸音频, * 如果需要播放就必须加入一些格式或者编码的头信息。但是这样的好处就是你可以对音频的 裸数据进行处理,比如你要做一个爱说话的TOM * 猫在这里就进行音频的处理,然后重新封装 所以说这样得到的音频比较容易做一些音频的处理。 */ private void writeDateTOFile() { // new一个byte数组用来存一些字节数据,大小为缓冲区大小 byte[] audiodata = new byte[bufferSizeInBytes]; FileOutputStream fos = null; int readsize = 0; try { File file = new File(AudioName); if (file.exists()) { file.delete(); } fos = new FileOutputStream(file);// 建立一个可存取字节的文件 } catch (Exception e) { e.printStackTrace(); } while (isRecord == true) { readsize = audioRecord.read(audiodata, 0, bufferSizeInBytes); if (AudioRecord.ERROR_INVALID_OPERATION != readsize) { try { fos.write(audiodata); } catch (IOException e) { e.printStackTrace(); } } } try { fos.close();// 关闭写入流 } catch (IOException e) { e.printStackTrace(); } } // 这里得到可播放的音频文件 private void copyWaveFile(String inFilename, String outFilename) { FileInputStream in = null; FileOutputStream out = null; long totalAudioLen = 0; long totalDataLen = totalAudioLen + 36; long longSampleRate = sampleRateInHz; int channels = 2; long byteRate = 16 * sampleRateInHz * channels / 8; byte[] data = new byte[bufferSizeInBytes]; try { in = new FileInputStream(inFilename); out = new FileOutputStream(outFilename); totalAudioLen = in.getChannel().size(); totalDataLen = totalAudioLen + 36; WriteWaveFileHeader(out, totalAudioLen, totalDataLen, longSampleRate, channels, byteRate); while (in.read(data) != -1) { out.write(data); } in.close(); out.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /** * 这里提供一个头信息。插入这些信息就可以得到可以播放的文件。 * 为我为啥插入这44个字节,这个还真没深入研究,不过你随便打开一个wav * 音频的文件,可以发现前面的头文件可以说基本一样哦。每种格式的文件都有 * 自己特有的头文件。 */ private void WriteWaveFileHeader(FileOutputStream out, long totalAudioLen, long totalDataLen, long longSampleRate, int channels, long byteRate) throws IOException { byte[] header = new byte[44]; header[0] = 'R'; // RIFF/WAVE header header[1] = 'I'; header[2] = 'F'; header[3] = 'F'; header[4] = (byte) (totalDataLen & 0xff); header[5] = (byte) ((totalDataLen >> 8) & 0xff); header[6] = (byte) ((totalDataLen >> 16) & 0xff); header[7] = (byte) ((totalDataLen >> 24) & 0xff); header[8] = 'W'; header[9] = 'A'; header[10] = 'V'; header[11] = 'E'; header[12] = 'f'; // 'fmt ' chunk header[13] = 'm'; header[14] = 't'; header[15] = ' '; header[16] = 16; // 4 bytes: size of 'fmt ' chunk header[17] = 0; header[18] = 0; header[19] = 0; header[20] = 1; // format = 1 header[21] = 0; header[22] = (byte) channels; header[23] = 0; header[24] = (byte) (longSampleRate & 0xff); header[25] = (byte) ((longSampleRate >> 8) & 0xff); header[26] = (byte) ((longSampleRate >> 16) & 0xff); header[27] = (byte) ((longSampleRate >> 24) & 0xff); header[28] = (byte) (byteRate & 0xff); header[29] = (byte) ((byteRate >> 8) & 0xff); header[30] = (byte) ((byteRate >> 16) & 0xff); header[31] = (byte) ((byteRate >> 24) & 0xff); header[32] = (byte) (2 * 16 / 8); // block align header[33] = 0; header[34] = 16; // bits per sample header[35] = 0; header[36] = 'd'; header[37] = 'a'; header[38] = 't'; header[39] = 'a'; header[40] = (byte) (totalAudioLen & 0xff); header[41] = (byte) ((totalAudioLen >> 8) & 0xff); header[42] = (byte) ((totalAudioLen >> 16) & 0xff); header[43] = (byte) ((totalAudioLen >> 24) & 0xff); out.write(header, 0, 44); } @Override protected void onDestroy() { close(); super.onDestroy(); } } ``` ``` 代码是我在网上找到的 发现录制后的文件如果使用的是单声道声音就会变音,而是用双声道就正常 有大神能告诉下我为什么会这样吗?在线等待中。。。。。
android audioRecord没释放下次再使用怎么办
andioRecord正在进行录音操作,此时app被系统回收,导致没有机会释放audioRecord。 下次使用audioRecord进行录音时,初始化就直接失败了,请问谁有解决方案?(系统回收app无法控制,没有找到很好的点在app被回收之前对audioRecord进行释放).谢谢
ios中有类似android audioTrack和audioRecord的类吗?
有一段代码是android的,公司需要把这段代码转换成ios的,就卡在这儿了
android AudioRecord 如何录制 8 bit PCM
如题,AudioRecord初始化的参数只能用AudioFormat.ENCODING_PCM_16BIT,如果不是这个就抛出异常了,有没有人做过录制 8 bit PCM的。
Android:使用 AudioRecord 采集音频PCM并保存到Treemap中,但播放出现异常
最近在实现一个功能,做游戏客户端的音频采集,播放的。想调用AudioRecord获取PCM并用treemap保存。并用AudioTrack的stream模式尝试播放,但是在播放时却全是噪音。已尝试搜索过问题的解决方法,但都是用文件流的方式,上头要求不要创建文件。代码如下: ``` public class testRecorder{ private static final String TAG = "jqd"; private boolean isRecording; private AudioRecord audioRecord; private AudioTrack audioTrack; private TreeMap<Integer,byte[]> map; private String keyList = ""; //treeMap<Int,byte[]> 帧的内存载体实例 TODO //开始录音 public void startRecord() { final int minBufferSize = AudioRecord.getMinBufferSize(SAMPLE_RATE_INHZ, CHANNEL_CONFIG, AUDIO_FORMAT); audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, SAMPLE_RATE_INHZ, CHANNEL_CONFIG, AUDIO_FORMAT, minBufferSize); final byte data[] = new byte[minBufferSize]; map = new TreeMap<Integer, byte[]>(); audioRecord.startRecording(); isRecording = true; new Thread(new Runnable() { @Override public void run() { int key = 0; while (isRecording) { key += 1; int read = audioRecord.read(data, 0, minBufferSize); // 如果读取音频数据没有出现错误,就将数据写入到treeMap if (AudioRecord.ERROR_INVALID_OPERATION != read) map.put(key,data); } } }).start(); } //停止录音 public void stopRecord() { isRecording = false; // 释放资源 if (null != audioRecord) { audioRecord.stop(); audioRecord.release(); audioRecord = null; } } //获取序列化数据 TODO public String getRecordData() { return null; } /** * 播放,使用stream模式 */ public void playInModeStream() { /* * SAMPLE_RATE_INHZ 对应pcm音频的采样率 * channelConfig 对应pcm音频的声道 * AUDIO_FORMAT 对应pcm音频的格式 * */ int channelConfig = AudioFormat.CHANNEL_OUT_MONO; final int minBufferSize = AudioTrack.getMinBufferSize(SAMPLE_RATE_INHZ, channelConfig, AUDIO_FORMAT); audioTrack = new AudioTrack( new AudioAttributes.Builder() .setUsage(AudioAttributes.USAGE_MEDIA) .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) .build(), new AudioFormat.Builder().setSampleRate(SAMPLE_RATE_INHZ) .setEncoding(AUDIO_FORMAT) .setChannelMask(channelConfig) .build(), minBufferSize, AudioTrack.MODE_STREAM, AudioManager.AUDIO_SESSION_ID_GENERATE); audioTrack.play(); new Thread(new Runnable() { @Override public void run() { byte[] tempBuffer = new byte[minBufferSize]; Iterator iter = map.keySet().iterator(); int key = NULL; while (iter.hasNext()) { key = (Integer) iter.next(); keyList = keyList + key; tempBuffer = map.get(key); audioTrack.write(tempBuffer, 0, tempBuffer.length); } } }).start(); } } ```
AudioRecord无法无法获取音频源Could not get audio input for record source
如题,在使用AudioRecord录制音频时报错 08-01 10:35:17.734 9009-9009/com.example.myvoice E/AudioRecord: Could not get audio input for record source 8, sample rate 44100, format 0x1, channel mask 0xc, session 598, flags 0 08-01 10:35:17.734 9009-9009/com.example.myvoice E/AudioRecord-JNI: Error creating AudioRecord instance: initialization check failed with status -22. 08-01 10:35:17.735 9009-9009/com.example.myvoice E/android.media.AudioRecord: Error code -20 when initializing native AudioRecord object. 网上找了很久都没找到解决办法,完整代码参考了https://blog.csdn.net/jinzhuojun/article/details/33748031 权限设置如下 <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myvoice" android:versionCode="1" android:versionName="1.0"> <uses-permission android:name="android.permission.CAPTURE_AUDIO_OUTPUT" /> <uses-permission android:name="android.permission.CAPTURE_VIDEO_OUTPUT"/> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-sdk android:minSdkVersion="19" android:targetSdkVersion="19" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> ``` 前两个权限设置会报错Permissions with the protection level signature, privileged or signatureOrSystem are only granted to system apps. If an app is a regular non-system app, it will never be able to use these permissions. 希望各位大神可以帮小白解决问题
新手关于安卓录音问题
安卓AudioRecord()创建时提示用户开启权限,用户拒绝程序就挂了,怎么解决??
【求助】Android录音时如何屏蔽本机正在播放的声音?
使用AudioRecord录音,录音的时候,APP也会播放一个提示音,这个提示音如何屏蔽?
Android录音文件和下载的音频合成
使用的是AudioRecord进行录音,然后想把录音之后的音频跟下载过来的音频合成一个文件,类似加一个音频头或者尾。 试了直接用流进行简单的拼接,但是不能播放,有没有大神可以指导一下的,快急死了。。
如何通过原始的PCM文件,计算出音频播出时长
安卓内使用AudioRecord录音保存后得到PCM格式的文件,如何得到该文件的播放时长?
android 如何实现通话录音时将己方和对方的声音分别录制为两个pcm?
如题,需要在将通话双方的声音录制为两个文件。 想法 1:由于 audiorecord 只能有一个实例,如果想开两个 audiorecord 会报错。那么我们修改源码让系统支持多个 audiorecord 实例,问题是如何修改? 想法 2:录音时将己方设置为左声道,对方设置为右声道,然后分离左右声道数据为两个 pcm 文件。将左右声道分离方法网上很多,问题是如何在录音时将己方设置为左声道,将对方设置为右声道? 想法 3:没想到~~~请问各位有什么高招?
安卓两个录音线程冲突的问题?
安卓两个录音线程冲突的问题:我在做一个音频制作的安卓项目,用到了一个第三方JNI库。有一个活动里我想在按下一个按钮时,同时开始录音(用AudioRecord)和用麦克风检测外界声音的频率(开启JNI,然后process不停调用JNI里的一个检测函数)。 但很明显发生了冲突,如果是前者先开始录音,后者检测不到东西,用来存储检测到的数值的arraylist的是空的;如果后者先开始不停检测,前者录不到任何声音,只能得到一个空的的wav文件。很明显他们两个的数据源都是MediaRecorder.AudioSource.MIC。 因为JNI方法是无法改变的,一定是用麦克风当数据源,所以只能改我的录音机来让他们两个都能检测到声音。 【因为像全民K歌、唱吧、酷狗等软件,都有检测用户声音的频率对其进行打分的功能,而且同时进行了录音线程,没有发生任何冲突,我就感觉很不解! 我不相信他们是对录音得到的pcm切片进行分析得到的检测频率,因为这会有极大的延迟。】 【有一个同事说了他的思路。像任何安卓手机在打电话时,它的通话线程是一定要占用MIC的,而且无法改动。他提到了手机内录(打电话的时候同步录音)软件的开发,先打开那个软件,让软件得到.AudioSource.MIC,但软件保存录音后又会做一个数据输出口。再进行通话时,通话的线程用的AudioSource.MIC是假的,是内录软件的输出,蒙骗了通话线程,这样就实现了同步录音和通话。不知道这个软件之间的蒙骗,能不能做在我们自己的软件内部,就是把我的“录音机”做成“内录软件”】 急需解答!!
Android Studio虚拟机无法运行APP
2019-04-11 19:06:38.604 1881-5714/? E/AudioFlinger: createRecordTrack_l() initCheck failed -12; no control block? 2019-04-11 19:06:38.606 5719-7476/com.google.android.googlequicksearchbox:search E/IAudioFlinger: createRecord returned error -12 2019-04-11 19:06:38.607 5719-7476/com.google.android.googlequicksearchbox:search E/AudioRecord: AudioFlinger could not create record track, status: -12 2019-04-11 19:06:38.607 5719-7476/com.google.android.googlequicksearchbox:search E/AudioRecord-JNI: Error creating AudioRecord instance: initialization check failed with status -12. 2019-04-11 19:06:38.608 5719-7476/com.google.android.googlequicksearchbox:search E/android.media.AudioRecord: Error code -20 when initializing native AudioRecord object. Android Studio上面虚拟机无法运行APP,一直显示keep stopping。这是什么原因?
安卓的录音程序,运行时闪退求解
按照教程写了个安卓的录音程序,在点击结束录音时闪退,求大神帮看看代码,感谢 闪退时报错日志 04-08 19:47:29.702: D/ViewRootImpl(11731): ViewPostImeInputStage processPointer 0 04-08 19:47:29.802: D/ViewRootImpl(11731): ViewPostImeInputStage processPointer 1 04-08 19:47:29.802: E/MediaRecorder(11731): stop called in an invalid state: 4 04-08 19:47:29.802: D/AndroidRuntime(11731): Shutting down VM 04-08 19:47:29.802: E/AndroidRuntime(11731): FATAL EXCEPTION: main 04-08 19:47:29.802: E/AndroidRuntime(11731): Process: com.example.recorder, PID: 11731 04-08 19:47:29.802: E/AndroidRuntime(11731): java.lang.IllegalStateException 04-08 19:47:29.802: E/AndroidRuntime(11731): at android.media.MediaRecorder._stop(Native Method) 04-08 19:47:29.802: E/AndroidRuntime(11731): at android.media.MediaRecorder.stop(MediaRecorder.java:976) 04-08 19:47:29.802: E/AndroidRuntime(11731): at com.example.recorder.MainActivity.stop(MainActivity.java:102) 04-08 19:47:29.802: E/AndroidRuntime(11731): at com.example.recorder.MainActivity$2.onClick(MainActivity.java:61) 04-08 19:47:29.802: E/AndroidRuntime(11731): at android.view.View.performClick(View.java:5698) 04-08 19:47:29.802: E/AndroidRuntime(11731): at android.widget.TextView.performClick(TextView.java:10896) 04-08 19:47:29.802: E/AndroidRuntime(11731): at android.view.View$PerformClick.run(View.java:22565) 04-08 19:47:29.802: E/AndroidRuntime(11731): at android.os.Handler.handleCallback(Handler.java:739) 04-08 19:47:29.802: E/AndroidRuntime(11731): at android.os.Handler.dispatchMessage(Handler.java:95) 04-08 19:47:29.802: E/AndroidRuntime(11731): at android.os.Looper.loop(Looper.java:148) 04-08 19:47:29.802: E/AndroidRuntime(11731): at android.app.ActivityThread.main(ActivityThread.java:7224) 04-08 19:47:29.802: E/AndroidRuntime(11731): at java.lang.reflect.Method.invoke(Native Method) 04-08 19:47:29.802: E/AndroidRuntime(11731): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 04-08 19:47:29.802: E/AndroidRuntime(11731): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 04-08 19:47:32.042: I/Process(11731): Sending signal. PID: 11731 SIG: 9 DEBUG 线程 [main](已暂挂(异常 IllegalStateException)) MediaRecorder._stop() 行: 不可用 [本机方法] MediaRecorder.stop() 行: 976 MainActivity.stop() 行: 102 MainActivity$2.onClick(View) 行: 61 Button(View).performClick() 行: 5698 Button(TextView).performClick() 行: 10896 View$PerformClick.run() 行: 22565 Handler.handleCallback(Message) 行: 739 ViewRootImpl$ViewRootHandler(Handler).dispatchMessage(Message) 行: 95 Looper.loop() 行: 148 ActivityThread.main(String[]) 行: 7224 Method.invoke(Object, Object...) 行: 不可用 [本机方法] ZygoteInit$MethodAndArgsCaller.run() 行: 1230 ZygoteInit.main(String[]) 行: 1120 主程序 package com.example.recorder; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import java.io.IOException; import android.media.MediaRecorder; import android.media.AudioFormat; import android.media.AudioRecord; import android.os.Bundle; import android.os.Environment; import android.app.Activity; import android.util.Log; import android.widget.Button; import java.io.BufferedOutputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStream; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; public class MainActivity extends Activity { MediaRecorder audioRecorder; Button START; Button END; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //creat START=(Button)findViewById(R.id.start); END=(Button)findViewById(R.id.end); START.setOnClickListener(new View.OnClickListener() { public void onClick(View arg0) { record(); } }); END.setOnClickListener(new View.OnClickListener() { public void onClick(View arg0) { stop(); } }); } public void record() { if(audioRecorder==null) { audioRecorder=new MediaRecorder(); } String path=Environment.getExternalStorageDirectory().getAbsolutePath()+"/test.mp4"; File file=new File(path); if(file.exists()) file.delete(); try { file.createNewFile(); audioRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); audioRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); audioRecorder.setAudioEncodingBitRate(MediaRecorder.AudioEncoder.AMR_NB); audioRecorder.setOutputFile(path); audioRecorder.prepare(); audioRecorder.start(); } catch(IOException e) { e.printStackTrace(); } catch (IllegalStateException e) { e.printStackTrace(); } START.setText("recording"); } public void stop() { if(audioRecorder!=null) { audioRecorder.stop(); audioRecorder.release(); audioRecorder=null; } START.setText("录音"); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } } MANIFEXT: <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.recorder" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="19" android:targetSdkVersion="19" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
Android PCM进行G711编码
如题:鄙人使用Android API AudioRecord录音得到PCM,需求是G.711编码 上网找了很多资料都没找到,找到个相关的录音出来只有哒哒声,使用了http://blog.csdn.net/cazicaquw/article/details/7333186 项目中的G711.JAVA,播放也是哒哒声,求大神赐教!谢谢
Android :AudioTrack 播放音频的时候出现错误
想实现udp实时语音通话,一端AudioRecord一边录制一边通过udp发送给另一端,另一端接收以后通过AudioTrack播放,可是有时候播放的时候程序突然崩溃,出现如下错误: A/AudioTrackShared: Assertion failed: !(stepCount <= mUnreleased && mUnreleased <= mFrameCount) A/libc: Fatal signal 6 (SIGABRT), code -6 in tid 26250 (RxCachedThreadS) 我有两部android设备,一部android7.0,一部android4.4,目前只在7.0的设备上频繁出现此问题
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
将代码部署服务器,每日早上定时获取到天气数据,并发送到邮箱。 也可以说是一个小人工智障。 思路可以运用在不同地方,主要介绍的是思路。
Linux(服务器编程):15---两种高效的事件处理模式(reactor模式、proactor模式)
前言 同步I/O模型通常用于实现Reactor模式 异步I/O模型则用于实现Proactor模式 最后我们会使用同步I/O方式模拟出Proactor模式 一、Reactor模式 Reactor模式特点 它要求主线程(I/O处理单元)只负责监听文件描述符上是否有事件发生,有的话就立即将时间通知工作线程(逻辑单元)。除此之外,主线程不做任何其他实质性的工作 读写数据,接受新的连接,以及处...
为什么要学数据结构?
一、前言 在可视化化程序设计的今天,借助于集成开发环境可以很快地生成程序,程序设计不再是计算机专业人员的专利。很多人认为,只要掌握几种开发工具就可以成为编程高手,其实,这是一种误解。要想成为一个专业的开发人员,至少需要以下三个条件: 1) 能够熟练地选择和设计各种数据结构和算法 2) 至少要能够熟练地掌握一门程序设计语言 3) 熟知所涉及的相关应用领域的知识 其中,后两个条件比较容易实现,而第一个...
C语言魔塔游戏
很早就很想写这个,今天终于写完了。 游戏截图: 编译环境: VS2017 游戏需要一些图片,如果有想要的或者对游戏有什么看法的可以加我的QQ 2985486630 讨论,如果暂时没有回应,可以在博客下方留言,到时候我会看到。 下面我来介绍一下游戏的主要功能和实现方式 首先是玩家的定义,使用结构体,这个名字是可以自己改变的 struct gamerole { char n
进程通信方式总结与盘点
​ 进程通信是指进程之间的信息交换。这里需要和进程同步做一下区分,进程同步控制多个进程按一定顺序执行,进程通信是一种手段,而进程同步是目标。从某方面来讲,进程通信可以解决进程同步问题。 ​ 首先回顾下我们前面博文中讲到的信号量机制,为了实现进程的互斥与同步,需要在进程间交换一定的信息,因此信号量机制也可以被归为进程通信的一种方式,但是也被称为低级进程通信,主要原因为: 效率低:一次只可操作少量的...
究竟你适不适合买Mac?
我清晰的记得,刚买的macbook pro回到家,开机后第一件事情,就是上了淘宝网,花了500元钱,找了一个上门维修电脑的师傅,上门给我装了一个windows系统。。。。。。 表砍我。。。 当时买mac的初衷,只是想要个固态硬盘的笔记本,用来运行一些复杂的扑克软件。而看了当时所有的SSD笔记本后,最终决定,还是买个好(xiong)看(da)的。 已经有好几个朋友问我mba怎么样了,所以今天尽量客观
听说了吗?阿里双11作战室竟1根网线都没有
双11不光是购物狂欢节,更是对技术的一次“大考”,对于阿里巴巴企业内部运营的基础保障技术而言,亦是如此。 回溯双11历史,这背后也经历过“小米加步枪”的阶段:作战室从随处是网线,交换机放地上的“一地狼藉”;到如今媲美5G的wifi网速,到现场却看不到一根网线;从当年使用商用AP(无线路由器),让光明顶双11当天断网一分钟,到全部使用阿里自研AP……阿里巴巴企业智能事业部工程师们提供的基础保障...
在阿里,40岁的奋斗姿势
在阿里,40岁的奋斗姿势 在阿里,什么样的年纪可以称为老呢?35岁? 在云网络,有这样一群人,他们的平均年龄接近40,却刚刚开辟职业生涯的第二战场。 他们的奋斗姿势是什么样的呢? 洛神赋 “翩若惊鸿,婉若游龙。荣曜秋菊,华茂春松。髣髴兮若轻云之蔽月,飘飖兮若流风之回雪。远而望之,皎若太阳升朝霞;迫而察之,灼若芙蕖出渌波。” 爱洛神,爱阿里云 2018年,阿里云网络产品部门启动洛神2.0升...
关于研发效能提升的思考
研发效能提升是最近比较热门的一个话题,本人根据这几年的工作心得,做了一些思考总结,由于个人深度有限,暂且抛转引入。 三要素 任何生产力的提升都离不开这三个因素:人、流程和工具,少了其中任何一个因素都无法实现。 人,即思想,也就是古人说的“道”,道不同不相为谋,是制高点,也是高层建筑的基石。 流程,即方法,也是古人说的“法”。研发效能的提升,也就是要提高投入产出比,既要增加产出,也要减...
Python爬虫爬取淘宝,京东商品信息
小编是一个理科生,不善长说一些废话。简单介绍下原理然后直接上代码。 使用的工具(Python+pycharm2019.3+selenium+xpath+chromedriver)其中要使用pycharm也可以私聊我selenium是一个框架可以通过pip下载 pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple/ 
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
Java工作4年来应聘要16K最后没要,细节如下。。。
前奏: 今天2B哥和大家分享一位前几天面试的一位应聘者,工作4年26岁,统招本科。 以下就是他的简历和面试情况。 基本情况: 专业技能: 1、&nbsp;熟悉Sping了解SpringMVC、SpringBoot、Mybatis等框架、了解SpringCloud微服务 2、&nbsp;熟悉常用项目管理工具:SVN、GIT、MAVEN、Jenkins 3、&nbsp;熟悉Nginx、tomca
2020年,冯唐49岁:我给20、30岁IT职场年轻人的建议
点击“技术领导力”关注∆  每天早上8:30推送 作者| Mr.K   编辑| Emma 来源| 技术领导力(ID:jishulingdaoli) 前天的推文《冯唐:职场人35岁以后,方法论比经验重要》,收到了不少读者的反馈,觉得挺受启发。其实,冯唐写了不少关于职场方面的文章,都挺不错的。可惜大家只记住了“春风十里不如你”、“如何避免成为油腻腻的中年人”等不那么正经的文章。 本文整理了冯
程序员该看的几部电影
##1、骇客帝国(1999) 概念:在线/离线,递归,循环,矩阵等 剧情简介: 不久的将来,网络黑客尼奥对这个看似正常的现实世界产生了怀疑。 他结识了黑客崔妮蒂,并见到了黑客组织的首领墨菲斯。 墨菲斯告诉他,现实世界其实是由一个名叫“母体”的计算机人工智能系统控制,人们就像他们饲养的动物,没有自由和思想,而尼奥就是能够拯救人类的救世主。 可是,救赎之路从来都不会一帆风顺,到底哪里才是真实的世界?
入职阿里5年,他如何破解“技术债”?
简介: 作者 | 都铎 作为一名技术人,你常常会听到这样的话: “先快速上线” “没时间改” “再缓一缓吧” “以后再解决” “先用临时方案处理” …… 当你埋下的坑越来越多,不知道哪天哪位同学就会踩上一颗雷。特别赞同“人最大的恐惧就是未知,当技术债可说不可见的时候,才是最让人不想解决的时候。” 作为一个程序员,我们反对复制粘贴,但是我们经常会见到相似的代码,相同的二方包,甚至整个代码...
Python绘图,圣诞树,花,爱心 | Turtle篇
每周每日,分享Python实战代码,入门资料,进阶资料,基础语法,爬虫,数据分析,web网站,机器学习,深度学习等等。 公众号回复【进群】沟通交流吧,QQ扫码进群学习吧 微信群 QQ群 1.画圣诞树 import turtle screen = turtle.Screen() screen.setup(800,600) circle = turtle.Turtle()...
作为一个程序员,CPU的这些硬核知识你必须会!
CPU对每个程序员来说,是个既熟悉又陌生的东西? 如果你只知道CPU是中央处理器的话,那可能对你并没有什么用,那么作为程序员的我们,必须要搞懂的就是CPU这家伙是如何运行的,尤其要搞懂它里面的寄存器是怎么一回事,因为这将让你从底层明白程序的运行机制。 随我一起,来好好认识下CPU这货吧 把CPU掰开来看 对于CPU来说,我们首先就要搞明白它是怎么回事,也就是它的内部构造,当然,CPU那么牛的一个东
破14亿,Python分析我国存在哪些人口危机!
2020年1月17日,国家统计局发布了2019年国民经济报告,报告中指出我国人口突破14亿。 猪哥的朋友圈被14亿人口刷屏,但是很多人并没有看到我国复杂的人口问题:老龄化、男女比例失衡、生育率下降、人口红利下降等。 今天我们就来分析一下我们国家的人口数据吧! 一、背景 1.人口突破14亿 2020年1月17日,国家统计局发布了 2019年国民经济报告 ,报告中指出:年末中国大陆总人口(包括31个
在家远程办公效率低?那你一定要收好这个「在家办公」神器!
相信大家都已经收到国务院延长春节假期的消息,接下来,在家远程办公可能将会持续一段时间。 但是问题来了。远程办公不是人在电脑前就当坐班了,相反,对于沟通效率,文件协作,以及信息安全都有着极高的要求。有着非常多的挑战,比如: 1在异地互相不见面的会议上,如何提高沟通效率? 2文件之间的来往反馈如何做到及时性?如何保证信息安全? 3如何规划安排每天工作,以及如何进行成果验收? ......
作为一个程序员,内存和磁盘的这些事情,你不得不知道啊!!!
截止目前,我已经分享了如下几篇文章: 一个程序在计算机中是如何运行的?超级干货!!! 作为一个程序员,CPU的这些硬核知识你必须会! 作为一个程序员,内存的这些硬核知识你必须懂! 这些知识可以说是我们之前都不太重视的基础知识,可能大家在上大学的时候都学习过了,但是嘞,当时由于老师讲解的没那么有趣,又加上这些知识本身就比较枯燥,所以嘞,大家当初几乎等于没学。 再说啦,学习这些,也看不出来有什么用啊!
2020年的1月,我辞掉了我的第一份工作
其实,这篇文章,我应该早点写的,毕竟现在已经2月份了。不过一些其它原因,或者是我的惰性、还有一些迷茫的念头,让自己迟迟没有试着写一点东西,记录下,或者说是总结下自己前3年的工作上的经历、学习的过程。 我自己知道的,在写自己的博客方面,我的文笔很一般,非技术类的文章不想去写;另外我又是一个还比较热衷于技术的人,而平常复杂一点的东西,如果想写文章写的清楚点,是需要足够...
别低估自己的直觉,也别高估自己的智商
所有群全部吵翻天,朋友圈全部沦陷,公众号疯狂转发。这两周没怎么发原创,只发新闻,可能有人注意到了。我不是懒,是文章写了却没发,因为大家的关注力始终在这次的疫情上面,发了也没人看。当然,我...
Java坑人面试题系列: 包装类(中级难度)
Java Magazine上面有一个专门坑人的面试题系列: https://blogs.oracle.com/javamagazine/quiz-2。 这些问题的设计宗旨,主要是测试面试者对Java语言的了解程度,而不是为了用弯弯绕绕的手段把面试者搞蒙。 如果你看过往期的问题,就会发现每一个都不简单。 这些试题模拟了认证考试中的一些难题。 而 “中级(intermediate)” 和 “高级(ad
深度学习入门笔记(十八):卷积神经网络(一)
欢迎关注WX公众号:【程序员管小亮】 专栏——深度学习入门笔记 声明 1)该文章整理自网上的大牛和机器学习专家无私奉献的资料,具体引用的资料请看参考文献。 2)本文仅供学术交流,非商用。所以每一部分具体的参考资料并没有详细对应。如果某部分不小心侵犯了大家的利益,还望海涵,并联系博主删除。 3)博主才疏学浅,文中如有不当之处,请各位指出,共同进步,谢谢。 4)此属于第一版本,若有错误,还需继续修正与...
这个世界上人真的分三六九等,你信吗?
偶然间,在知乎上看到一个问题 一时间,勾起了我深深的回忆。 以前在厂里打过两次工,做过家教,干过辅导班,做过中介。零下几度的晚上,贴过广告,满脸、满手地长冻疮。 再回首那段岁月,虽然苦,但让我学会了坚持和忍耐。让我明白了,在这个世界上,无论环境多么的恶劣,只要心存希望,星星之火,亦可燎原。 下文是原回答,希望能对你能有所启发。 如果我说,这个世界上人真的分三六九等,...
节后首个工作日,企业们集体开晨会让钉钉挂了
By 超神经场景描述:昨天 2 月 3 日,是大部分城市号召远程工作的第一天,全国有接近 2 亿人在家开始远程办公,钉钉上也有超过 1000 万家企业活跃起来。关键词:十一出行 人脸...
Java基础知识点梳理
Java基础知识点梳理 摘要: 虽然已经在实际工作中经常与java打交道,但是一直没系统地对java这门语言进行梳理和总结,掌握的知识也比较零散。恰好利用这段时间重新认识下java,并对一些常见的语法和知识点做个总结与回顾,一方面为了加深印象,方便后面查阅,一方面为了学好java打下基础。 Java简介 java语言于1995年正式推出,最开始被命名为Oak语言,由James Gosling(詹姆
2020年全新Java学习路线图,含配套视频,学完即为中级Java程序员!!
新的一年来临,突如其来的疫情打破了平静的生活! 在家的你是否很无聊,如果无聊就来学习吧! 世上只有一种投资只赚不赔,那就是学习!!! 传智播客于2020年升级了Java学习线路图,硬核升级,免费放送! 学完你就是中级程序员,能更快一步找到工作! 一、Java基础 JavaSE基础是Java中级程序员的起点,是帮助你从小白到懂得编程的必经之路。 在Java基础板块中有6个子模块的学
B 站上有哪些很好的学习资源?
哇说起B站,在小九眼里就是宝藏般的存在,放年假宅在家时一天刷6、7个小时不在话下,更别提今年的跨年晚会,我简直是跪着看完的!! 最早大家聚在在B站是为了追番,再后来我在上面刷欧美新歌和漂亮小姐姐的舞蹈视频,最近两年我和周围的朋友们已经把B站当作学习教室了,而且学习成本还免费,真是个励志的好平台ヽ(.◕ฺˇд ˇ◕ฺ;)ノ 下面我们就来盘点一下B站上优质的学习资源: 综合类 Oeasy: 综合
你也能看懂的:蒙特卡罗方法
蒙特卡罗方法,也称统计模拟方法,是1940年代中期由于科学技术的发展和电子计算机的发明,而提出的一种以概率统计理论为指导的数值计算方法。是指使用随机数(或更常见的伪随机数)来解决很多计算问题的方法 蒙特卡罗方法可以粗略地分成两类:一类是所求解的问题本身具有内在的随机性,借助计算机的运算能力可以直接模拟这种随机的过程。另一种类型是所求解问题可以转化为某种随机分布的特征数,比如随机事件出现的概率,或...
相关热词 c# 识别回车 c#生成条形码ean13 c#子控制器调用父控制器 c# 写大文件 c# 浏览pdf c#获取桌面图标的句柄 c# list反射 c# 句柄 进程 c# 倒计时 线程 c# 窗体背景色
立即提问