使用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(或它的助洗剂)将导致IllegalArgumentException从AudioFormat与传递一个配置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) 请帮助选择将任何mp3文件转换为特殊.wav的解决方案 - 我是Linux命令行工具的新手,所以现在对我来说很难.
我需要从任何mp3文件获得带有16khz单声道16bit声音属性的wav.我在努力
ffmpeg -i 111.mp3 -ab 16k out.wav,
但我得到的wav与mp3(22k)相同.
请帮助构建正确的命令行
我试图通过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文件
iOS通过某些USB音频设备录制问题.它无法可靠地再现(分批发生在每2000个〜2000-3000个记录中并且无声地消失),我们目前手动检查我们的音频是否有任何录音问题.它导致少量样本(1-20)被移动了一小部分,听起来像是一种"噼啪声".
它们看起来像这样:

接近:

接近:

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

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

奖励积分:在确定尽可能多的错误后,如何"修复"音频?
更多奖励积分:在iOS USB音频驱动程序/硬件中可能导致此问题的原因(假设它在那里).
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) 我正在为一个名为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) 你有30秒的音频文件采样率为44.1 KHz,并用8位量化; 计算这个文件的比特率和单声道和立体声版本的大小?
我们正在开发一个从外部麦克风录制声音的项目。出于分析目的,我们需要大约 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) 我想用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) 我正在使用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) sample-rate ×10
audio ×4
core-audio ×3
android ×2
macos ×2
mp3 ×2
algorithm ×1
alsa ×1
audiocontext ×1
audiotrack ×1
audiounit ×1
bit-depth ×1
bitrate ×1
compression ×1
getusermedia ×1
iphone ×1
java ×1
javascript ×1
quantization ×1
sox ×1
swift ×1
voip ×1
wav ×1