标签: sample-rate

AudioTrack采样率不一致

使用AudioTrack进行播放时,我有时需要重新采样不符合AudioTrack支持的采样率的音频.在这样做时,我需要在当前音频配置下确定当前设备下AudioTrack支持的最大采样率.

由于AudioTrack的允许采样率很难记录,我决定窥探源代码AudioTrack并发现这个惊人的界限:

private static final int SAMPLE_RATE_HZ_MAX = 96000;
Run Code Online (Sandbox Code Playgroud)

AudioTrack无论设备的实际播放能力如何,实例似乎都在应用96 KHz的硬限制.

更令人困惑的是在AudioFormat类中,我将其传递给AudioTrack包含以下行的构造函数(API 21):

if ((sampleRate <= 0) || (sampleRate > 192000)) {
Run Code Online (Sandbox Code Playgroud)

在它的setSampleRate()方法.现在这是192 KHz的硬限制.所以,传递> 192千赫到的AudioFormat(或它的助洗剂)将导致IllegalArgumentExceptionAudioFormat与传递一个配置192千赫<X <96 kHz采样率的AudioFormat成AudioTrack也将引发IllegalArgumentException.


到目前为止,我发现最令人困惑的是getNativeOutputSampleRate()AudioTrack中的方法实际上确实返回了正确的输出采样率(好吧,鉴于它直接从本机层运行,但不那么令人惊讶).

并且最重要的是,该方法setPlaybackRate()声称:

有效采样率范围是1 Hz到getNativeOutputSampleRate(int)返回值的两倍.

事实上,我确实尝试过,它有效吗?请考虑以下代码段:

int nativeRate = AudioTrack.getNativeOutputSampleRate(AudioManager.STREAM_MUSIC);

android.util.Log.i("UI", "Native stream rate: " + nativeRate + " Hz");

// Build audio attributes

AudioAttributes.Builder attribBuilder = new AudioAttributes.Builder();

attribBuilder.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC);
attribBuilder.setUsage(AudioAttributes.USAGE_MEDIA); …
Run Code Online (Sandbox Code Playgroud)

java android sample-rate audiotrack

30
推荐指数
1
解决办法
2184
查看次数

如何将任何mp3文件转换为.wav 16khz mono 16bit

请帮助选择将任何mp3文件转换为特殊.wav的解决方案 - 我是Linux命令行工具的新手,所以现在对我来说很难.

我需要从任何mp3文件获得带有16khz单声道16bit声音属性的wav.我在努力

ffmpeg -i 111.mp3 -ab 16k out.wav,

但我得到的wav与mp3(22k)相同.

请帮助构建正确的命令行

mp3 wav sample-rate

22
推荐指数
2
解决办法
4万
查看次数

更改AudioContext的采样率(getUserMedia)

我试图通过getUserMedia录制48000Hz录音.但没有运气.返回的音频MediaStream返回44100Hz.我怎样才能将其设置为48000Hz?

以下是我的代码片段:

var startUsermedia = this.startUsermedia;

            navigator.getUserMedia({ 
                audio: true, 
                //sampleRate: 48000 
            }, startUsermedia, function (e) {
                console.log('No live audio input: ' + e);
            });
Run Code Online (Sandbox Code Playgroud)

startUsermedia函数:

startUsermedia: function (stream) {
            var input = audio_context.createMediaStreamSource(stream);
            console.log('Media stream created.');
            // Uncomment if you want the audio to feedback directly
            //input.connect(audio_context.destination);
            //__log('Input connected to audio context destination.');

            recorder = new Recorder(input);
            console.log('Recorder initialised.');
        },
Run Code Online (Sandbox Code Playgroud)

我尝试更改AudioContext的属性sampleRate,但没有运气.

如何将sampleRate更改为48000Hz?

编辑:我们现在也可以使用闪存解决方案,可以记录和导出48000Hz的wav文件

javascript sample-rate getusermedia audiocontext

22
推荐指数
4
解决办法
2万
查看次数

如何检测这些音频异常?

iOS通过某些USB音频设备录制问题.它无法可靠地再现(分批发生在每2000个〜2000-3000个记录中并且无声地消失),我们目前手动检查我们的音频是否有任何录音问题.它导致少量样本(1-20)被移动了一小部分,听起来像是一种"噼啪声".

它们看起来像这样:

