我熟悉如何使用AudioUnit播放声音,并对数据包和帧的概念感到困惑.我想知道:
AudioUnit上下文中数据包和帧的定义是什么
每个数据包使用多个样本以及每帧多个数据包的交易是什么
我的理由是:在我到目前为止看到的所有代码示例中,数据包本质上是一个样本,对于16位立体声流,通常mBytesPerPacket = 4.mFramesPerPacket通常为1,制作一个帧,一个数据包和一个样本(都是立体声样本),相同的概念.
我期望数据包和/或帧是样本的缓冲区,即一组256或512个连续样本,驱动程序可以指向并线性读取.将帧/数据包大小减少到一个样本似乎会给负责播放数据的任何驱动程序带来不必要的压力.我错过了什么?
我正在iPad上为合成器制作一个控制器,我有4或5个信号要混合并发送到remoteIO渲染回调.现在我有两个选择:
我可以使用多声道混音器单元,但我不知道它是如何在内部工作的.它只是简单地将缓冲区加在一起并除以缓冲区的数量吗?因为这意味着每个的体积将大大减少.
我正在阅读http://www.vttoth.com/digimix.htm和http://atastypixel.com/blog/how-to-mix-audio-samples-properly-on-ios/,以正确的方式混合信号和我现在正考虑在remoteIO回调中手动进行混音.
有什么建议?
我的vDSP_zrip和AudioUnit使用和配置有问题.实际上我配置了AudioUnit来将打包数据保存为float.我创建一个循环缓冲区,当这个缓冲区已满时,我计算一个fft.我有结果,但我不明白为什么fft输出不好(参见图)
AudioUnit配置:
// describe format
AudioStreamBasicDescription audioFormat;
audioFormat.mSampleRate = 44100;
audioFormat.mFormatID = kAudioFormatLinearPCM;
audioFormat.mFormatFlags = kAudioFormatFlagsNativeEndian|kAudioFormatFlagIsPacked|kAudioFormatFlagIsFloat|kAudioFormatFlagIsNonInterleaved;
audioFormat.mFramesPerPacket = 1;
audioFormat.mChannelsPerFrame = 1; // mono
audioFormat.mBitsPerChannel = sizeof(float) * 8;
audioFormat.mBytesPerFrame = audioFormat.mChannelsPerFrame * sizeof(float);
audioFormat.mBytesPerPacket = audioFormat.mFramesPerPacket * audioFormat.mBytesPerFrame;
Run Code Online (Sandbox Code Playgroud)
循环缓冲区:
_audioSample = new AudioSample(8192, 44100);
// in recording callback :
for(int i = 0; i < bufferList.mNumberBuffers; ++i)
{
if(!status)
{
if(_sample->needData())
_sample->put((float*)bufferList.mBuffers[i].mData,
bufferList.mBuffers[i].mDataByteSize);
[...]
}
}
Run Code Online (Sandbox Code Playgroud)
vDSP电话:
// get a split complex vector (real signal divided into an even-odd …Run Code Online (Sandbox Code Playgroud) 这是上一个问题的后续问题: OSX CoreAudio:提前获取 inNumberFrames - 初始化时?
我试图找出 AudioUnit API 可能用于设置inNumberFrames或OSX中单个HAL音频组件实例的输入回调的首选 IO 缓冲区持续时间(不是插件!)。虽然我知道有一个关于如何通过AVAudioSession API 在 iOS 中实现此目的的综合文档,但我既无法弄清楚也找不到有关在 OSX 中设置这些值的文档,无论是哪个 API。网络上充满了专家但相互矛盾的陈述,从“有一个音频单元 API 来请求采样率和首选缓冲持续时间...... ”,到“您绝对可以获得帧数,但仅限于当前的帧数”。回拨电话... ”。
对于 OSX 中输入选择的采样率,是否有一种方法至少可以获取(并适应)系统提供的inNumberFrames或音频缓冲区长度?例如,对于 44.1k 及其倍数(这似乎部分有效),以及 48k 及其倍数(这似乎根本不起作用,我不知道允许调整缓冲区的 hack 在哪里这些值的长度)?这是控制台打印输出:
Available 7 Sample Rates
Available Sample Rate value : 8000.000000
Available Sample Rate value : 16000.000000
Available Sample Rate value : 32000.000000
Available Sample Rate value : 44100.000000
Available Sample Rate value : …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用AudioStreamBasicDescription在AudioUnit中设置属性.我正在尝试设置声音数据的格式.返回的错误代码是-10868.它仅发生在iOS 3.1.3或更低版本上,但适用于3.2或更高版本.因此它可以在模拟器中运行,运行4.2的iPod touch,但不是第一代iPod touch.
当我尝试设置AudioUnit音调单元的格式时发生错误.代码看起来像这样(来自cocoawithlove.com)
// Set the format to 32 bit, single channel, floating point, linear PCM
const int four_bytes_per_float = 4;
const int eight_bits_per_byte = 8;
AudioStreamBasicDescription streamFormat;
streamFormat.mSampleRate = sampleRate;
streamFormat.mFormatID = kAudioFormatLinearPCM;
streamFormat.mFormatFlags = kAudioFormatFlagsNativeFloatPacked | kAudioFormatFlagIsNonInterleaved;
streamFormat.mBytesPerPacket = four_bytes_per_float;
streamFormat.mFramesPerPacket = 1;
streamFormat.mBytesPerFrame = four_bytes_per_float;
streamFormat.mChannelsPerFrame = 1;
streamFormat.mBitsPerChannel = four_bytes_per_float * eight_bits_per_byte;
err = AudioUnitSetProperty (toneUnit,
kAudioUnitProperty_StreamFormat,
kAudioUnitScope_Input,
0,
&streamFormat,
sizeof(AudioStreamBasicDescription));
// err now has error code -10868
Run Code Online (Sandbox Code Playgroud)
我在标题中检查了这个错误代码对应于错误"kAudioUnitErr_FormatNotSupported".所以我想iOS 3.1上不支持我试图设置的格式?我在哪里可以找到支持的格式?我可以尝试其他格式的指针吗?
使用的渲染回调:
OSStatus …Run Code Online (Sandbox Code Playgroud) 根据我的理解,音频队列服务是比使用音频单元的音频单元更高级别的API.OpenAL还使用音频单元.因此,Audio Units是iOS中最低级别的音频API.
我需要录制声音,然后将自定义滤镜应用于音频流并播放.音频队列服务似乎适合录制,它们也可以用来播放.但是我仍然不确定他们是否允许将自己的算法应用于音频流,就像AURemoteIO音频单元那样.
我正在为iOS创建合成器.在玩完并试图学习核心音频之后,我遇到了一个我无法理解的问题.我的正弦波会定期发出咔哒声,我猜这与相位有关.我看过几本关于这个主题的指南和书籍,并且都表明我正确地做了.
如果有人愿意为我查看我的代码,我将不胜感激.
static OSStatus renderInput(void *inRefCon, AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList *ioData)
{
// Get a reference to the object that was passed with the callback
// In this case, the AudioController passed itself so
// that you can access its data.
AudioController *THIS = (AudioController*)inRefCon;
// Get a pointer to the dataBuffer of the AudioBufferList
AudioSampleType *outA = (AudioSampleType *)ioData->mBuffers[0].mData;
float freq = THIS->Frequency;
float phase = THIS->sinPhase;
float envValue;
float sinSignal;
// The …Run Code Online (Sandbox Code Playgroud) 我正在做一个涉及以多轨道格式播放歌曲的应用程序(鼓,人声,吉他,钢琴等......).我不需要对每个音轨进行任何精美的音频处理,我需要做的就是播放,暂停和静音/取消静音.
我一直在使用AVAudioPlayer的多个实例,但在进行设备测试时,我注意到首次播放时曲目的播放效果非常不同步.此外,当我暂停并播放曲目时,它们会继续变得更加不同步.经过一番研究后,我意识到AVAudioplayer只有太多的延迟,不能用于我的应用程序.
在我的应用程序中,我基本上有一个AVAudioPlayers的NSArray,我会循环播放每个或暂停/停止每个,我敢肯定这是导致它在设备上失去同步的原因.
看起来Apple的音频混音器对我来说效果很好,但是当我尝试实现它时,我得到一个我无法弄清楚的EXC_BAD_ACCESS错误.
我知道答案是使用OpenAL或音频单元,但是当我需要做的就是同时播放5个.mp3音轨时,似乎没有必要花几个星期来学习这些.有没有人对如何做到这一点有任何建议?谢谢
最近,我正在看aurioTouch.但我无法理解这句话:
OSStatus err = AudioUnitRender (THIS-> rioUnit, ioActionFlags, inTimeStamp, 1, inNumberFrames, ioData);
Run Code Online (Sandbox Code Playgroud)
根据apple documentaion解释:启动音频单元的渲染周期.但我觉得很暧昧.怎么办?
我想在播放(渲染)过程中重新安排AUGraph中的节点.特别是,我试图在这两个设置之间切换:
(需要流转换器,因为带通滤波器使用浮点格式)
两种设置均经过测试并独立工作 ; 即,如果我从给定的设置(节点连接)开始,图表将正确呈现.但是当我在播放过程中尝试重新排列节点时,出现了问题.
我的连接代码是这样的:
void enableBandpassFilter(Boolean enable)
{
OSStatus result;
if (enable) {
// [ A ] Enable
// Connect mixer to converter0
result = AUGraphConnectNodeInput(processingGraph, // (in) graph
mixerNode, // (in) src node
0, // (in) src output number
converterNode0, // (in) dst node
0); // (in) dst input number
if ( result != noErr ){
DLog(@"AUGraphConnectNodeInput() Failed for mixer->converter0");
}
// Connect converter0 to …Run Code Online (Sandbox Code Playgroud) audiounit ×10
ios ×8
core-audio ×7
audio ×3
audioqueue ×1
cocoa ×1
frame ×1
iphone ×1
macos ×1
mixing ×1
objective-c ×1
openal ×1
packet ×1
synthesis ×1
synthesizer ×1