我正在使用
在调用
注意:
- 应用程序有权在后台播放音频。 - 我正在处理音频中断-在
一些代码:
AudioPlayer
音频阅读器设置
音频读取器渲染方法,最终由RenderCallback函数调用。
AVAssetReaderOutput
从AVAsset
中读取样本,对其进行处理,并使用RemoteIO AU播放结果。问题在于,在调用AudioOutputUnitStop
暂停播放后,然后进入后台并返回前台,调用AudioOutputUnitStart
后音频将无法再次启动。这是由于在渲染管道的一部分中调用了AVAssetReaderOutput
的copyNextSampleBuffer
方法时返回的错误。在调用
copyNextSampleBuffer
后,AVAssetReader
的status
属性为AVAssetReaderStatusFailed
,其error
属性为Error Domain = AVFoundationErrorDomain Code = -11847 "操作已中断" UserInfo = 0x1d8b6100 {NSLocalizedRecoverySuggestion=停止其他操作,然后重试。, NSLocalizedDescription=操作已中断}
我正在寻找一种解决方案,不会强制我在回到前台后重新初始化整个管道-希望有这样的解决方案,即AVAssetReader
可以在应用程序进入后台和返回时保持存在...注意:
- 应用程序有权在后台播放音频。 - 我正在处理音频中断-在
AVAudioSessionDelegate
的endInterruptionWithFlags:
事件和应用程序变为活动状态时,设置我的AVAudioSession
作为活动会话。无论是否这样做,都会得到相同的错误。一些代码:
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 = AudioComponentFindNext(NULL, &desc);
AudioComponentInstanceNew(defaultOutput, &_audioUnit);
AudioStreamBasicDescription audioFormat;
FillOutASBDForLPCM(audioFormat, 44100, 2, 16, 16, false, false);
AudioUnitSetProperty(self.audioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, kOutputBus, &audioFormat, sizeof(audioFormat));
AURenderCallbackStruct callbackStruct;
callbackStruct.inputProc = RenderCallback;
callbackStruct.inputProcRefCon = (__bridge void*)self;
AudioUnitSetProperty(self.audioUnit, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Input, kOutputBus, &callbackStruct, sizeof(callbackStruct));
AudioUnitInitialize(self.audioUnit);
音频阅读器设置
@implementation AudioReader
...
NSError* error = nil;
self.reader = [AVAssetReader assetReaderWithAsset:self.asset error:&error];
NSDictionary *outputSettings = ...
self.readerOutput = [AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:[self.asset.tracks objectAtIndex:0] outputSettings:outputSettings];
[self.reader addOutput:self.readerOutput];
[self.reader startReading];
音频读取器渲染方法,最终由RenderCallback函数调用。
-(BOOL)readChunkIntoBuffer
{
CMSampleBufferRef sampleBuffer = [self.readerOutput copyNextSampleBuffer];
if ( sampleBuffer == NULL )
{
NSLog(@"Couldn't copy next sample buffer, reader status=%d error=%@, self.reader.status, self.reader.error);
return NO;
}
...
}
MPMediaItem
读取AVAsset
的代码。因此,我相信mp3/m4a都是压缩的。关于“设备型号”-这是在iPhone 5上的问题。您是否有任何可用的参考资料来描述您所说的内容? - Danra