波形异常

接近:

在此输入图像描述

接近:

在此输入图像描述

另一个,同一音频文件中其他地方的单个样本错误:

在此输入图像描述

问题是,如何在算法上检测这些(假设直接访问样本),同时不会触发高频音频的误报,如下所示:

在此输入图像描述

奖励积分:在确定尽可能多的错误后,如何"修复"音频?

更多奖励积分:在iOS USB音频驱动程序/硬件中可能导致此问题的原因(假设它在那里).

algorithm audio signal-processing sample-rate

18
推荐指数
2
解决办法
1935
查看次数

Android AudioRecord - 第二次不会初始化

Hej,我目前正试图让AudioRecord工作.因为我需要一个更大的项目.但它似乎搞得很多.我一直在尝试很多东西,所以当我追踪这个bug时我回到了基础.我正在使用我的三星Galaxy S作为我的调试设备.

我的问题是,第一次重启我的设备后,我可以初始化我创建的AudioRecord对象没有问题.但是第二次运行它时,它不会初始化AudioRecord对象.我已经尝试了几个频率,fyi.

这是我的代码:

package android.audiorecordtest;

import android.app.Activity;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class AudioRecordTest extends Activity {

    int frequency;
    AudioRecord audRec;
    TextView txtVw;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        txtVw = (TextView) findViewById(R.id.txtVw);


        frequency=8000;
        int bufferSize=(AudioRecord.getMinBufferSize(frequency, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT))*2;
        if (bufferSize>0) {
            audRec = new AudioRecord(MediaRecorder.AudioSource.MIC, frequency, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSize);
                int status = audRec.getState();
        if (status == …
Run Code Online (Sandbox Code Playgroud)

audio android alsa sample-rate android-audiorecord

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

OS X/iOS - 使用AudioConverterFillComplexBuffer的缓冲区的采样率转换

我正在为一个名为XAL音频库编写CoreAudio后端.输入缓冲区可以具有各种采样率.我正在使用单个音频单元进行输出.想法是转换缓冲区并在将它们发送到音频单元之前将它们混合.

只要输入缓冲区具有与输出音频单元相同的属性(采样率,通道数等),一切都有效.因此,混合部分起作用.

但是,我坚持采样率和通道数转换.根据我的想法,这对于Audio Converter Services API来说是最容易的.我设法建造了一个转换器; 我们的想法是输出格式与输出单元格式相同,但可能会根据转换器的目的进行调整.

音频转换器已成功构建,但在调用时AudioConverterFillComplexBuffer(),我得到输出状态错误-50.

如果我能在这段代码上获得另一组眼球,我会很高兴.问题可能在下面的某个地方AudioConverterNew().变量stream包含传入(和传出)缓冲区数据,并包含传入(和传出)缓冲区数据的streamSize字节大小.

我做错了什么?

void CoreAudio_AudioManager::_convertStream(Buffer* buffer, unsigned char** stream, int *streamSize)
{
    if (buffer->getBitsPerSample() != unitDescription.mBitsPerChannel || 
        buffer->getChannels() != unitDescription.mChannelsPerFrame || 
        buffer->getSamplingRate() != unitDescription.mSampleRate)
    {
        printf("INPUT STREAM SIZE: %d\n", *streamSize);
        // describe the input format's description
        AudioStreamBasicDescription inputDescription;
        memset(&inputDescription, 0, sizeof(inputDescription));
        inputDescription.mFormatID = kAudioFormatLinearPCM;
        inputDescription.mFormatFlags = kLinearPCMFormatFlagIsPacked | kLinearPCMFormatFlagIsSignedInteger;
        inputDescription.mChannelsPerFrame = buffer->getChannels();
        inputDescription.mSampleRate = buffer->getSamplingRate();
        inputDescription.mBitsPerChannel = buffer->getBitsPerSample();
        inputDescription.mBytesPerFrame = (inputDescription.mBitsPerChannel …
Run Code Online (Sandbox Code Playgroud)

iphone macos core-audio sample-rate audio-converter

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

如何计算音频文件大小?

你有30秒的音频文件采样率为44.1 KHz,并用8位量化; 计算这个文件的比特率和单声道和立体声版本的大小?

audio quantization bitrate sample-rate

9
推荐指数
2
解决办法
6万
查看次数

AvaudioEngine - 以特定采样率录制语音 AvaudioEngine for Analysis

我们正在开发一个从外部麦克风录制声音的项目。出于分析目的,我们需要大约 5k Hz 的采样率。

我们正在使用AvAudioEngine来录制语音。我们知道 Apple 设备希望能够以特定速率进行录制,因此我们使用AVAudioConverter来降低采样率。

但正如您所知,它与压缩类似,因此我们降低采样率越低,文件大小和文件持续时间影响相同。目前正在发生什么(如果我错了,请纠正我)。

问题

**问题是降低采样率、缩短文件长度及其对计算和分析的影响。例如,1小时的录音被降级为45分钟。所以假设如果我们对 5 分钟的时间间隔进行分析,就会出错

对此最好的解决方案是什么?**

询问

我们在互联网上进行了搜索,但我们无法弄清楚installTap上的缓冲区大小有何影响?在当前代码中,我们将其设置为2688。

谁能澄清一下吗?

代码

let bus = 0
let inputNode = engine.inputNode

let equalizer = AVAudioUnitEQ(numberOfBands: 2)

equalizer.bands[0].filterType = .lowPass
equalizer.bands[0].frequency = 3000
equalizer.bands[0].bypass = false

equalizer.bands[1].filterType = .highPass
equalizer.bands[1].frequency = 1000
equalizer.bands[1].bypass = false
engine.attach(equalizer) //Attach equalizer

// Connect nodes
engine.connect(inputNode, to: equalizer, format: inputNode.inputFormat(forBus: 0))
engine.connect(equalizer, to: engine.mainMixerNode, format: inputNode.inputFormat(forBus: 0))

// call before creating converter because this changes …
Run Code Online (Sandbox Code Playgroud)

audio core-audio sample-rate swift avaudioengine

9
推荐指数
1
解决办法
349
查看次数

如何使用sox来压缩mp3?

我想用sox减少一些mp3音频的文件大小.我想我可以将立体声降低到只有1个声道(即单声道),降低采样率并减少比特深度.我觉得似乎sox不能做到这一点.这是真的还是我做得对吗?

$ sox -r 8000 -c 1 2008-12-28-2.MP3 foo.mp3
sox WARN formats: can't set sample rate 8000; using 44100
sox WARN formats: can't set 1 channels; using 2
Run Code Online (Sandbox Code Playgroud)

compression mp3 sox sample-rate bit-depth

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

在AUHAL上设置采样率

我正在使用Audio Unit Framework在mac os x上开发VOIP应用程序.在我的程序中,我设置了输入AUHAL并使用默认流格式(44.1kHz,32位/通道)从麦克风中捕获音频.在这种情况下,我的程序工作正常.

这是代码:

//The default setting in my program
CheckError(AudioUnitGetProperty(m_audCapUnit,
                                        kAudioUnitProperty_StreamFormat,
                                        kAudioUnitScope_Output,     //the value is 0
                                        inputBus,           //the value is 1
                                        &m_audCapUnitOutputStreamFormat,
                                        &propertySize),
                   "Couldn't get OutputSample ASBD from input unit") ;  

    //the inOutputSampleRate is 44100.0
        m_audCapUnitOutputStreamFormat.mSampleRate = inOutputSampleRate ; 

CheckError(AudioUnitSetProperty(m_audCapUnit,
                                        kAudioUnitProperty_StreamFormat,
                                        kAudioUnitScope_Output,
                                        inputBus,
                                        &m_audCapUnitOutputStreamFormat,
                                        propertySize),
                   "Couldn't set OutputSample ASBD on input unit"); 

//
Run Code Online (Sandbox Code Playgroud)

由于我正在开发VOIP应用程序,默认格式(44.1kHz,32位/通道)不适合我的程序,所以我想将采样率更改为8kHz.我写了这段代码来改变程序中的格式:

//......
    inOutputFormat.mSampleRate = 8000.  ;
    inOutputFormat.mFormatID = kAudioFormatLinearPCM ;
    inOutputFormat.mChannelsPerFrame = 2 ;
    inOutputFormat.mBitsPerChannel  = 16 ;
    inOutputFormat.mBytesPerFrame = 2 ;
    inOutputFormat.mBytesPerPacket = …
Run Code Online (Sandbox Code Playgroud)

macos voip core-audio sample-rate audiounit

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