标签: audio-recording

Android AudioRecord.read返回0项的数组

我正在尝试做的事情: 我正在尝试编写一个从Android麦克风中读取音频的程序(无需录制),并捕获一些使用服务的大小程度.现在我正在从我的活动向我的服务发送一个脉冲,以获得快速的声音读取,并检查振幅的Logcat打印输出作为我的音量.

我的问题: AudioRecord的read方法返回0.

我尝试过: 录制完整的音频而不是使用NullOutputStream并没有什么区别.一些早期版本在添加了一些微不足道的变化(如logcat调用)后随机开始工作,然后停止工作.

我的想法: 我原本以为可能是其他应用程序正在使用麦克风,但即使这是唯一值得注意的服务,它仍会返回0.

我的服务:

import org.apache.commons.io.output.NullOutputStream;


public class RecordingService extends Service {

public static final int SAMPLE_RATE = 16000;

private AudioRecord mRecorder;
private File mRecording;
private short[] mBuffer;

public static final NullOutputStream NULL_OUTPUT_STREAM = new NullOutputStream();

public double amplitude = 0.0;

public String TAG = "TAG";

public void onCreate() {
    super.onCreate();
}

public int onStartCommand(Intent intent, int flags, int startId){

    initRecorder();
    mRecorder.startRecording();
    mRecording = getFile("raw");
    startBufferedWrite(mRecording, intent);
    mRecorder.stop();
    mRecorder.release();
    stopSelf();

    return START_STICKY;
}

private void …
Run Code Online (Sandbox Code Playgroud)

arrays service android outputstream audio-recording

8
推荐指数
0
解决办法
1326
查看次数

如何录制蓝牙耳机的音频(startBluetoothSco())

我正在尝试从蓝牙耳机录制音频,startBluetoothSco()在不同版本的android中工作不同,在android 4.2,4.4和5.0上录制来自蓝牙耳机的音频.使用" 诺基亚BH-310和9xxPlantronics "蓝牙耳机.

SAMPLE_RATE = 8000;

  1. 只有当像这样创建AudioRecord()对象时,运行Android 4.2的设备才会记录来自蓝牙设备的音频

AudioSource.DEFAULT

mRecorder = new AudioRecord(MediaRecorder.AudioSource.DEFAULT, SAMPLE_RATE,
                    AudioFormat.CHANNEL_IN_MONO,     AudioFormat.ENCODING_PCM_16BIT,
                    bufferSize);
Run Code Online (Sandbox Code Playgroud)
  1. 只有当像这样创建AudioRecord()对象时,运行Android 4.4的设备才会记录来自蓝牙设备的音频

AudioSource.DEFAULT

    mRecorder = new AudioRecord(MediaRecorder.AudioSource.DEFAULT, SAMPLE_RATE,
                    AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT,
                    bufferSize);
Run Code Online (Sandbox Code Playgroud)

要么

AudioSource.MIC

    mRecorder = new AudioRecord(MediaRecorder.AudioSource.MIC, SAMPLE_RATE,
                    AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT,
                    bufferSize);
Run Code Online (Sandbox Code Playgroud)
  1. 只有在像这样创建AudioRecord()对象时,运行Android 5.0 Lollipop的设备才会记录来自蓝牙设备的音频

AudioSource.VOICE_COMMUNICATION

    mRecorder = new AudioRecord(MediaRecorder.AudioSource.VOICE_COMMUNICATION, SAMPLE_RATE,
                    AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT,
                    bufferSize);

//with other AudioSource types (MIC, DEFAULT) sco returns connected state but record from phone mic
Run Code Online (Sandbox Code Playgroud)

LOG for Android 5.0设备连接状态

D/inside onRcv? state=0
D/State=? conn -> 0
D/inside onRcv? state=2 …
Run Code Online (Sandbox Code Playgroud)

audio android bluetooth audio-recording bluetooth-sco

8
推荐指数
0
解决办法
3032
查看次数

MediaDevices.getUserMedia() 如何设置音频约束(采样率/位深度)?

使用浏览器Web API,我想设置适合录制音频语音(语音消息)的MediaDevices.getUserMedia 约束属性,例如设置这些参数:

