Android Capture Android System Audio
项目需要获取播放视频的实时音量值,最简捷的方法是监听音频输出端,取得音频输出流,再进行转换。
调查时,首先找到这篇博客:
http://blog.csdn.net/jinzhuojun/article/details/33748031
即利用API 19中新加的MediaRecorder.AudioSource.REMOTE_SUBMIX参数,实时录制输出流数据。
因为使用REMOTE_SUBMIX参数需要系统级权限
获取系统权限的调查
java -jar signapk.jar platform.x509.pem platform.pk8 old.apk new.apk
即使更改应用为系统权限,仍不可用:
原因是使用的是目标系统的签名文件,生成的程序只能在原生Android系统或者是自己所编译的系统中才可以使用,其他定制系统无法安装,这样也是为了保护系统的安全。
参考:
http://gqdy365.iteye.com/blog/2111949
http://www.eoeandroid.com/thread-329398-1-1.html?_dsign=039d0c16
此方案下获取系统音频输出的尝试就此宣告破产!
正当我准备放弃的时候,事情又出现了转机:Google 时发现有人建议尝试android.media.audiofx.Virtualizer
Record Android Audio Output
android get device overall audio output in pcm
初步查看好像有利用的可能,就仔细调查了一下,没想到问题就此解决,真是车到山前必有路,船到桥头自然直。
Virtualizer是Android 2.3 给出的API,主要功能是实现音频的可视化,用于音乐播放时绘制柱状、块状或曲线的波形图
实例化:Visualizer mVisualizer = new Visualizer(int audioSession)
这种方法获取系统输出音频的关键是参数audioSession,API中给的解释如下:
@param audioSession system wide unique audio session identifier.
If audioSession is not 0, the visualizer will be attached to the MediaPlayer or AudioTrack in the same audio session.
Otherwise, the Visualizer will apply to the output mix.
主要流程是:
1. 初始化Visualizer控件,Visualizer mVisualizer = new Visualizer(0);
2. 实现数据截获监听,mVisualizer.setDataCaptureListener(OnDataCaptureListener listener, int rate, boolean waveform, boolean fft);
这里需要实现OnDataCaptureListener的两个接口,其中onWaveFormDataCapture(Visualizer visualizer, byte[] waveform, int samplingRate)
中的waveform即为所截获的音频输出流,对其执行想要的操作即可。
关键代码:
- mVisualizer = new Visualizer(0); // get output audio stream
- mVisualizer.setEnabled(false);
- mVisualizer.setCaptureSize(1024);
- mVisualizer.setDataCaptureListener(new Visualizer.OnDataCaptureListener() {
- @Override
- public void onWaveFormDataCapture(Visualizer visualizer, byte[] waveform, int samplingRate) {
- // 用waveform波形数据更新mVisualizerView组件
- mVisualizerView.updateVisualizer(waveform);
- int max = 0;
for (int i = 0; i < waveform.length - 1; i += 32) {
int top = (byte) (waveform[i + 1] + 128 + 1) * 2;
if (top > max){
max = top;
}
}
Log.i(TAG, "MAX1: " + max);
- }
- @Override
public void onFftDataCapture(Visualizer visualizer, byte[] fft, int samplingRate) {
}
}, Visualizer.getMaxCaptureRate(), true, false); // waveform not freq data
说明:这个项目并不需要完整的输出音频,而只是需要输出音频的实时音量,因此后续处理并不复杂。
如果想要录制完整的输出音频,请参考上面的两个链接,可以实现,但音频质量非常非常差,根本不可用。
Android Capture Android System Audio的更多相关文章
- Android Studio导入System Library步骤
转载请注明出处:http://www.cnblogs.com/cnwutianhao/p/6242170.html 请尊重知识产权!!! 同步更新到CSDN:http://blog.csdn.net ...
- Android Studio安装后配置默认新工程目录以及.gradle,.android,.m2和system,config目录
关于在哪里设置:以下所有设置都是在没有打开工程的前提下设置的, Configure > Settings 如图: 不要使用 Configure > Project Defaults> ...
- How To: Capture Android & iOS Traffic with Fiddler
How To: Capture iOS Traffic with Fiddlerhttps://www.telerik.com/blogs/how-to-capture-ios-traffic-wit ...
- Android File Hierarchy : System Structure Architecture Layout
Most of the Android user are using their Android phone just for calls, SMS, browsing and basic apps, ...
- Use PerfHUD ES to Do Frame Capture Android Game
Author: http://www.cnblogs.com/open-coder/p/3898224.html Get Start This is short tutorial about how ...
- Android权限说明 system权限 root权限
原文链接:http://blog.csdn.net/rockwupj/article/details/8618655 Android权限说明 Android系统是运行在Linux内核上的,Androi ...
- Android A/B System OTA分析(一)概览【转】
本文转载自:https://blog.csdn.net/guyongqiangx/article/details/71334889 Android从7.0开始引入新的OTA升级方式,A/B Syste ...
- Android 悬浮窗 System Alert Window
悬浮窗能显示在其他应用上方.桌面系统例如Windows,macOS,Ubuntu,打开的程序能以窗口形式显示在屏幕上. 受限于屏幕大小,安卓系统中主要使用多任务切换的方式和分屏的方式.视频播放,视频对 ...
- Android API Guides –System Permissions
系统权限 声明: 本文由Gordon翻译 公布于www.dlvoice.com 欢迎转载,但请保留此声明 原文地址:http://developer.android.com/guide/topics/ ...
随机推荐
- 基于EntityFramework的权限的配置和验证
1. 概要 本文主要介绍公司现有系统框架的权限体系,和一些待扩展功能的说明.目前该权限体系基于角色构建(RBAC),原则上,系统中不允许出现对用户.组织等其他对象指派权限的情况. 2. 权限分 ...
- Volley HTTP库系列教程(2)Volley.newRequestQueue示例,发请求的流程,取消请求
Sending a Simple Request Previous Next This lesson teaches you to Add the INTERNET Permission Use n ...
- wget 批量下载目录文件
wget -r -p -k -np http://源目录 ./本地目标目录
- Android:将View的内容映射成Bitmap转图片导出
前段时间在网上看到这么个例子是将view映射到一个bitmap中,稍加改进可以用于一些截图工具或者截图软件(QQ截图之类),例子写的不够完善,不过很有些学习的意义内容大致如下: 在Android中自有 ...
- JavaScript判断浏览器类型及版本
JavaScript是前端开发的主要语言,我们可以通过编写JavaScript程序来判断浏览器的类型及版本.JavaScript判断浏览器类型一般有两种办法,一种是根据各种浏览器独有的属性来分辨,另一 ...
- 示例可重用的web component方式组织angular应用模块
在online web应用中,经常有这样的需求,能够让用户通过浏览器来输入代码,同时能够根据不同的代码来做语法高亮.大家已知有很多相应的javascript库来实现语法高亮的功能,比如codemirr ...
- POJ 3628 Bookshelf 2【01背包】
题意:给出n头牛的身高,以及一个书架的高度,问怎样选取牛,使得它们的高的和超过书架的高度最小. 将背包容量转化为所有牛的身高之和,就可以用01背包来做=== #include<iostream& ...
- WEBUS2.0 In Action - 搜索操作指南 - (2)
上一篇:WEBUS2.0 In Action - 搜索操作指南(1) | 下一篇:WEBUS2.0 In Action - 搜索操作指南(3) 2. 使用Query Query是所有查询的基类, 它一 ...
- PHP学习笔记05——面向对象
<?php //1. 类的声明(包括构造方法.析构方法) class PersonA { var $name; //成员属性,用var声明 public $age; //当有其他修饰的时候,就不 ...
- HDU 5265 pog loves szh II (技巧)
题意:给一个数字序列,要求再其中找到两个数,其和再模p的结果是最大的,求此和. 思路:先将输入的元素模p,排序.结果可能有两种情况: (1)a+b大于p:肯定由两个最大的数之和来产生. (2)a+b小 ...