Tôi đang sử dụng AVAssetReaderOutput
để đọc mẫu từ AVAsset
, thực hiện một số thao tác trên chúng và phát kết quả bằng RemoteIO AU.Không thể tiếp tục đọc từ AVAssetReaderOutput sau khi chuyển sang nền và quay lại nền trước
Vấn đề là sau khi gọi AudioOutputUnitStop
để tạm dừng phát lại, sau đó sau khi chuyển sang nền và quay lại nền trước, âm thanh sẽ không bắt đầu lại sau khi gọi AudioOutputUnitStart
. Điều này là do lỗi được trả về từ phương pháp copyNextSampleBuffer
của AVAssetReaderOutput
, được gọi là một phần của đường dẫn hiển thị.
Thuộc tính status
của AVAssetReader
sau khi gọi copyNextSampleBuffer
là AVAssetReaderStatusFailed
, và tài sản của nó là error
Lỗi miền = AVFoundationErrorDomain Mã = -11.847 "Operation Interrupted" UserInfo = 0x1d8b6100 {NSLocalizedRecoverySuggestion = Dừng các hoạt động khác và thử lại., NSLocalizedDescription = Operation Bị gián đoạn}
Tôi đang tìm một giải pháp không bắt buộc tôi phải khởi động lại toàn bộ đường ống sau khi quay lại nền trước - Hy vọng có một giải pháp như vậy, AVAssetReader
s có thể tồn tại trong ứng dụng. quay lại ...
Ghi chú
- Ứng dụng có quyền phát âm thanh ẩn.
- Tôi đang xử lý gián đoạn âm thanh - Đặt
AVAudioSession
hoạt động của mình là hoạt động cả trênAVAudioSessionDelegate
sendInterruptionWithFlags:
sự kiện và bất cứ khi nào ứng dụng hoạt động. Không tạo ra sự khác biệt cho dù tôi có làm điều này hay không, nhận được cùng một lỗi.
Một số mã:
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);
AudioReader Cài đặt
@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];
AudioReader Render Method, được gọi là cuối cùng bởi hàm 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;
}
...
}
Đây có phải là loại âm thanh nén không? Một số đơn vị giải nén âm thanh phần cứng trên một số kiểu thiết bị được báo cáo không thể bị gián đoạn mà không phải khởi động lại. – hotpaw2
Thú vị. Đó là để đọc một 'AVAsset' được lấy từ một' MPMediaItem', một bài hát, từ thư viện iTunes của người dùng. Vì vậy, mp3/m4a, tôi tin rằng cả hai đều được nén. Về "mô hình thiết bị" - Đây là sự cố trên iPhone 5. Có bất kỳ tham chiếu nào có sẵn cho những gì bạn mô tả không? – Danra