转自:http://blog.csdn.net/jinzhuojun/article/details/33748031

通过API 19新加的MediaRecorder.AudioSource.REMOTE_SUBMIX参数可以让系统App录制系统内置的声音,也就是扬声器的声音。下面是一个巨简单的例子来示例如何通过AudioRecord配合REMOTE_SUBMIX参数进行录制。

1. 编译apk

MainActivity.Java:

package com.example.audiotest;  import java.io.FileOutputStream;
import java.io.IOException;  import android.app.Activity;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;  public class MainActivity extends Activity {  private static String TAG = "JZJ";  AudioRecord mRecord = null;  boolean mReqStop = false;  @Override  protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);  init();  (new Thread() {  @Override  public void run() {  recordAndPlay();  }  }).start();  }  private final int kSampleRate = 44100;  private final int kChannelMode = AudioFormat.CHANNEL_IN_STEREO;  private final int kEncodeFormat = AudioFormat.ENCODING_PCM_16BIT;  private void init() {  int minBufferSize = AudioRecord.getMinBufferSize(kSampleRate, kChannelMode,  kEncodeFormat);  mRecord = new AudioRecord(MediaRecorder.AudioSource.REMOTE_SUBMIX,  kSampleRate, kChannelMode, kEncodeFormat, minBufferSize * 2);  }  private final int kFrameSize = 2048;  private String filePath = "/sdcard/voice.pcm";  private void recordAndPlay() {  FileOutputStream os = null;  mRecord.startRecording();  try {  os = new FileOutputStream(filePath);  byte[] buffer = new byte[kFrameSize];  int num = 0;  while (!mReqStop) {  num = mRecord.read(buffer, 0, kFrameSize);  Log.d(TAG, "buffer = " + buffer.toString() + ", num = " + num);  os.write(buffer, 0, num);  }  Log.d(TAG, "exit loop");  os.close();  } catch (IOException e) {  e.printStackTrace();  Log.e(TAG, "Dump PCM to file failed");  }  mRecord.stop();  mRecord.release();  mRecord = null;  Log.d(TAG, "clean up");  }  public void stop(View view) {  mReqStop = true;  Button stopBtn = (Button) findViewById(R.id.stopBtn);  stopBtn.setText("Stopped");  stopBtn.setEnabled(false);  }
}  

布局文件activity_main.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  xmlns:tools="http://schemas.android.com/tools"  android:layout_width="match_parent"  android:layout_height="match_parent"  tools:context=".MainActivity" >  <Button  android:id="@+id/stopBtn"  android:layout_width="wrap_content"  android:layout_height="wrap_content"  android:onClick="stop"  android:text="Stop" />  </RelativeLayout>

配置文件AndroidManifest.xml,注意要加上的几个权限:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"  package="com.example.audiotest"  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="@drawable/ic_launcher"  android:label="@string/app_name"  android:theme="@style/AppTheme" >  <activity  android:name="com.example.audiotest.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>  

编译生成Test.apk。

2. 加系统签名

java -jar signapk.jar platform.x509.pem platform.pk8 ./Test.apk final.apk

platform.x509.pem和platform.pk8在Android源码的build/target/product/security目录下。

signapk.jar可以从https://code.google.com/p/signapk/下载。

3. 安装签名好的apk,运行

启动时即开始采集系统声音数据,结束时点击Stop按钮停止。这时采集数据会导出到/sdcard/voice.pcm文件。

4. 取出音频采样数据,播放

adb pull /sdcard/voice.pcm

vlc --demux=rawaud --rawaud-channels 2 --rawaud-samplerate 44100 voice.pcm