  • 单核细胞增多症
  • 16位
  • 16KHz

这是我的代码:

   const mediaStreamConstraints = {
       audio: {
         channelCount: 1,
         sampleRate: 16000,
         sampleSize: 16,
         volume: 1
       },

       video: false
   }

   navigator.mediaDevices.getUserMedia(mediaStreamConstraints)
     .catch( err => serverlog(`ERROR mediaDevices.getUserMedia: ${err}`) )
     .then( stream => {

        // audio recorded as Blob 
        // and the binary data are sent via socketio to a nodejs server
        // that store blob as a file (e.g. audio/inp/audiofile.webm)

      } )

Run Code Online (Sandbox Code Playgroud)

录制的剪辑被抓取并存储(使用MediaRecorderAPI),最终发送到 Nodejs 服务器,其中 blob 被保存为文件并进行处理(该应用程序是一个语音机器人)。

出现问题,WebM 保存的文件没有所需的参数:

$ mediainfo audio/inp/audiofile.webm
General …
Run Code Online (Sandbox Code Playgroud)

browser audio audio-recording getusermedia mediadevices

8
推荐指数
2
解决办法
1万
查看次数

如何在Java中对多声道声音输入进行采样

我意识到这可能是相对利基,但也许这就是为什么这是好的问题无论如何.我正在寻找一个硬件多输入录音控制台(例如Alesis IO 26)来接收Adat lightpipe 8声道输入来进行信号处理.由于我还没有获得该设备并且需要弄清楚这是否可行(预算问题),我想问一下是否有人有任何经验来获取Java中的所有这8个数据输入?我已经看过很多使用Javax.sound.sampled库录制声音的例子,但是我找不到关于多声道超过2的任何信息.我​​感兴趣的是将8个声道单独作为单声道源采样到在它们上执行一些简单的DSP.硬件设备是否会被视为一个混音器?8个通道表示为8行?我希望我的术语合适.

如果有人可以向我指出任何相关信息,我将不胜感激.谢谢!

java javasound audio-recording

7
推荐指数
1
解决办法
4190
查看次数

如何在Android中以"wav"格式录制语音

我在Android中编写了一段代码,以"3gpp"格式编码音频,但我需要编码为"wav".我提到了一些论坛和Android开发者网站,他们说Android不支持"wav"格式.我该如何做到这一点?

audio android audio-recording

7
推荐指数
0
解决办法
2万
查看次数

在Android中暂停和恢复录制音频

我正在使用MediaRecorder类在Android 2.3中开发录音应用程序.我有以下要求:

