我正在开发一个项目,其中我使用了AudioUnitRender,它在模拟器中运行良好,但在设备中出现-50错误.
如果有人遇到类似的问题,请给我一些解决方案.
RIOInterface* THIS = (RIOInterface *)inRefCon;
COMPLEX_SPLIT A = THIS->A;
void *dataBuffer = THIS->dataBuffer;
float *outputBuffer = THIS->outputBuffer;
FFTSetup fftSetup = THIS->fftSetup;
uint32_t log2n = THIS->log2n;
uint32_t n = THIS->n;
uint32_t nOver2 = THIS->nOver2;
uint32_t stride = 1;
int bufferCapacity = THIS->bufferCapacity;
SInt16 index = THIS->index;
AudioUnit rioUnit = THIS->ioUnit;
OSStatus renderErr;
UInt32 bus1 = 1;
renderErr = AudioUnitRender(rioUnit, ioActionFlags,
inTimeStamp, bus1, inNumberFrames, THIS->bufferList);
NSLog(@"%d",renderErr);
if (renderErr < 0) {
return renderErr;
}
Run Code Online (Sandbox Code Playgroud)
有关样本大小和框架的数据......
bytesPerSample = sizeof(SInt16);
asbd.mFormatID = …Run Code Online (Sandbox Code Playgroud) 我已经构建了一个项目的独立应用程序版本,到目前为止只是一个VST/audiounit.我通过rtaudio提供音频支持.
我想使用rtmidi添加MIDI支持,但我不清楚如何同步音频和MIDI部分.
在VST/audiounit land中,我习惯于具有时间戳的MIDI事件,该时间戳指示从音频块的开始处的样本中的偏移.
rtmidi提供了自上次事件以来以秒为单位的增量时间,但我不确定如何抓住这些事件以及如何计算与音频线程中当前样本相关的时间.
插件主机如何做到这一点?
我可以理解事件在回放时的样本是如何准确的,但是在使用实时输入时它们是如何准确地采样的还不清楚.
rtaudio给了我一个回调函数.我将以低块大小运行(32个样本).我想我会将指向rtmidi实例的指针作为回调的userdata部分传递,然后调用midiin-> getMessage(&message); 在音频回调中,但我不确定这是否是线程敏感的.
非常感谢您给我的任何提示
我使用AudioFilePlayer音频单元遇到问题,在OS X 10.8上启用了应用程序沙盒.我有一个只有两个节点的AUGraph,由一个连接到DefaultOutput单元的AudioFilePlayer单元组成.目标(现在)是简单地播放单个音频文件.如果未启用沙盒,则一切正常.如果我启用沙盒,则AUGraphOpen()返回错误-3000(invalidComponentID).如果我从AUGraph中删除文件播放器节点,则错误消失,这至少意味着音频文件播放器导致问题.
这是我用来设置文件播放器节点的代码:
OSStatus AddFileToGraph(AUGraph graph, NSURL *fileURL, AudioFileInfo *outFileInfo, AUNode *outFilePlayerNode)
{
OSStatus error = noErr;
if ((error = AudioFileOpenURL((__bridge CFURLRef)fileURL, kAudioFileReadPermission, 0, &outFileInfo->inputFile))) {
NSLog(@"Could not open audio file at %@ (%ld)", fileURL, (long)error);
return error;
}
// Get the audio data format from the file
UInt32 propSize = sizeof(outFileInfo->inputFormat);
if ((error = AudioFileGetProperty(outFileInfo->inputFile, kAudioFilePropertyDataFormat, &propSize, &outFileInfo->inputFormat))) {
NSLog(@"Couldn't get format of input file %@", fileURL);
return error;
}
// Add AUAudioFilePlayer node
AudioComponentDescription fileplayercd …Run Code Online (Sandbox Code Playgroud) iPhone 5有三个麦克风 - 顶部正面,顶部背面和底部.我想同时记录所有这些信号处理.我试了好几天都没成功.
使用AVAudioSession,我可以看到麦克风:
NSLog(@"%@", [AVAudioSession sharedInstance].availableInputs);
"<AVAudioSessionPortDescription: 0x14554400, type = MicrophoneBuiltIn; name = iPhone Microphone; UID = Built-In Microphone; selectedDataSource = Back>"
NSLog(@"%@", [AVAudioSession sharedInstance].availableInputs[0].inputDataSources);
"<AVAudioSessionDataSourceDescription: 0x145afb00, ID = 1835216945; name = Bottom>",
"<AVAudioSessionDataSourceDescription: 0x145b1870, ID = 1835216946; name = Front>",
"<AVAudioSessionDataSourceDescription: 0x145b3650, ID = 1835216947; name = Back>"
Run Code Online (Sandbox Code Playgroud)
我可以使用AVAudioSessionPortDescription -setPreferredDataSource:error:来记录三个中的一个.但我不能同时记录多个.如果我将输入通道的数量设置为2,我会从同一个麦克风获得两个相同的音轨.
AVAudioRecorder有一个属性channelAssignments,这似乎像它应该工作,但AVAudioSession inputNumberOfChannels和maximumInputNumberOfChannels都为1.该物业channelAssignments是专为具有多通道的辅助麦克风.
我尝试使用低级AudioUnit,但我得到了相同的结果.我在AudioUnit上找不到任何属性来更改输入源.
任何帮助,将不胜感激.
简而言之: 如何在iOS中进行时间拉伸和音高转换?
详细地:
我想做什么?
该应用程序将显示的视频缩略图的用户选择一定范围内的帧从视频文件.
我要申请的坡道缓莫,仅在选定的持续时间或帧的视频.
Ramp Slow Mo:动态地延长(时间拉伸+音高变化).我必须在一个for循环中改变时间和音高,比如10次迭代.它只不过是英文字母"U"的行为.所以,我会增加时间和音调并减少它们.
我怎么尝试:
分析:
到目前为止,我发现OpenAl或Audio Units(单独使用AUVarispeed或者同时使用AUTimePitch和Time Rate)可以提供帮助.分割视频和音频后,我将使用OpenAL或Audio Units继续进行音频URL.
我的问题: …
我正在使用EPSSampler在我的小iOS应用程序中播放一些笔记.除了通过振铃设置而不是系统音量设置控制声音之外,它的效果很好.问题是,如果铃声关闭,我的应用程序没有声音.
我能找到的最接近的是这个问题,但我无法将该解决方案完全转化为我的解决方案,因为我无法将其与EPSSampler的代码相匹配.任何见解?
编辑为了澄清,唯一专门处理音频的代码包含在EPSSampler类中,我的app只是实例,加载AUSampler预设,并调用EPSSampler中的音符播放方法,因此解决方案需要在EPSSampler中更改某些内容而不是在我的应用程序 - 这就是为什么我没有发布任何源代码.
我正在为iPhone创作一种乐器.在我的应用程序中,当我触摸CALayer时,会弹奏一个音符,并且该音符会在音符持续时间内摆动.
这一切都在iOS 4.1上完美运行,但是我刚刚升级到iOS 5.0.1,并且如果我连续按下多个音符,则会遇到严重的滞后问题.在经历了很多痛苦之后,我将其缩小到以下针对触摸的CALayer的摆动动画代码.
// here is an example wiggle
CABasicAnimation *wiggle = [CABasicAnimation animationWithKeyPath:@"transform"];
wiggle.duration = 0.1;
//wiggle.repeatCount = 1e100f;
wiggle.repeatCount = 100;
wiggle.autoreverses = YES;
wiggle.toValue = [NSValue valueWithCATransform3D:CATransform3DRotate(fret.fretLayer.transform,0.2, 0.0 ,1.0 ,2.0)]; //angle, x , y , z
wiggle.fromValue = [NSValue valueWithCATransform3D:CATransform3DRotate(fret.fretLayer.transform,-0.2, 0.0 ,1.0 ,2.0)]; //angle, x , y , z
// doing the wiggle
[note.noteLayer addAnimation:wiggle forKey:@"wiggle"];
Run Code Online (Sandbox Code Playgroud)
如果我阻挡了动画添加到图层的最后一行,则所有延迟都会立即消失.这感觉就像在主线程被阻塞不知何故,或者它不是在主线程上运行,但我试图调用与performSelectorOnMainThread功能:withObject:waitUntilDone:NO,它并没有区别.如果我非常快速地按下大量的音符,整个应用程序会暂停,然后大约一秒钟之后,就像它会自动赶上并突然播放所有声音,动画最终开始变得不稳定并且在此之后窒息.
有谁知道iOS 5中CABasicAnimation的任何异常问题?是否有任何其他可以尝试的动画API,可以在重复时为CALayers设置一个未指定的持续时间?任何人都有任何建议或猜测如何解决/问题可能源于什么?
编辑:我已经确定它绝对与动画的本质无关.我用简单地淡化颜色的代码替换了摆动代码,但是我仍然得到相同的滞后效果,因为音符有些滞后.
CABasicAnimation *wiggle = [CABasicAnimation animationWithKeyPath:@"backgroundColor"];
wiggle.duration = 2;
wiggle.toValue = (id)[UIColor whiteColor].CGColor ;
wiggle.fromValue = (id)[UIColor …Run Code Online (Sandbox Code Playgroud) 我已经搜索过并且已经完成了可以播放MIDI音符的OS X应用程序,但是当我在iOS中尝试时,什么都没发生.这是核心代码:
AUGraph graph;
AudioUnit synthUnit;
AUNode synthNode, outNode;
NewAUGraph(&graph);
AudioComponentDescription cd;
cd.componentManufacturer = kAudioUnitManufacturer_Apple;
cd.componentType = kAudioUnitType_MusicDevice;
cd.componentSubType = kAudioUnitSubType_MIDISynth;
AUGraphAddNode(graph, &cd, &synthNode);
cd.componentType = kAudioUnitType_Output;
cd.componentSubType = kAudioUnitSubType_GenericOutput;
AUGraphAddNode(graph, &cd, &outNode), "AUGraphAddNode");
CheckError(AUGraphOpen(graph), "AUGraphOpen");
AUGraphConnectNodeInput(graph, synthNode, 0, outNode, 0);
AUGraphNodeInfo(graph, synthNode, 0, &synthUnit);
AUGraphInitialize(graph);
CAShow(graph);
AUGraphStart(graph);
CFURLRef bankURL = ... //gs_instruments.dls
AudioUnitSetProperty(synthUnit,
kMusicDeviceProperty_SoundBankURL,
kAudioUnitScope_Global,
0,
&bankURL,
sizeof(bankURL));
static UInt32 kChannelMessage_NoteOn = 0x90;
UInt8 channel = 0;
UInt8 note = 60;
UInt32 velocity = 127;
MusicDeviceMIDIEvent(synthUnit,
kChannelMessage_NoteOn | channel, …Run Code Online (Sandbox Code Playgroud) 我正在创建一个使用Audio Units的应用程序,虽然Objective-C中有很多代码示例(包括Apple自己的aurioTouch等),但我试图在Swift中编写整个代码.
我已经能够设置我的AUGraph并通过它运行一些音频,但我似乎无法弄清楚渲染回调的语法.我尝试了几种方法:
方法1:直接创建AURenderCallback
let render : AURenderCallback = { (
inRefCon: UnsafeMutablePointer<Void>,
ioActionFlags: UnsafeMutablePointer<AudioUnitRenderActionFlags>,
inTimeStamp: UnsafePointer<AudioTimeStamp>,
inBufNumber: UInt32,
inNumberFrames: UInt32,
ioData: UnsafeMutablePointer<AudioBufferList>) -> OSStatus in
return noErr
}
Run Code Online (Sandbox Code Playgroud)
因为我只是想让它工作,所以除了在此时返回noErr之外我在这个回调中什么都不做.但是,编译器返回以下错误:
(UnsafeMutablePointer,UnsafeMutablePointer,UnsafePointer,UInt32,UInt32,UnsafeMutablePointer) - > OSStatus'无法转换为'AURenderCallback
文档中AURenderCallback的定义如下:
typealias AURenderCallback = (UnsafeMutablePointer<Void>,UnsafeMutablePointer<AudioUnitRenderActionFlags>,UnsafePointer<AudioTimeStamp>, UInt32, UInt32,UnsafeMutablePointer<AudioBufferList>) -> OSStatus
Run Code Online (Sandbox Code Playgroud)
它似乎与我输入的相同,尽管可能是我不明白文档要求的内容.
方法2:创建表示AURenderCallback的函数
func render(
inRefCon: UnsafeMutablePointer<Void>,
ioActionFlags: UnsafeMutablePointer<AudioUnitRenderActionFlags>,
inTimeStamp: UnsafePointer<AudioTimeStamp>,
inBufNumber: UInt32,
inNumberFrames: UInt32,
ioData: UnsafeMutablePointer<AudioBufferList>) -> OSStatus {
return noErr
}
Run Code Online (Sandbox Code Playgroud)
这不会将任何错误作为函数提供,但是当我将它放入inputProc参数中的AURenderCallbackStruct时,我收到一个错误:
找不到类型'AURenderCallbackStruct'的初始值设定项,它接受类型'的参数列表'(inputProc:(UnsafeMutablePointer,UnsafeMutablePointer,UnsafePointer,UInt32,UInt32,UnsafeMutablePointer) - > OSStatus,inputProcRefCon:nil)
我没有找到很多在Swift中创建AURenderCallbacks的例子,与Objective-C相比,语法似乎有很大差异.任何帮助,将不胜感激.
当使用kAudioUnitSubType_VoiceProcessingIO联合AVAudioPlayer这就导致了音频播放音量是相当低的。切换到kAudioUnitSubType_RemoteIO播放音量时,音量再次处于适当的高水平。
取决于顺序3步
A。配置VoiceProcessingIO音频单元B。创建一个音频播放器C。播放音频播放器音量在这三个步骤的顺序上有很大差异。
这是一个示例存储库(_不要奇怪为什么它叫audiokit,它是我使用不同音频sdks遇到的问题的集合,那就是一个集合存储库。但是这个特定的分支没有使用AudioKit)
https://github.com/mlostekk/AudioKitSampleRate/tree/issue/outputVolumeNoAudiokit(分支outputVolumeNoAudiokit)
在我们的应用中,常规情况由按钮表示VP3。首先设置语音处理输入回调,然后在以后创建音频播放器并进行播放。但是这种情况导致输出量非常低
订单是 A -> B -> C
按钮VP1(B -> C -> A)导致音量过大。
按钮VP2(B -> A -> C)也导致音量过大
该按钮NoVP1还使用A -> B -> C,这是正常情况,但实际上此处语音处理已禁用,但我们需要它。
有人能解释为什么这样的情况吗?以及如何解决VP3场景具有正常/不那么低的输出量
这似乎仅在较新的设备(iphone7及更高版本)上发生,即使在较旧的设备上也可以听到音量差异。越新越激烈
这不要紧,如果模式为.spokenAudio,.default或.measurement。它似乎kAudioUnitSubType_VoiceProcessingIO仅取决于。