2014-04-16 17 views
8

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_MasteringkAudioConverterQuality_MaxAudioConverterFillComplexBuffer() 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:

  1. 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ù.)

  2. 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.

  3. 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 đó.

  4. 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.

  5. 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.

+1

Có lẽ bạn có thể xem xét sử dụng AUSampler. –

+1

Đâ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

Trả lời

2

Liên kết diễn đàn Jack Wu đề cập có một đề xuất, liên quan đến việc ghi đè trực tiếp dữ liệu tiêu đề AIFF. Điều này có thể làm việc, nhưng bạn sẽ cần phải có các tập tin AIFF vì nó dựa trên một phạm vi cụ thể của tiêu đề AIFF để viết vào. Điều này cũng cần phải được thực hiện trước khi bạn tạo AVAudioPlayer, có nghĩa là bạn không thể sửa đổi độ cao khi nó đang chạy.

Nếu bạn sẵn sàng đi đến tuyến đường AudioUnits, một giải pháp đơn giản hoàn toàn có thể là ~ 200 dòng (lưu ý rằng điều này giả định kiểu mã có một hàm mất đến 7 dòng với một tham số trên mỗi dòng). Có một Varispeed AudioUnit, mà thực hiện chính xác những gì bạn muốn bằng cách khóa pitch để xếp hạng. Về cơ bản bạn sẽ cần phải nhìn vào các API, tài liệu và một số mẫu mã AudioUnit để làm quen và sau đó:

  1. tạo/init đồ thị và dòng âm thanh định dạng (~ 100 dòng)
  2. tạo và thêm vào graph một RemoteIO AudioUnit (kAudioUnitSubType_RemoteIO) (điều này kết quả đầu ra cho loa)
  3. tạo và thêm một đơn vị varispeed, và kết nối đầu ra của đơn vị varispeed (kAudioUnitSubType_Varispeed) đến đầu vào của RemoteIO Unit
  4. tạo và thêm vào đồ thị đơn vị AudioFilePlayer (kAudioUnitSubType_AudioFilePlayer) để đọc tệp và kết nối nó với đơn vị biến thiên
  5. bắt đầu đồ thị để bắt đầu chơi
  6. khi bạn muốn thay đổi sân, làm điều đó thông qua AudioUnitSetParameter, và sự thay đổi tỷ lệ dầu hắc ín và phát lại sẽ có hiệu lực khi chơi

Lưu ý rằng có một âm thanh TimePitch đơn vị cho phép kiểm soát sân và tỷ lệ độc lập.

+0

Điều này nghe có vẻ giống như đặt cược tốt nhất cho đến nay. Tôi sẽ sớm thử điều này. Tôi đang trao phần thưởng cho câu trả lời này vì nó có vẻ như là một người dẫn đầu tuyệt vời, nhưng chưa (đặt ra) câu trả lời đó là câu trả lời được chấp nhận, do sự không chắc chắn. Nếu nó kết thúc hóa ra là những gì các trick, tôi sẽ đánh dấu nó như là câu trả lời được chấp nhận và đăng một số ý kiến ​​tiếp theo. –

2

Đối với iOS 7, bạn muốn xem thuật toán thời gian của AVPlayerItem (audioTimePitchAlgorithm) được gọi là AVAudioTimePitchAlgorithmVarispeed. Rất tiếc, tính năng này không khả dụng trên các hệ thống ban đầu.

+0

Bạn sẽ sử dụng AVAudioTimePitchAlgorithmVarispeed như thế nào? Tôi muốn biết nhiều hơn khi tôi đang cố gắng làm một điều tương tự. – Apollo

+0

hi matt, không có nghĩa là để spam bạn nhưng tự hỏi nếu bạn có thể cung cấp cho câu trả lời này một cái nhìn thứ hai. Thực sự có thể sử dụng sự giúp đỡ. Cảm ơn. – Apollo

+0

@Auser Bạn không hiểu gì về nó? – matt

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