2012-06-25 41 views
10

Tôi có một ứng dụng iOS phát nhạc nền với một AVPlayer và phát các clip âm thanh khác "trên cùng" với AVPlayer thứ hai. (Các clip âm thanh được phát trực tiếp từ Internet, do đó yêu cầu đối với AVPlayer.) Vấn đề là khi AVPlayer thứ hai bắt đầu phát, nó khiến nền AVPlayer dừng lại trong một phần giây, tương tự như những gì được mô tả trong bình luận này:Lỗi âm thanh khi phát hai tệp âm thanh AVPlayer đồng thời

Play multiple Audio Files with AVPlayer


tôi đang chuẩn bị các clip âm thanh với phương pháp này:

- (void)prepareAudio:(NSURL *)assetURL { 

asset = [AVURLAsset URLAssetWithURL:assetURL options:nil]; 
playerItem = [AVPlayerItem playerItemWithAsset:asset]; 
[player replaceCurrentItemWithPlayerItem:playerItem]; 


[playerItem addObserver:self forKeyPath:@"playbackBufferEmpty" options:NSKeyValueObservingOptionNew context:nil]; 
[playerItem addObserver:self forKeyPath:@"playbackLikelyToKeepUp" options:NSKeyValueObservingOptionNew context:nil]; 


[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(playerItemDidReachEnd:) 
              name:AVPlayerItemDidPlayToEndTimeNotification 
              object:[player currentItem]]; 

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(playerItemFailedToReachEnd:) 
              name:AVPlayerItemFailedToPlayToEndTimeNotification 
              object:[player currentItem]]; 
} 

... và sau đó gọi [player play]; khi tôi w kiến để nghe từng âm thanh.


Có cái gì tôi cần phải làm gì khi tôi thiết lập phiên âm thanh hoặc mỗi trường hợp của AVPlayer, do đó những âm thanh pha trộn mà không có trục trặc?

Trả lời

2

Đây có thể là kết quả của bộ mã hóa phần mềm khởi động. Bạn sẽ thấy một bộ nhớ tăng đột biến lớn khi bộ mã hóa phần mềm cố gắng phát clip âm thanh thứ hai. Hãy xem phần tài liệu của Apple "Mã bộ giải mã phần cứng và phần mềm iOS" http://developer.apple.com/library/ios/#DOCUMENTATION/AudioVideo/Conceptual/MultimediaPG/UsingAudio/UsingAudio.html

"Khi sử dụng giải mã phần cứng, thiết bị chỉ có thể phát một lần một định dạng được hỗ trợ tại một thời điểm."

Ngoài ra ... "Để phát nhiều âm thanh với hiệu suất tốt nhất hoặc phát âm thanh hiệu quả trong khi iPod đang phát trong nền, hãy sử dụng âm thanh PCM (không nén) hoặc IMA4 (nén) tuyến tính."

Nếu bạn không có lựa chọn trong các codec phương tiện truyền thông bạn có thể cung cấp, hãy xem khung AudioUnit để có được một sự pha trộn liền mạch hơn. Cụ thể là "Trình trộn âm thanh (MixerHost)" tại http://developer.apple.com/library/ios/#samplecode/MixerHost/Introduction/Intro.html#//apple_ref/doc/uid/DTS40010210

+0

Điều này không thể. Tôi đã thực hiện một vài thử nghiệm bằng cách sử dụng các tệp không nén PCM thẳng và sự cố vẫn tiếp tục tồn tại. Điều đó đang được nói, có vẻ như có liên quan đến AVMutableAudioMix đang được áp dụng. Bất cứ khi nào nó được áp dụng, đó là khi bobble xảy ra. –

1

Cuối cùng tôi đã tìm ra vấn đề là gì. Tôi đang viết một ứng dụng mà tôi đang điều chỉnh âm lượng bằng cách sử dụng lớp AVMutableAudioMixInputParameters và tôi đang cố gắng chuẩn hóa âm thanh bằng cách sử dụng lớp này bằng cách di chuyển âm lượng lên hoặc xuống trên cơ sở mỗi mẫu.

Trong khi phương pháp này hoạt động khi chỉ có một vài đường dốc, có vẻ như ứng dụng của đường nối xảy ra trên cùng một luồng đệm đệm âm thanh, vì vậy khi tôi sử dụng quá nhiều (> ~ 1000) trong số này, cuối cùng ăn lên CPU mà nên được bận rộn đệm âm thanh, và sau đó bạn có một ggg-trục trặc trong âm thanh.

Giải pháp của tôi là để tái cấu trúc thuật toán bình thường hóa khối lượng của mình để sử dụng số lần tăng âm lượng ít hơn để đạt được điều tương tự. Một khi tôi đã có thể nhận được mỗi bộ dốc/bài hát giảm xuống khoảng 500 hoặc hơn, tôi không còn gặp phải vấn đề nữa và sự cố âm thanh đã biến mất.