我正在尝试录制混音器单元输出产生的声音.
目前,我的代码基于Apple MixerHost iOS应用程序演示:混音器节点连接到音频图形上的远程IO节点.
我尝试在混音器输出上的远程IO节点输入上设置输入回调.
我做错了什么,但我找不到错误.
这是下面的代码.这是在多通道混音器单元设置之后完成的:
UInt32 flag = 1;
// Enable IO for playback
result = AudioUnitSetProperty(iOUnit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Output,
0, // Output bus
&flag,
sizeof(flag));
if (noErr != result) {[self printErrorMessage: @"AudioUnitSetProperty EnableIO" withStatus: result]; return;}
/* can't do that because *** AudioUnitSetProperty EnableIO error: -1073752493 00000000
result = AudioUnitSetProperty(iOUnit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Input,
0, // Output bus
&flag,
sizeof(flag));
if (noErr != result) {[self printErrorMessage: @"AudioUnitSetProperty EnableIO" withStatus: result]; …Run Code Online (Sandbox Code Playgroud) 我正在开发一款应用程序,可以使用iOS 6.0 SDK分析来自iPhone/iPad上内置麦克风的传入音频.
我一直在用较低频率(即低于200赫兹)的低水平挣扎一段时间,我(在网上)发现其他人有相同的问题而没有任何问题的答案.
各种使用iOS音频工具的公司表示,(在iOS 6.0之前)有一个内置的低频滚降滤波器,它在较低的频率上引起这些低信号.但这些信号源也表明从iOS 6.0开始,它应该是可以关闭输入音频信号的这种自动低频滤波.
我已经浏览了音频单元头文件,Xcode中的音频文档以及与音频相关的示例代码,但没有成功.我已经使用了AudioUnit的不同参数和属性(提到了低通滤波器等)而没有解决问题.
有谁知道如何关闭iOS 6.0中RemoteIO输入的自动低频滚降滤波器?
好的,我知道还有其他帖子关于你怎么不能从OS X二进制文件中实际删除Objective-C符号,因为它们对于Obj-C来说是必要的,但我的情况有点不同.
我有一个二进制文件,它是一个包.它既可以用作VST插件,也可以用作AudioUnit插件.这个想法是二进制包含所有这两种格式的入口点,你只编译一次,然后将其命名一个副本" .VST "为VST版本,而" .component "为AU版本. (这是使用JUCE框架BTW.)
问题是对于AU方面,您必须导出Obj-C类以创建Cocoa UI视图.在VST方面,永远不会使用此类.但是如果你有像Ableton Live这样的主机允许你同时加载同一个插件的AU和VST版本,那么现在我们遇到了典型的Obj-C命名空间冲突问题.
在VST方面,特定的Obj-C类永远不会被使用.所以我想做的是使用"strip"从生成的二进制文件中删除那些Obj-C类.这仍然保留了为两种格式只编译一次的优点.
无论如何,我已经尝试过使用"strip -R stripfile.txt <path to binary>",其中stripfile.txt包含我想要删除的符号,但它始终无法说明在二进制文件中找不到符号.我已经尝试在条带文件中修改名称,但这没有帮助(或者我做错了).
以下是我想要剥离的相关符号,作为"nm -m"的输出:
000000000003bb00 (__TEXT,__text) non-external -[JuceDemoProjectAU description]
000000000003bb60 (__TEXT,__text) non-external -[JuceDemoProjectAU interfaceVersion]
000000000003ba00 (__TEXT,__text) non-external -[JuceDemoProjectAU uiViewForAudioUnit:withSize:]
0000000000b02398 (__DATA,__objc_data) external _OBJC_CLASS_$_JuceDemoProjectAU
0000000000b023c0 (__DATA,__objc_data) external _OBJC_METACLASS_$_JuceDemoProjectAU
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
顺便说一下,我随后能够动态注册有问题的类(使用唯一的名称),这也解决了这个问题.但是,如果我可以开始工作,我可以为现有的二进制文件部署解决方案.
我编写了以下AVAudioEngine代码,用于初始化我的一个自定义AUAudioUnit子类并将其连接到引擎的主混音器节点.
class AudioEngine {
let engine = AVAudioEngine()
init() {
let sess = AVAudioSession.sharedInstance()
try! sess.setCategory(AVAudioSessionCategoryPlayback)
try! sess.setActive(true)
let desc = AudioComponentDescription(componentType: kAudioUnitType_Generator, componentSubType: 0x00000001, componentManufacturer: 0x00000002, componentFlags: 0, componentFlagsMask: 0)
AUAudioUnit.registerSubclass(MyAudioUnit.self, as: desc, name: "MyAudioUnit", version: 2)
let format = engine.outputNode.outputFormat(forBus: 0)
engine.connect(engine.mainMixerNode, to: engine.outputNode, format: format)
AVAudioUnit.instantiate(with: desc, options: []) { (audiounit, error) in
guard let au = audiounit else { return }
self.engine.attach(au)
let stereoFormat = AVAudioFormat(standardFormatWithSampleRate: format.sampleRate, channels: 2)
// CRASHES HERE
self.engine.connect(au, to: …Run Code Online (Sandbox Code Playgroud) 使用3个AudioBuffers初始化(分配内存)和释放(释放)AudioBufferList的正确方法是什么?(我知道可能有多种方法可以做到这一点.)
我想使用这3个缓冲区来读取音频文件的连续部分并使用音频单元播放它们.
这是我的代码:我使用此代码通过使用音频单元记录iPhone输出音频,然后将输出保存在output.caf中,但output.caf文件为空,任何人都知道我该怎么办?输出音频文件为空
这是音频单元的初始化
-(void) initializaeOutputUnit
{
OSStatus status;
// Describe audio component
AudioComponentDescription desc;
desc.componentType = kAudioUnitType_Output;
desc.componentSubType = kAudioUnitSubType_RemoteIO;
desc.componentFlags = 0;
desc.componentFlagsMask = 0;
desc.componentManufacturer = kAudioUnitManufacturer_Apple;
// Get component
AudioComponent inputComponent = AudioComponentFindNext(NULL, &desc);
// Get audio units
status = AudioComponentInstanceNew(inputComponent, &audioUnit);
// Enable IO for recording
UInt32 flag = 1;
status = AudioUnitSetProperty(audioUnit,
kAudioOutputUnitProperty_EnableIO,
kAudioUnitScope_Input,
kInputBus,
&flag,
sizeof(flag));
// Enable IO for playback
status = AudioUnitSetProperty(audioUnit,
kAudioOutputUnitProperty_EnableIO,
kAudioUnitScope_Output,
kOutputBus,
&flag,
sizeof(flag));
// Describe format
AudioStreamBasicDescription audioFormat={0};
audioFormat.mSampleRate …Run Code Online (Sandbox Code Playgroud) RemoteIO设备有没有办法在iPhone 5上拿回麦克风?我可以配置AVAudioSession在前置麦克风或底部麦克风之间进行选择,但我找不到选择后置麦克风的方法.
在AVFoundation framework确定了使用视频录制的背部麦克风使用后置摄像头的时候,但我希望的方式来选择使用相同的CoreAudio的.那可能吗 ?
我正在使用a AVAssetReaderOutput来读取a中的样本AVAsset,对它们进行一些处理,并使用RemoteIO AU播放结果.
问题是,在调用AudioOutputUnitStop暂停播放后,在转到后台并返回前台后,调用后音频将不会再次启动AudioOutputUnitStart.这是由于copyNextSampleBuffer方法返回的错误,该错误AVAssetReaderOutput被称为渲染管道的一部分.
调用之后的status属性是,其属性为Error Domain = AVFoundationErrorDomain Code = -11847"Operation Interrupted"UserInfo = 0x1d8b6100 {NSLocalizedRecoverySuggestion =停止其他操作并再试一次.,NSLocalizedDescription = Operation Interrupted}AVAssetReadercopyNextSampleBufferAVAssetReaderStatusFailederror
我正在寻找一种解决方案,它不会强迫我在回到前台后重新初始化整个管道 - 希望有这样一个解决方案,AVAssetReaders可以在应用程序进入后台并返回...
笔记
AVAudioSession在AVAudioSessionDelegates endInterruptionWithFlags:事件和应用程序变为活动状态时将我设置为活动状态.无论我是否这样做都没有区别,得到同样的错误.一些代码:
AudioPlayer
@implementation AudioPlayer
...
// Audio Unit Setup
AudioComponentDescription desc;
desc.componentType = kAudioUnitType_Output;
desc.componentSubType = kAudioUnitSubType_RemoteIO;
desc.componentManufacturer = kAudioUnitManufacturer_Apple;
desc.componentFlags = 0;
desc.componentFlagsMask = 0;
AudioComponent defaultOutput …Run Code Online (Sandbox Code Playgroud) 我正在构建一个voip应用程序,我们需要从麦克风录制音频并以8kHz采样率发送到某处.现在我以默认采样率录制它,在我的情况下总是为44,4k.然后使用此算法将其手动转换为8k .
这种天真的方法产生了"正常"的质量,但我认为使用AudioUnit的原生下采样功能会好得多.
但是当我更改录音AudioUnit上的采样率属性时,它只输出静音帧(~0.0),我不知道为什么.
我已经提取了负责声音的应用程序部分.它应该从麦克风录制 - >写入环形缓冲区 - >播放缓冲区中的数据:
RecordingUnit:
import Foundation
import AudioToolbox
import AVFoundation
class RecordingUnit : NSObject
{
public static let AudioPacketDataSize = 160
public static var instance: RecordingUnit!
public var micBuffers : AudioBufferList?;
public var OutputBuffer = RingBuffer<Float>(count: 1 * 1000 * AudioPacketDataSize);
public var currentAudioUnit: AudioUnit?
override init()
{
super.init()
RecordingUnit.instance = self
micBuffers = AudioBufferList(
mNumberBuffers: 1,
mBuffers: AudioBuffer(
mNumberChannels: UInt32(1),
mDataByteSize: UInt32(1024),
mData: UnsafeMutableRawPointer.allocate(byteCount: 1024, alignment: 1)))
}
public func start() …Run Code Online (Sandbox Code Playgroud) 重写这个问题会更有吸引力.
我的问题是我无法从远程IO单元成功地将音频文件写入磁盘.
我采取的步骤是
打开一个mp3文件并将其音频提取到缓冲区.我根据图表的属性设置了一个asbd用于我的图形.我设置并运行我的图形循环提取的音频和声音成功地从扬声器出来!
我遇到的困难是从远程IO回调中获取音频样本并将其写入磁盘上的音频文件,我正在使用ExtAudioFileWriteASync.
音频文件确实被写入并且与原始mp3有一些可听见的相似之处,但听起来非常扭曲.
我不确定问题是否存在
A)ExtAudioFileWriteAsync无法像io单元回调提供的那样快速写入样本.
B)我已经为extaudiofile refeference设置了ASBD错误.我想先保存一个wav文件.我不确定我是否在下面的ASBD中正确描述了这一点.
其次,我不确定在创建音频文件时为inChannelLayout属性传递什么值.
最后我非常不确定要用于kExtAudioFileProperty_ClientDataFormat的asbd.我一直在使用我的立体声流格式,但仔细看看文档说这必须是pcm.它应该与remoteio的输出格式相同吗?如果是这样,我错误地将远程io的输出格式设置为stereostreamformat?
我意识到这个问题有很多,但我有很多不确定因素,我似乎无法自行解决.
设置立体声流格式
- (void) setupStereoStreamFormat
{
size_t bytesPerSample = sizeof (AudioUnitSampleType);
stereoStreamFormat.mFormatID = kAudioFormatLinearPCM;
stereoStreamFormat.mFormatFlags = kAudioFormatFlagsAudioUnitCanonical;
stereoStreamFormat.mBytesPerPacket = bytesPerSample;
stereoStreamFormat.mFramesPerPacket = 1;
stereoStreamFormat.mBytesPerFrame = bytesPerSample;
stereoStreamFormat.mChannelsPerFrame = 2; // 2 indicates stereo
stereoStreamFormat.mBitsPerChannel = 8 * bytesPerSample;
stereoStreamFormat.mSampleRate = engineDescribtion.samplerate;
NSLog (@"The stereo stereo format :");
}
Run Code Online (Sandbox Code Playgroud)
使用立体声流格式设置remoteio回调
AudioUnitSetProperty(engineDescribtion.masterChannelMixerUnit,
kAudioUnitProperty_StreamFormat,
kAudioUnitScope_Output,
masterChannelMixerUnitloop,
&stereoStreamFormat,
sizeof(stereoStreamFormat));
AudioUnitSetProperty(engineDescribtion.masterChannelMixerUnit,
kAudioUnitProperty_StreamFormat,
kAudioUnitScope_Input,
masterChannelMixerUnitloop,
&stereoStreamFormat,
sizeof(stereoStreamFormat));
static OSStatus masterChannelMixerUnitCallback(void *inRefCon,
AudioUnitRenderActionFlags …Run Code Online (Sandbox Code Playgroud) audiounit ×10
core-audio ×7
iphone ×6
ios ×5
audio ×2
avfoundation ×1
cocoa ×1
downsampling ×1
ios5 ×1
ipad ×1
objective-c ×1
remoteio ×1
swift ×1
vst ×1