Android通过AudioRecord录制系统内置声音
转自: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录制系统内置声音相关推荐
- Android中实现录制内置声音
Android中实现对内置声源的录制有两种方案 一.将应用打包为系统应用 AudioSource输入源 public final class AudioSource { private ...
- M1 MacBook安装soundflower失败情况下如何录屏录制系统内置声音?
当然是用black hole啦 blackhole下载地址
- Android使用AudioRecord录制PCM音频、PCM转AAC、使用MediaRecorder直接录制AAC编码音频
Android为我们提供了两个音频处理的API:AudioRecord和MediaRecorder AudioRecord:偏底层的api MediaRecorder:对AudioRecord进行包装 ...
- Android 使用AudioRecord录制声音
gitee代码链接 使用方法: 第一次点击开始录制会申请权限,权限通过之后,需要再次点击才能开 始录音,麦克风录制完声音后,需要再次点击按钮才能停止录音,保存的录音文件在 /data/data/com ...
- Android使用AudioRecord录制pcm音频原始数据以及使用AudioTrack播放
https://github.com/z13538657403/Android_PCM_Record_Play
- mac使用obs进行斗鱼直播无法录制内置声音
/2016/11/12 /by xbw 需要soundflower,下载链接 安装之后会重启电脑. 斗鱼直播间--750240
- Android手机直播(三)声音采集
一.文章说明 开始写文章了,才知道写文章真心耗费心力,希望自己尽量做到快速更新,也希望这些文章真心能帮助到开发者们. 这篇文章主要讲述Android声音采集相关的知识,首先介绍声音的基础知识,然后介绍 ...
- Mac如何录屏 同时录内置声音
首先需要一个插件,叫做SoundFlower 参考操作为:https://www.jianshu.com/p/a8600e490be4 步骤如下: 在http://www.buildtoconnect ...
- mac android 录屏软件,mac录屏怎么录内置声音?详细的解决方案
原标题:mac录屏怎么录内置声音?详细的解决方案 mac录屏怎么录内置声音?大家使用Mac电脑最大的问题就是对操作系统的不熟悉,就像是刚接触Windows系统一样,开始都会有一定的不熟悉,其实并没有那 ...
最新文章
- php token的生成和使用
- Linux关于终端的基本概念汇总(tty/pty)(转)
- CCF-CSP 201703-1 试题名称:	分蛋糕
- 这大概是一篇最简单最清晰的Java JVM执行流程
- pixhawk硬件构架
- 几个常用shell脚本命令
- #3864. Hero meet devil dp套dp + 状压 + 状态机
- vue 生成发布包_年轻人如何从0到1封装发布一个vue组件__Vue.js
- 数组与串,串的实现,KMP,BF算法
- 初探PostgreSql
- mysql function 事务_MySQL 事务
- C语言库文件ctype.h中重要的库函数
- Corn Fields——POJ3254状态压缩Dp
- python爬虫框架学习_学习Python爬虫必备框架:Scrapy
- paip.jquery ajax 请求JSON数据填充SELECT全过程纪录
- 简单计算机电脑病毒实验,简单的电脑病毒程序
- 关于城市旅游的HTML网页设计 HTML+CSS+JS学生旅游网页设计与实现
- 波士顿大学计算机与传媒专业,波士顿大学传媒专业排名如何?
- 13个最狂帅炫酷的前沿科技研究项目
- 华为荣耀20和x10比较_华为畅享20plus和荣耀x10对比哪个好?入手哪一款更香