【问题标题】:audiorecord android wear values 0audiorecord android磨损值0
【发布时间】:2015-04-01 19:14:42
【问题描述】:

我正在尝试从我的 Android Wear 手表获取音量:MOTO 360。 但是,我只从 Audiorecord.read 得到 0 个 PCM 值.....

我在一个单独的线程中运行记录过程。以下是我的代码摘录,你知道我做错了什么吗?

非常感谢您的帮助

jn.

REREDIT:MOTO 的新结果。看起来真的很奇怪!

03-15 20:38:08.740 1420-3994/? W/mot_vr_audio_hw:不允许唤醒(),因为 DSP 被禁用

重新编辑:我用不同的手表(索尼)尝试了我的代码。日志更明确

03-08 22:11:40.342 1165-1650/? D/MICRO:将在 15052 的缓冲区中以 44100Hz 记录

03-08 22:11:40.343 153-153/? E/AudioPolicyManager﹕startInput(21) failed: other input 19 already started

03-08 22:11:40.343 1165-1650/? E/AudioRecord﹕start() status -38

当 2 个音频记录对象同时处于活动状态时,似乎会触发此错误。但我很确定我的只开始了一次。你认为它可能是一个系统音频记录对象阻止我的启动吗?

编辑:我的服装清单中确实有这个 使用权限 android:name="android.permission.RECORD_AUDIO"

private int sampleRateInHz = 8000;
private int channelConfig = AudioFormat.CHANNEL_IN_MONO;
private int audioFormat = AudioFormat.ENCODING_PCM_16BIT;

public void run(){

    running=true;
    bufferSize = AudioRecord.getMinBufferSize(sampleRateInHz, channelConfig, audioFormat);
    recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,sampleRateInHz, channelConfig, audioFormat, bufferSize);
    Log.d(TAG,"WILL RECORD AT "+sampleRateInHz+"Hz IN A BUFFER OF "+bufferSize);
    recording=true;

    try{
        while (recording){

            if ((recorder.getState()==android.media.AudioRecord.STATE_INITIALIZED)&&(recorder.getRecordingState()==android.media.AudioRecord.RECORDSTATE_STOPPED)){
                recorder.startRecording();
                Log.d(TAG,"START RECORDING DUDE");
            }

            int theVolume = getVolume(sampleRateInHz, bufferSize);

            Thread.sleep(10);
        }
        if (!recording){
            Thread.currentThread().interrupt();
            Log.d(TAG,"MIC THREAD STOPPED");
        }

    }catch (InterruptedException e){
        e.printStackTrace();
    }

private int getVolume(int sampleRate, int bufferSize){
    short[] audioData = new short [bufferSize];

    int nbOfSamples = recorder.read(audioData,0,bufferSize);

    int numSamples = audioData.length;
    int numCrossing = 0;
    double volume = 0;
    for (int p = 0; p < numSamples-1; p++){
        volume += audioData[p]*audioData[p];
    }

    Log.d(TAG,"volume from pcm: "+volume);
    volume = Math.sqrt(volume/nbOfSamples);


    currentVolume = (int) (0.5*currentVolume+ 0.5*volume);
    Log.d(TAG,"currentVolume: "+currentVolume);

    return currentVolume;
}

【问题讨论】:

    标签: wear-os watch motorola audiorecord


    【解决方案1】:

    您的更多代码会有所帮助。但听起来麦克风已经在使用中。我也遇到了其中一些问题。如果你在一个线程中运行它,你可能会不小心启动多个线程。此外,如果您在服务中运行它,您可能会启动多个服务。现在如果你用谷歌搜索“同一服务的多个实例是否可以运行”,你会发现很多人说不。但事实是肯定的,您可以同时运行同一服务的多个实例。我的建议是在每个记录循环上 Log.d 一个随机数。确保一次只有一个线程在工作

    public void run(){
        int randThreadNumber = randInt(0,100);
        while (recording) {
            Log.d("MYTAG", "Rand number " + randThreadNumber);
            ..........more code.............
        }
        ..........more code.............
    }
    
    public static int randInt(int min, int max) {
        Random rand = new Random();
        int randomNum = rand.nextInt((max - min) + 1) + min;
    
        return randomNum;
    }
    

    另一件事可能导致您无法访问 android Wear 上的录音机,如果手表正在侦听“OK Google”,那么如果您在手表处于响应“OK”的状态时尝试捕获音频谷歌”音频记录不起作用。

    这是查看麦克风是否可用的好方法

    while(recording)
    {
        readResult = audio_recorder.read(buf, 0, buf.length);
    
        //See if read worked
        if(readResult != -3) {
            // yay it worked. Do stuff
        } else {
            // if result is -3 then the watch's mic was inaccessible, wait then retry
            Log.d(TAG, "Waiting for Watch to give up Microphone");
            try {
                Thread.sleep(100, 0);
                audio_recorder.startRecording(); // restart audio recording
            } catch(Exception e) {
                Log.e(TAG, "exception", e); // Error trying to sleep thread
            }
        }
    }
    

    EDIT 在每次读取调用之间调用Thread.sleep(10); 也是没有用的,因为读取方法是阻塞的。如果它没有可提供的东西,它将等待,然后在准备好时返回。

    【讨论】:

    • 感谢您的精彩回复!我会试试你的随机数提示,这是一个非常好的建议。我也会记录 readresult=-3 ,无法发现这个问题。我会让你知道结果。有趣的是,我在不同的设备(索尼智能手表 3)上尝试了相同的代码,但我没有问题访问麦克风'.....
    • 我没有明白你的编辑的意思。我让线程在 read() 之后休眠。因为我不需要非常高的麦克风采样频率。我 read() 正在阻塞,很好,但我想在重新启动 read() 之前暂停最少时间(如果 read() 阻塞可能会更长)。我是不是哪里错了?
    • 我试着让你阅读 audiorecord.read() 的结果,它给了我一个很大的正数,比如 1323。我认为这意味着一切似乎都是正确的。但是今天我有一个新的错误:03-15 20:38:08.740 1420-3994/? W/mot_vr_audio_hw:不允许唤醒(),因为 DSP 被禁用
    • @bisonfute 如果你仍然有问题,你可以在谷歌上给我发消息,加上plus.google.com/+BenjaminNykiel,如果你愿意,我可以给你发一个我使用 AudioRecord 制作的应用程序,看看我的应用程序是否有效。如果是这样,那么我知道我可以帮助你。我还没有在 Moto 360 上测试过我的应用程序,所以我的应用程序可能无法在你的手表上运行。在这种情况下,我可能无法提供帮助。无论哪种方式,这都会对我们俩都有帮助,因为我想知道我的应用程序是否无法在 Moto 上运行。
    猜你喜欢
    • 1970-01-01
    • 2018-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多