这样就开始播放刚才录制的声音了。vlc是一个多媒体播放器(http://www.videolan.org/vlc/index.html),支持播放PCM数据。当然也可以用其它支持播放PCM的播放器。

总结来说,这种方法的缺点是录制时扬声器就不能输出,优点是不用改系统层。

Android通过AudioRecord录制系统内置声音相关推荐

  1. Android中实现录制内置声音

    Android中实现对内置声源的录制有两种方案 一.将应用打包为系统应用 AudioSource输入源 public final class AudioSource { ​​​​​​​private ...

  2. M1 MacBook安装soundflower失败情况下如何录屏录制系统内置声音?

    当然是用black hole啦 blackhole下载地址

  3. Android使用AudioRecord录制PCM音频、PCM转AAC、使用MediaRecorder直接录制AAC编码音频

    Android为我们提供了两个音频处理的API:AudioRecord和MediaRecorder AudioRecord:偏底层的api MediaRecorder:对AudioRecord进行包装 ...

  4. Android 使用AudioRecord录制声音

    gitee代码链接 使用方法: 第一次点击开始录制会申请权限,权限通过之后,需要再次点击才能开 始录音,麦克风录制完声音后,需要再次点击按钮才能停止录音,保存的录音文件在 /data/data/com ...

  5. Android使用AudioRecord录制pcm音频原始数据以及使用AudioTrack播放

    https://github.com/z13538657403/Android_PCM_Record_Play

  6. mac使用obs进行斗鱼直播无法录制内置声音

    /2016/11/12 /by   xbw 需要soundflower,下载链接 安装之后会重启电脑. 斗鱼直播间--750240

  7. Android手机直播(三)声音采集

    一.文章说明 开始写文章了,才知道写文章真心耗费心力,希望自己尽量做到快速更新,也希望这些文章真心能帮助到开发者们. 这篇文章主要讲述Android声音采集相关的知识,首先介绍声音的基础知识,然后介绍 ...

  8. Mac如何录屏 同时录内置声音

    首先需要一个插件,叫做SoundFlower 参考操作为:https://www.jianshu.com/p/a8600e490be4 步骤如下: 在http://www.buildtoconnect ...

  9. mac android 录屏软件,mac录屏怎么录内置声音?详细的解决方案

    原标题:mac录屏怎么录内置声音?详细的解决方案 mac录屏怎么录内置声音?大家使用Mac电脑最大的问题就是对操作系统的不熟悉,就像是刚接触Windows系统一样,开始都会有一定的不熟悉,其实并没有那 ...

最新文章

  1. php token的生成和使用
  2. Linux关于终端的基本概念汇总(tty/pty)(转)
  3. CCF-CSP 201703-1 试题名称: 分蛋糕
  4. 这大概是一篇最简单最清晰的Java JVM执行流程
  5. pixhawk硬件构架
  6. 几个常用shell脚本命令
  7. #3864. Hero meet devil dp套dp + 状压 + 状态机
  8. vue 生成发布包_年轻人如何从0到1封装发布一个vue组件__Vue.js
  9. 数组与串,串的实现,KMP,BF算法
  10. 初探PostgreSql
  11. mysql function 事务_MySQL 事务
  12. C语言库文件ctype.h中重要的库函数
  13. Corn Fields——POJ3254状态压缩Dp
  14. python爬虫框架学习_学习Python爬虫必备框架:Scrapy
  15. paip.jquery ajax 请求JSON数据填充SELECT全过程纪录
  16. 简单计算机电脑病毒实验,简单的电脑病毒程序
  17. 关于城市旅游的HTML网页设计 HTML+CSS+JS学生旅游网页设计与实现
  18. 波士顿大学计算机与传媒专业,波士顿大学传媒专业排名如何?
  19. 13个最狂帅炫酷的前沿科技研究项目
  20. 华为荣耀20和x10比较_华为畅享20plus和荣耀x10对比哪个好?入手哪一款更香

热门文章

  1. 目录文件DNSVHost暴力破解工具:Gobuster
  2. 计算器上复合型折现率i折算的理解
  3. sqlserver中文生僻字乱码问题
  4. autojs之生成二维码
  5. 【项目小结】英语语法错误检测(GEC)开题论文阅读记录
  6. java gc回收机制种类_Java垃圾回收机制
  7. 短信开发中的MT、MO是什么意思?
  8. 全国各地的程序员特点分析,搞笑幽默--快来对号入座
  9. [转]Flash技巧allowScriptAccess
  10. [音乐天堂]Ernest gold -《出埃及记》