项目需要获取播放视频的实时音量值,最简捷的方法是监听音频输出端,取得音频输出流,再进行转换。

调查时,首先找到这篇博客:

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

即利用API 19中新加的MediaRecorder.AudioSource.REMOTE_SUBMIX参数,实时录制输出流数据。

因为使用REMOTE_SUBMIX参数需要系统级权限

获取系统权限的调查

Ø在Android源码环境下用make来编译:
①在AndroidManifest的manifest节点中加入android:sharedUserId="android.uid.system"属性。
②修改Android.mk文件,加入LOCAL_CERTIFICATE := platform;
③使用mm命令来编译,生成的apk即拥有系统级权限。
Ø非源码环境下添加系统权限:
①在AndroidManifest的manifest节点中加入android:sharedUserId="android.uid.system"属性。
②使用Eclipse或Android Studio编译出未加签名的apk文件,此时apk文件无法使用的。
③使用目标系统的platform密钥重新给apk文件签名:platform.pk8、platform.x509.pem和Android提供的signapk工具,执行如下命令

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的更多相关文章

  1. Android Studio导入System Library步骤

    转载请注明出处:http://www.cnblogs.com/cnwutianhao/p/6242170.html 请尊重知识产权!!!  同步更新到CSDN:http://blog.csdn.net ...

  2. Android Studio安装后配置默认新工程目录以及.gradle,.android,.m2和system,config目录

    关于在哪里设置:以下所有设置都是在没有打开工程的前提下设置的, Configure > Settings 如图: 不要使用 Configure > Project Defaults> ...

  3. 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 ...

  4. 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, ...

  5. 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 ...

  6. Android权限说明 system权限 root权限

    原文链接:http://blog.csdn.net/rockwupj/article/details/8618655 Android权限说明 Android系统是运行在Linux内核上的,Androi ...

  7. Android A/B System OTA分析(一)概览【转】

    本文转载自:https://blog.csdn.net/guyongqiangx/article/details/71334889 Android从7.0开始引入新的OTA升级方式,A/B Syste ...

  8. Android 悬浮窗 System Alert Window

    悬浮窗能显示在其他应用上方.桌面系统例如Windows,macOS,Ubuntu,打开的程序能以窗口形式显示在屏幕上. 受限于屏幕大小,安卓系统中主要使用多任务切换的方式和分屏的方式.视频播放,视频对 ...

  9. Android API Guides –System Permissions

    系统权限 声明: 本文由Gordon翻译 公布于www.dlvoice.com 欢迎转载,但请保留此声明 原文地址:http://developer.android.com/guide/topics/ ...

随机推荐

  1. STL容器的遍历删除

    STL容器的遍历删除 今天在对截包程序的HashTable中加入计时机制时,碰到这个问题.对hash_map中的每个项加入时间后,用查询函数遍历hash_map,以删除掉那些在表存留时间比某个阈值长的 ...

  2. JavaScript中typeof知多少?

    typeof运算符介 绍:typeof 是一个一元运算,放在一个运算数之前,运算数可以是任意类型.它返回值是一个字符串,该字符串说明运算数的类型. 你 知道下面typeof运算的结果吗? typeof ...

  3. Android中的PopupWindow详解

      Android的对话框有两种:PopupWindow和AlertDialog.它们的不同点在于: AlertDialog的位置固定,而PopupWindow的位置可以随意 AlertDialog是 ...

  4. android 事件处理机制之requestDisallowInterceptTouchEvent

    当手指触摸到屏幕时,系统就会调用相应View的onTouchEvent,并传入一系列的action.当有多个层级的View时,在父层级允许的情 况下,这个action会一直向下传递直到遇到最深层的Vi ...

  5. C#配置系统未能初始化

    如果配置文件中包含 configSections 元素,则 configSections 元素必须是 configuration 元素的第一个子元素.",将appSettings放到conf ...

  6. POJ (Manacher) Palindrome

    多敲几个模板题,加深一下对Manacher算法的理解. 这道题给的时间限制15s,是我见过的最长的时间的了.看来是为了让一些比较朴素的求最大回文子串的算法也能A过去 Manacher算法毕竟给力,运行 ...

  7. 51nod 博弈论水题

    51nod1069 Nim游戏 有N堆石子.A B两个人轮流拿,A先拿.每次只能从一堆中取若干个,可将一堆全取走,但不可不取,拿到最后1颗石子的人获胜.假设A B都非常聪明,拿石子的过程中不会出现失误 ...

  8. 指针数组vs数组指针 指针函数vs函数指针

    在分辨这些重要的概念时,我们先回顾一下前面所讲的C之三值合一,由于三个值所求出的地址是相同的,所以经常有传言说他们都是首元素的地址.这种说法是不正确的.为什么说它是不正确的呢? 首先定义一个指针,将三 ...

  9. gcc g++ 参数介绍

    C和C++ 编译器是集成的.他们都要用四个步骤中的一个或多个处理输入文件: 预处理 (preprocessing),编译(compilation),汇编(assembly)和连接(linking).源 ...

  10. BZOJ 2157 旅行

    裸链剖. 这大概是我第一份两百行左右的代码吧. 然而我把题看错了233333333调了将近两天. #include<iostream> #include<cstdio> #in ...