标签: audiotoolbox

在调用AUGraphStart进行播放时接收kAUGraphErr_CannotDoInCurrentContext

我正在使用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,它是新的,刚刚创建.如何调试案例以及可能存在的潜在问题?

audiotoolbox audiounit ios

114
推荐指数
1
解决办法
1627
查看次数

在Swift Playground中播放音符

我正在尝试用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, &note)
    time += 1
}

// Creating a player    

var musicPlayer:MusicPlayer = nil
var player = …
Run Code Online (Sandbox Code Playgroud)

audio audiotoolbox ios swift swift-playground

20
推荐指数
2
解决办法
2605
查看次数

如何在iOS中录制语音时以编程方式生成音频波形?

在此输入图像描述

如何在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 core-audio avfoundation audiotoolbox ios

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

拔下耳机时是否有事件?

在测试过程中,客户注意到,当拔下耳机时,iPhone中的视频播放会暂停.他想要类似的音频播放功能,也许还能弹出一条消息.

有没有人知道是否有某种类型的事件我可以联系到这个可能吗?

iphone objective-c headphones audiotoolbox ios

16
推荐指数
2
解决办法
9539
查看次数

需要访问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)

谢谢您的帮助.

objective-c audiotoolbox ios iphone-4 iphone-5

15
推荐指数
2
解决办法
5983
查看次数

从音频文件中提取仪表级别

我需要从文件中提取音频表级别,以便在播放音频之前渲染级别.我知道AVAudioPlayer可以在播放音频文件时获取此信息

func averagePower(forChannel channelNumber: Int) -> Float.
Run Code Online (Sandbox Code Playgroud)

但在我的情况下,我想[Float]事先获得一个米级.

audio avaudioplayer audiotoolbox ios swift

14
推荐指数
2
解决办法
1787
查看次数

使用AVFoundation/CoreMedia /其他框架来检测节拍/开始

(前言:这是我关于Stack Overflow的第一个与音频相关的问题,所以我会尽可能地尽力说出来.编辑欢迎.)

我正在创建一个允许用户循环播放音乐的应用程序.目前,我们的原型允许这些"循环标记"(作为UISliders实现)每秒捕捉一次,指定循环的开始和结束.显然,在循环音乐时,秒是一种非常粗暴的方式来处理这个,所以我想用beats代替.

除了为UISliders标记节拍之外,我不想做任何其他事情:

  • 为我们的loadMusic方法提供音频文件.
  • 通过库运行它来检测节拍或它们之间的间隔(可能).
  • 将该值输入滑块的setNumberOfTickMarks:方法.
  • 利润!

不幸的是,我通过Google和SO遇到的大部分结果都产生了更多高级的节拍检测库,就像混音器会使用的那样.在我的情况下矫枉过正.

这是CoreMedia,AVFoundation还是AudioToolbox可以处理的东西?如果没有,是否有其他库可以处理这个?我对Apple文档的研究只得到了相关的结果......对于MIDI文件.但Apple自己的软件具有这样的功能,例如iMovie的snap-to-beats功能.

任何指导,代码或摘要在这一点上都会非常有用.

编辑:经过多一点挖掘后,我正在寻找的正确术语似乎是起始检测.

audio cocoa avfoundation audiotoolbox core-media

12
推荐指数
1
解决办法
1046
查看次数

为什么AudioServicesCreateSystemSoundID在内部抛出异常但返回0作为错误代码?

我在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)

exception objective-c audiotoolbox ios

12
推荐指数
2
解决办法
2605
查看次数

Swift:从url中检索音频文件标记列表?

我只想获得音频文件中的标记列表.我认为这将是一项不太难的简单的共同任务.但是,我几乎找不到任何示例代码或文档,所以我最终得到了这个:

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 ios swift

10
推荐指数
1
解决办法
579
查看次数

AudioFileWriteBytes(AudioToolbox)失败,错误代码为-38 kAudioFileNotOpenError

我正在研究记录用户音频的应用程序,使用数据写入文件AudioToolbox并处理这些数据.在分析中,我看到AudioToolbox录制中发生了很多错误.其中几乎一半是-38 kAudioFileNotOpenErrorAudioFileWriteBytes()通话中返回的错误.

现在似乎没有任何理由发生这种情况:用户开始录制,一切顺利,然后连续10-80次记录错误.在分析中,没有用户操作,例如转到后台或暂停录制(我们有此功能).

我在线研究了信息,但没有找到有关错误的更多信息.

我发布了所有录制代码(带有剥离的未使用或分析代码),因为除了-38 kAudioFileNotOpenError我有一堆其他错误,这可能意味着我可能以AudioToolbox错误的方式使用.以下是最重要的错误:

  1. AudioFileWriteBytes()返回-38 kAudioFileNotOpenError错误:( [1]代码中) - 约50%的错误
  2. AudioUnitRender()返回-10863 kAudioUnitErr_CannotDoInCurrentContext错误([2]代码中) - ~5%
  3. AudioFileWriteBytes()返回1868981823 kAudioFileDoesNotAllow64BitDataSizeError错误:( [1]代码中) - ~4%
  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)

audio cocoa-touch audiotoolbox ios swift

10
推荐指数
1
解决办法
229
查看次数