2011-04-29 36 views
7

Tôi muốn có thể lấy lại AudioBufferList từ AVAssetReader có 2 bộ đệm để tôi có thể xử lý âm thanh trái và phải thông qua AudioUnit. Tôi đã thử bằng cách sử dụng các thiết lập đầu ra dưới đây nhưng nó sẽ không đọc miễn là tôi xác định bố trí âm thanh stereo được thiết lập bởi kAudioChannelLayoutTag_Stereo.Có thể sử dụng AVAssetReader để lấy lại bố cục kênh âm thanh nổi không?

Có thể cho AVAssetReader trả lại kết quả không xen kẽ không?

Nếu không, làm cách nào để chuyển đổi nó thành một AudioBufferList không xen kẽ? Tôi đã cố gắng sử dụng Dịch vụ chuyển đổi âm thanh nhưng tôi không thể nhận nó để chấp nhận giá trị đầu vào hoặc đầu ra cho AudioStreamBasicDescription. (ASBD) Nếu tôi không thể lấy dữ liệu theo định dạng tôi muốn từ AVAssetReader, tôi muốn ít nhất có thể chuyển đổi nó sang định dạng tôi cần.

Bất kỳ mẹo nào được đánh giá cao.

- (NSDictionary *) getOutputSettings { 
    AudioChannelLayout channelLayout; 
    memset(&channelLayout, 0, sizeof(AudioChannelLayout)); 
    channelLayout.mChannelLayoutTag = kAudioChannelLayoutTag_Stereo; 
    NSDictionary *outputSettings = [NSDictionary dictionaryWithObjectsAndKeys: 
            [NSNumber numberWithInt:kAudioFormatLinearPCM], AVFormatIDKey, 
            [NSNumber numberWithFloat:44100.0], AVSampleRateKey, 
            [NSNumber numberWithInt:2], AVNumberOfChannelsKey, 
            [NSData dataWithBytes:&channelLayout length:sizeof(AudioChannelLayout)], AVChannelLayoutKey, 
            [NSNumber numberWithInt:16], AVLinearPCMBitDepthKey, 
            [NSNumber numberWithBool:NO], AVLinearPCMIsNonInterleaved, 
            [NSNumber numberWithBool:NO],AVLinearPCMIsFloatKey, 
            [NSNumber numberWithBool:NO], AVLinearPCMIsBigEndianKey, 
            nil]; 

    return outputSettings; 
} 
+0

Xong. Tôi tìm thấy một số cái cũ treo ở đó. – Brennan

Trả lời

0

Tôi đã học được rằng tôi có thể có kết quả trả về AVAssetReader với cài đặt mặc định đầu ra (nil) sẽ cho tôi kết quả xen kẽ các giá trị float. Bộ đệm của các giá trị float thay đổi từ trái sang phải thông qua bộ đệm. Tôi có thể làm việc với các giá trị này nằm trong khoảng từ -1.0 đến 1.0 nhưng để phát âm thanh, cần phải tăng giá trị cho phạm vi của một int ngắn, vì vậy tôi nhân chúng với SHRT_MAX và đảm bảo các giá trị nằm trong phạm vi SHRT_MAX và SHRT_MIN để âm thanh phát như mong đợi.

Vì bộ đệm xen kẽ trả về giá trị L và R trên cùng một bộ đệm, nó được coi là 2 kênh trên bộ đệm 1 được phản ánh trong AudioBufferList. Trước đây tôi đã có thể lấy lại 2 bộ đệm với 1 kênh cho mỗi bộ đệm nhưng điều đó không thực sự cần thiết bây giờ mà tôi hiểu định dạng xen kẽ rất đơn giản.

+0

Lạ. Tôi đang sử dụng một thiết lập tương tự. Nếu tôi cố gắng tách các kênh, nó sẽ tăng gấp đôi tốc độ phát lại, điều này dường như cho thấy nó đang chuyển đổi âm thanh thành đơn âm. – jin

1

Tôi nghĩ rằng kAudioChannelLayoutTag_Stereo đang yêu cầu các mẫu xen kẽ, vì vậy tôi sẽ mất nó.

Tất cả phụ thuộc vào loại AVAssetReaderOutput bạn đang tạo với các cài đặt đầu ra đó. AVAssetReaderTrackOutput không chuyển đổi ngoài việc giải mã thành LPCM, nhưng AVAssetReaderAudioMixOutput chấp nhận nhiều khóa định dạng hơn, trên thực tế nó có thể là một AVAssetReaderTrackOutput + AudioConverter.

Các vấn đề liên quan