我正在使用AUGraphAudio Units API在我的iOS应用中播放和录制音频.现在,当一个AUGraph无法启动以下错误时,我遇到了一个罕见的问题:
result = kAUGraphErr_CannotDoInCurrentContext(-10863)
当我们尝试调用AUGraphStart为音频播放设置的时间时,错误发生了不可预测的错误:
(BOOL)startRendering
{
if (playing) {
return YES;
}
playing = YES;
if (NO == [self setupAudioForGraph:&au_play_graph playout:YES]) {
print_error("Failed to create play AUGraph",0);
playing = NO;
return NO;
}
//result = kAUGraphErr_CannotDoInCurrentContext (-10863)
OSStatus result = AUGraphStart(au_play_graph);
if (noErr != result) {
print_error("AUGraphStart", result);
playing = NO;
}
return playing;
}
Run Code Online (Sandbox Code Playgroud)
这是我们从文档中得到的:
为了避免在渲染线程中旋转或等待(一个坏主意!),许多对AUGraph的调用都可以返回:kAUGraphErr_CannotDoInCurrentContext.仅当从其渲染回调调用AUGraph API时才会生成此结果.这意味着它所需的锁在那时由另一个线程保持.如果您看到此结果代码,通常可以再次尝试操作 - 通常是NEXT渲染周期(因此同时可以清除锁定),或者您可以将该调用委托给应用程序中的另一个线程.你不应该旋转或暂停渲染线程.
此结果代码只是一种暂时状态,只要您的其他线程对AUGraph(具有锁定)的调用完成,它就会通过.
在我的情况下,我只是开始AUGraph,它是新的,刚刚创建.如何调试案例以及可能存在的潜在问题?
我正在尝试用Swift Playground中的默认正弦波作为声音播放短音符序列.稍后我会想用Soundfont取代声音,但此刻我会对产生一些声音感到满意.
我希望这是一个像midi一样的序列,可以直接控制音符,而不是纯粹的音频.在AudioToolbox似乎提供我所期待的,但我有麻烦完全了解它的用法.这是我目前正在尝试的
import AudioToolbox
// Creating the sequence
var sequence:MusicSequence = nil
var musicSequence = NewMusicSequence(&sequence)
// Creating a track
var track:MusicTrack = nil
var musicTrack = MusicSequenceNewTrack(sequence, &track)
// Adding notes
var time = MusicTimeStamp(1.0)
for index:UInt8 in 60...72 {
var note = MIDINoteMessage(channel: 0,
note: index,
velocity: 64,
releaseVelocity: 0,
duration: 1.0 )
musicTrack = MusicTrackNewMIDINoteEvent(track, time, ¬e)
time += 1
}
// Creating a player
var musicPlayer:MusicPlayer = nil
var player = …Run Code Online (Sandbox Code Playgroud) 
如何在iOS中录制语音时以编程方式生成音频波形?
我正在研究iOS中的语音调制音频...一切正常......只需要一些最简单的方法就可以在检测噪声上生成音频波形...
请不要参考我的代码教程... speakhere和auriotouch ...我需要一些来自本机应用程序开发人员的最佳建议.
我录制了音频,录制后我播放了它.我创建了波形和附加截图.但它必须在视图中被描绘为录音正在进行中
-(UIImage *) audioImageGraph:(SInt16 *) samples
normalizeMax:(SInt16) normalizeMax
sampleCount:(NSInteger) sampleCount
channelCount:(NSInteger) channelCount
imageHeight:(float) imageHeight {
CGSize imageSize = CGSizeMake(sampleCount, imageHeight);
UIGraphicsBeginImageContext(imageSize);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(context, [UIColor blackColor].CGColor);
CGContextSetAlpha(context,1.0);
CGRect rect;
rect.size = imageSize;
rect.origin.x = 0;
rect.origin.y = 0;
CGColorRef leftcolor = [[UIColor whiteColor] CGColor];
CGColorRef rightcolor = [[UIColor redColor] CGColor];
CGContextFillRect(context, rect);
CGContextSetLineWidth(context, 1.0);
float halfGraphHeight = (imageHeight / 2) / (float) channelCount ;
float centerLeft = halfGraphHeight;
float centerRight = (halfGraphHeight*3) ; …Run Code Online (Sandbox Code Playgroud) 在测试过程中,客户注意到,当拔下耳机时,iPhone中的视频播放会暂停.他想要类似的音频播放功能,也许还能弹出一条消息.
有没有人知道是否有某种类型的事件我可以联系到这个可能吗?
现在,当用户按下按钮时,我会播放自定义相机快门声.
但是,如果可能的话,我宁愿使用默认播放的相机快门声,只要您使用iPhone拍照.
有没有办法可以访问并使用默认的iPhone相机快门声?如果是,那么它实际位于何处?
我需要找出它的文件路径,以便我可以使用它与下面的代码,只需更改输入pathForResource:
NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:@"shutter" ofType: @"wav"];
NSURL *fileURL = [[NSURL alloc] initFileURLWithPath:soundFilePath ];
self.myAudioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:nil];
[self.myAudioPlayer play];
Run Code Online (Sandbox Code Playgroud)
谢谢您的帮助.
我需要从文件中提取音频表级别,以便在播放音频之前渲染级别.我知道AVAudioPlayer可以在播放音频文件时获取此信息
func averagePower(forChannel channelNumber: Int) -> Float.
Run Code Online (Sandbox Code Playgroud)
但在我的情况下,我想[Float]事先获得一个米级.
(前言:这是我关于Stack Overflow的第一个与音频相关的问题,所以我会尽可能地尽力说出来.编辑欢迎.)
我正在创建一个允许用户循环播放音乐的应用程序.目前,我们的原型允许这些"循环标记"(作为UISliders实现)每秒捕捉一次,指定循环的开始和结束.显然,在循环音乐时,秒是一种非常粗暴的方式来处理这个,所以我想用beats代替.
除了为UISliders标记节拍之外,我不想做任何其他事情:
loadMusic方法提供音频文件.setNumberOfTickMarks:方法.不幸的是,我通过Google和SO遇到的大部分结果都产生了更多高级的节拍检测库,就像混音器会使用的那样.在我的情况下矫枉过正.
这是CoreMedia,AVFoundation还是AudioToolbox可以处理的东西?如果没有,是否有其他库可以处理这个?我对Apple文档的研究只得到了相关的结果......对于MIDI文件.但Apple自己的软件具有这样的功能,例如iMovie的snap-to-beats功能.
任何指导,代码或摘要在这一点上都会非常有用.
编辑:经过多一点挖掘后,我正在寻找的正确术语似乎是起始检测.
我在4.3.2,5.0和5.1模拟器中运行iOS程序,我在AudioToolbox中遇到了一个奇怪的内部异常.我在Xcode中设置了一个断点(Xcode 4.3.1,在10.7.3上运行),用于所有异常,调试器在调用期间断开AudioServicesCreateSystemSoundID():
SystemSoundID soundID;
OSStatus errorCode = AudioServicesCreateSystemSoundID(soundFileURLRef, &soundID);
// ^ boom. ^
Run Code Online (Sandbox Code Playgroud)
回溯:
(lldb) bt
* thread #1: tid = 0x1f03, 0x9000e230 libc++abi.dylib`__cxa_throw, stop reason = breakpoint 1.2
frame #0: 0x9000e230 libc++abi.dylib`__cxa_throw
frame #1: 0x00144193 AudioToolbox`ID3ParserHandle::ID3ParserHandle(void*, long (*)(void*, unsigned long, unsigned long, unsigned long, void**, unsigned long*)) + 259
frame #2: 0x001442de AudioToolbox`ID3ParserOpen + 62
frame #3: 0x0006c0e7 AudioToolbox`MPEGAudioFile::ParseID3Tags() + 87
frame #4: 0x0006c2ba AudioToolbox`MPEGAudioFile::ParseAudioFile() + 26
frame #5: 0x00015153 AudioToolbox`AudioFileOpenWithCallbacks + 371
frame #6: 0x00027020 AudioToolbox`_ZL15VerifyAndMapURLPK7__CFURLRx …Run Code Online (Sandbox Code Playgroud) 我只想获得音频文件中的标记列表.我认为这将是一项不太难的简单的共同任务.但是,我几乎找不到任何示例代码或文档,所以我最终得到了这个:
private func getMarkers(_ url: CFURL) -> AudioFileMarkerList {
var file: AudioFileID?
var size: UInt32 = 0
var markers = AudioFileMarkerList()
AudioFileOpenURL(url, .readPermission, kAudioFileWAVEType, &file)
AudioFileGetPropertyInfo(file!, kAudioFilePropertyMarkerList, &size, nil)
AudioFileGetProperty(file!, kAudioFilePropertyMarkerList, &size, &markers)
return markers
}
Run Code Online (Sandbox Code Playgroud)
可悲的是,这不起作用:error: memory read failed for 0x0.
我只是想不通问题.我检查了网址和大小(两者都有效),但总是无法检索标记.任何帮助都会很棒!
编辑: 这种工作,但所有的数据是完全错误的,我无法理解单个音频文件如何有多个标记的AudioFileMarkerLists:
private func getMarkers(_ url: CFURL) -> [AudioFileMarkerList] {
var file: AudioFileID?
var size: UInt32 = 0
AudioFileOpenURL(url, .readPermission, kAudioFileWAVEType, &file)
AudioFileGetPropertyInfo(file!, kAudioFilePropertyMarkerList, &size, nil)
let length = NumBytesToNumAudioFileMarkers(Int(size))
var markers = [AudioFileMarkerList](repeating: AudioFileMarkerList(), …Run Code Online (Sandbox Code Playgroud) 我正在研究记录用户音频的应用程序,使用数据写入文件AudioToolbox并处理这些数据.在分析中,我看到AudioToolbox录制中发生了很多错误.其中几乎一半是-38 kAudioFileNotOpenError从AudioFileWriteBytes()通话中返回的错误.
现在似乎没有任何理由发生这种情况:用户开始录制,一切顺利,然后连续10-80次记录错误.在分析中,没有用户操作,例如转到后台或暂停录制(我们有此功能).
我在线研究了信息,但没有找到有关错误的更多信息.
我发布了所有录制代码(带有剥离的未使用或分析代码),因为除了-38 kAudioFileNotOpenError我有一堆其他错误,这可能意味着我可能以AudioToolbox错误的方式使用.以下是最重要的错误:
AudioFileWriteBytes()返回-38 kAudioFileNotOpenError错误:( [1]代码中) - 约50%的错误AudioUnitRender()返回-10863 kAudioUnitErr_CannotDoInCurrentContext错误([2]代码中) - ~5%AudioFileWriteBytes()返回1868981823 kAudioFileDoesNotAllow64BitDataSizeError错误:( [1]代码中) - ~4%AudioUnitRender()返回-1错误([2]代码中) - ~3%任何帮助,评论或建议将非常有帮助!
这是代码(它也可以在GitHub上找到:https://github.com/derpoliuk/SO-AudioToolbox-error-quesion):
class Recorder {
static let shared = Recorder()
private static let sampleRate: Float64 = 16000
var processAudioData: ((Data) -> ())?
fileprivate var remoteIOUnit: …Run Code Online (Sandbox Code Playgroud) audiotoolbox ×10
ios ×9
audio ×4
swift ×4
objective-c ×3
avfoundation ×2
iphone ×2
audiounit ×1
cocoa ×1
cocoa-touch ×1
core-audio ×1
core-media ×1
exception ×1
headphones ×1
iphone-4 ×1
iphone-5 ×1