  1. 当发生中断时,例如在录制期间发生呼叫,暂停录制.
  2. 在中断结束后,我的录音活动的响应被调用,我必须从暂停时恢复录音.

我找不到任何MediaRecorder api来暂停和恢复录制.只有start()和stop()可用.
除了在中断之前和之后记录两个单独的文件然后再加入一个文件之外,还有其他方法可以实现吗?
任何帮助/建议将不胜感激.

Sneha John.

android audio-recording

7
推荐指数
1
解决办法
6757
查看次数

音频CMSampleBuffer格式

使用AVCaptureAudioDataOutput时,CMSampleBuffer中存储的数据是什么?它通过委托方法提供CMSampleBuffers –captureOutput:didOutputSampleBuffer:fromConnection:但是CMSampleBuffer里面有什么?PCM还是压缩?什么是采样率,通道数量等?如何将其用于从设备流式传输音频?谷歌搜索几个小时并没有帮助我.

提前致谢

core-audio audio-recording avfoundation audio-streaming ios

7
推荐指数
1
解决办法
4035
查看次数

我可以使用AVCaptureSession将AAC流编码到内存吗?

我正在编写一个iOS应用程序,通过网络传输视频和音频.

我使用AVCaptureSession用抢原始视频帧AVCaptureVideoDataOutput然后对其编码,在软件使用X264.这非常有效.

我想对音频做同样的事情,只是我不需要在音频方面那么多控制,所以我想使用内置的硬件编码器来产生AAC流.这意味着从Audio Toolbox层使用Audio Converter.为了做到这一点,我为AVCaptudeAudioDataOutput的音频帧添加了一个处理程序:

- (void)captureOutput:(AVCaptureOutput *)captureOutput
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
       fromConnection:(AVCaptureConnection *)connection 
{
    // get the audio samples into a common buffer _pcmBuffer
    CMBlockBufferRef blockBuffer = CMSampleBufferGetDataBuffer(sampleBuffer);
    CMBlockBufferGetDataPointer(blockBuffer, 0, NULL, &_pcmBufferSize, &_pcmBuffer);

    // use AudioConverter to
    UInt32 ouputPacketsCount = 1;
    AudioBufferList bufferList;
    bufferList.mNumberBuffers = 1;
    bufferList.mBuffers[0].mNumberChannels = 1;
    bufferList.mBuffers[0].mDataByteSize = sizeof(_aacBuffer);
    bufferList.mBuffers[0].mData = _aacBuffer;
    OSStatus st = AudioConverterFillComplexBuffer(_converter, converter_callback, (__bridge void *) self, &ouputPacketsCount, &bufferList, NULL);
    if (0 == st) { …
Run Code Online (Sandbox Code Playgroud)

aac audio-recording avfoundation ios avcapturesession

7
推荐指数
1
解决办法
5365
查看次数

如何在Cocoa应用程序中从WebView捕获声音

我正在编写一个具有WebView的Cocoa应用程序.(Mountain Lion上的Xcode 4.4)

我需要你的帮助来记录WebView中显示的网页的声音/音频.

我想将音频录制到文件中,该文件来自WebView,当它显示生成声音的网页时.

有没有简单的方法呢?如果你能给我任何建议,我将不胜感激.

谢谢.

macos cocoa core-audio audio-recording

7
推荐指数
0
解决办法
269
查看次数

用确切的时间戳记录音频

我想在 Android Wear 设备上录制原始音频,并将其与其他传感器数据(例如加速度计)完全同步。要录制原始音频,我使用AudioRecord,但如何确定音频流任何部分的正确时间戳?

基本问题是我从缓冲区获取原始音频帧,但没有关于这些帧在缓冲区中的时间长度、丢失的帧数等信息。

因此,为了获取我AudioRecord.read()在循环中调用的帧数据,但如何判断特定帧是何时录制的?

我可以看到三种确定时间戳的方法,但在我看来它们都是错误的:

  1. 调用之前或之后AudioRecord.startRecording(),通过调用获取当前系统时间SystemClock.elapsedRealtimeNanos(),然后根据采样率和帧大小计算每个chunk的时间。但是根据我的测试,在录制实际开始之前有一个明显的延迟。每当某些帧丢失时,例如当处理暂停片刻时,时间也会变得不同步。

  2. 获取之前或之后的当前系统时间AudioRecord.read()。但这可能不是记录这些数据的时间,这可能发生得更早一些。如果还没有可用的数据, read() 将阻塞并且之前获取的时间戳将完全错误。

  3. AudioRecord.getTimestamp()给出当前正在录制的帧的时间。但这不一定是我当前正在阅读的帧,我可能落后几帧,或者我可能错过了一些帧。根据初始测试,在开始后的一段时间内,时间戳只是零。

这会给我留下 6 个可能错误的时间戳,如下面的代码所示。这些中的任何一个甚至接近准确吗?

recorder = new AudioRecord(...)

// timeBeforeStart =  SystemClock.elapsedRealtimeNanos()
recorder.startRecording()
// timeAfterStart =  SystemClock.elapsedRealtimeNanos()

...

// timeBeforeRead =  SystemClock.elapsedRealtimeNanos()
// recorder.getTimestamp(frameTimeBeforeRead, AudioTimestamp.TIMEBASE_BOOTTIME)
recorder.read(myArray, 0, mySize);
// recorder.getTimestamp(frameTimeAfterRead, AudioTimestamp.TIMEBASE_BOOTTIME)
// timeAfterRead =  SystemClock.elapsedRealtimeNanos()
Run Code Online (Sandbox Code Playgroud)

以下哪种方法是确定与字节数组中的数据对应的时间戳的最准确方法?

是否有不同的方法来检索具有准确时间戳的原始音频数据?

java android audio-recording audiorecord wear-os

7
推荐指数
1
解决办法
489
查看次数