Bản Tuyên Bố Về Vấn đề:Tôi làm cách nào để sử dụng AVAudioPlayer để phát âm thanh nhanh hơn * và * cao hơn?
Tôi có một bộ sưu tập các hiệu ứng âm thanh trong ứng dụng của tôi được lưu trữ như .m4a
file (định dạng AAC, 48 KHz, 16-bit) mà tôi muốn chơi tại một loạt các tốc độ và nhựa, mà không phải tạo trước tất cả các biến thể dưới dạng tệp riêng biệt.
Mặc dù thuộc tính .rate
của đối tượng AVAudioPlayer
có thể thay đổi tốc độ phát lại, nó luôn duy trì sân gốc, không phải là thứ tôi muốn. Thay vào đó, tôi chỉ đơn giản muốn phát mẫu âm thanh nhanh hơn hoặc chậm hơn và có độ cao lên hoặc xuống để khớp - giống như tăng tốc hoặc làm chậm máy ghi âm reel-to-reel cũ. Nói cách khác, tôi cần một số cách cơ bản để thay đổi tỷ lệ mẫu âm thanh theo số lượng +2 semitones (nhanh hơn 12%), –5 semitones (chậm hơn 33%), +12 semitones (2x nhanh hơn), v.v.
Câu hỏi:
có một số cách lấy dữ liệu âm thanh Linear PCM từ một đối tượng AVAudioPlayer
, áp dụng chuyển đổi tỷ lệ mẫu sử dụng một khuôn khổ iOS khác nhau, và các công cụ dữ liệu âm thanh kết quả vào một đối tượng mới AVAudioPlayer
, mà sau đó có thể được chơi bình thường?
con đường có thể xảy ra:
tôi đã được đọc lên trên AudioConverterConvertComplexBuffer
. Cụ thể là kAudioConverterSampleRateConverterComplexity_Mastering
và kAudioConverterQuality_Max
và AudioConverterFillComplexBuffer()
bắt gặp ánh mắt của tôi. Vì vậy, có vẻ như có thể với khung chuyển đổi âm thanh này. Đây có phải là con đường tôi nên khám phá xa hơn không?
Yêu cầu:
Tôi thực sự không cần phải phát lại để bắt đầu ngay lập tức. Nếu chuyển đổi tỷ lệ mẫu xảy ra chậm trễ một chút, điều đó là tốt. Tất cả các mẫu của tôi là 4 giây hoặc ít hơn, vì vậy tôi sẽ tưởng tượng rằng bất kỳ việc lấy mẫu lại nào sẽ xảy ra nhanh chóng, theo thứ tự 1/10 giây hoặc ít hơn. (Hơn 1/2 sẽ là quá nhiều, mặc dù.)
Tôi thực sự không thích những thứ hạng nặng như OpenAL hoặc Core Audio nếu có cách đơn giản hơn để thực hiện việc này bằng khung chuyển đổi do iOS cung cấp . Tuy nhiên, nếu có giải pháp đơn giản cho vấn đề này bằng cách sử dụng OpenAL hoặc Core Audio, tôi rất vui khi xem xét điều đó. Bởi "đơn giản" tôi có nghĩa là một cái gì đó có thể được thực hiện trong 50-100 dòng mã và không yêu cầu bắt đầu các chủ đề bổ sung để ăn dữ liệu cho một thiết bị âm thanh. Tôi chỉ muốn mọi thứ được tự động xử lý - đó là lý do tại sao tôi sẵn sàng chuyển đổi đoạn âm thanh trước khi phát.
Tôi muốn tránh bất kỳ thư viện của bên thứ ba nào tại đây, vì đây không phải là khoa học tên lửa và tôi biết điều đó phải có thể thực hiện được với khung iOS gốc bằng cách nào đó.
Một lần nữa, tôi cần phải điều chỉnh tốc độ quảng cáo chiêu hàng và phát lại với nhau, chứ không phải riêng biệt. Vì vậy, nếu phát lại bị chậm lại 2x, một giọng nói của con người sẽ trở nên rất sâu và chậm nói. Và nếu phát lại được tăng tốc 2–3x, giọng nói của con người sẽ giống như một con chip nói nhanh. Nói cách khác, tôi hoàn toàn không muốn thay đổi độ cao trong khi vẫn duy trì thời lượng âm thanh như nhau, bởi vì hoạt động đó dẫn đến âm thanh "tinny" không mong muốn khi uốn cong hướng lên trên nhiều hơn một vài semitones.Tôi chỉ muốn tăng tốc độ toàn bộ mọi thứ và có sân đi lên như một tác dụng phụ tự nhiên, giống như máy ghi băng cũ được sử dụng để làm.
Cần làm việc trong iOS 6 trở lên, mặc dù hỗ trợ iOS 5 sẽ là một phần thưởng tốt đẹp.
Có lẽ bạn có thể xem xét sử dụng AUSampler. –
Đây là một câu hỏi hay. Nhìn vào AVAudioPlayer, có một phím tỷ lệ mẫu trong các thiết lập, nhưng nó là chỉ đọc. Nếu bạn có thể điều chỉnh tốc độ lấy mẫu, bạn có thể thay đổi độ cao. Đây là một bài đăng thú vị về chủ đề: http://forums.macrumors.com/showthread.php?t=636846 – Jack