2009-06-25 57 views
5

Tôi đang tìm cách thay đổi âm thanh đã ghi khi được lưu vào đĩa hoặc phát lại (theo thời gian thực). Tôi hiểu đơn vị âm thanh có thể được sử dụng cho việc này. IPhone cung cấp hỗ trợ giới hạn cho các đơn vị âm thanh (ví dụ nó không thể tạo/sử dụng các đơn vị âm thanh tùy chỉnh, như xa như tôi có thể nói), nhưng một số đơn vị âm thanh out-of-the-box có sẵn, một trong số đó là AUPitch.Cách sử dụng Thiết bị âm thanh trên iPhone

Tôi sẽ sử dụng đơn vị âm thanh (cụ thể là AUPitch) chính xác như thế nào? Bạn có móc nó vào một hàng đợi âm thanh bằng cách nào đó? Có thể ghép các đơn vị âm thanh lại với nhau (ví dụ, để đồng thời thêm hiệu ứng hồi âm và thay đổi độ cao) không?

EDIT: Sau khi kiểm tra các tiêu đề SDK iPhone (Tôi nghĩ AudioUnit.h, tôi không ở phía trước máy Mac tại thời điểm này), tôi nhận thấy rằng AUPitch được nhận xét. Vì vậy, nó không giống như AUPitch có sẵn trên iPhone sau khi tất cả. khóckhóc

của Apple dường như có tổ chức tốt hơn tài liệu iPhone SDK của họ tại developer.apple.com của cuối - bây giờ nó khó khăn hơn để tìm tài liệu tham khảo để AUPitch vv

Điều đó nói rằng, tôi m vẫn quan tâm đến các câu trả lời về chất lượng khi sử dụng Đơn vị Âm thanh (nói chung) trên iPhone.

Trả lời

4

Có một số tài nguyên rất tốt ở đây (http://michael.tyson.id.au/2008/11/04/using-remoteio-audio-unit/) để sử dụng Thiết bị âm thanh từ xa. Theo kinh nghiệm của tôi khi làm việc với Audio Units trên iPhone, tôi thấy rằng tôi có thể thực hiện phép chuyển đổi theo cách thủ công trong hàm gọi lại. Khi làm như vậy, bạn có thể thấy rằng giải quyết được vấn đề.

1

Về việc thay đổi quảng cáo chiêu hàng trên iPhone, OpenAL là cách để thực hiện. Kiểm tra lớp SoundManager có sẵn từ www.71squared.com để biết ví dụ tuyệt vời về công cụ âm thanh OpenAL hỗ trợ quảng cáo chiêu hàng.

+0

Lưu ý OpenAL chỉ hỗ trợ thay đổi âm thanh trong thời gian thực, có nghĩa là bạn không thể lưu âm thanh bị thay đổi – hyd00

0
- (void)modifySpeedOf:(CFURLRef)inputURL byFactor:(float)factor andWriteTo:(CFURLRef)outputURL { 

    ExtAudioFileRef inputFile = NULL; 
    ExtAudioFileRef outputFile = NULL; 

    AudioStreamBasicDescription destFormat; 

    destFormat.mFormatID = kAudioFormatLinearPCM; 
    destFormat.mFormatFlags = kAudioFormatFlagsCanonical; 
    destFormat.mSampleRate = 44100 * factor; 
    destFormat.mBytesPerPacket = 2; 
    destFormat.mFramesPerPacket = 1; 
    destFormat.mBytesPerFrame = 2; 
    destFormat.mChannelsPerFrame = 1; 
    destFormat.mBitsPerChannel = 16; 
    destFormat.mReserved = 0; 

    ExtAudioFileCreateWithURL(outputURL, kAudioFileCAFType, 
           &destFormat, NULL, kAudioFileFlags_EraseFile, &outputFile); 

    ExtAudioFileOpenURL(inputURL, &inputFile); 

    //find out how many frames is this file long 
    SInt64 length = 0; 
    UInt32 dataSize2 = (UInt32)sizeof(length); 
    ExtAudioFileGetProperty(inputFile, 
          kExtAudioFileProperty_FileLengthFrames, &dataSize2, &length); 

    SInt16 *buffer = (SInt16*)malloc(kBufferSize * sizeof(SInt16)); 

    UInt32 totalFramecount = 0; 

    AudioBufferList bufferList; 
    bufferList.mNumberBuffers = 1; 
    bufferList.mBuffers[0].mNumberChannels = 1; 
    bufferList.mBuffers[0].mData = buffer; // pointer to buffer of audio data 
    bufferList.mBuffers[0].mDataByteSize = kBufferSize * 
    sizeof(SInt16); // number of bytes in the buffer 

    while(true) { 

     UInt32 frameCount = kBufferSize * sizeof(SInt16)/2; 
     // Read a chunk of input 
     ExtAudioFileRead(inputFile, &frameCount, &bufferList); 
     totalFramecount += frameCount; 

     if (!frameCount || totalFramecount >= length) { 
      //termination condition 
      break; 
     } 
     ExtAudioFileWrite(outputFile, frameCount, &bufferList); 
    } 

    free(buffer); 

    ExtAudioFileDispose(inputFile); 
    ExtAudioFileDispose(outputFile); 

} 

nó sẽ thay đổi sân dựa trên yếu tố

0

Tôi đã sử dụng các đơn vị âm thanh NewTimePitch cho điều này trước đây, mô tả âm thanh Component cho điều đó là

var newTimePitchDesc = AudioComponentDescription(componentType: kAudioUnitType_FormatConverter, 
     componentSubType: kAudioUnitSubType_NewTimePitch, 
     componentManufacturer: kAudioUnitManufacturer_Apple, 
     componentFlags: 0, 
     componentFlagsMask: 0) 

sau đó bạn có thể thay đổi sân tham số với một cuộc gọi AudioUnitSetParamater. Ví dụ này thay đổi pitch bởi -1000 cent

err = AudioUnitSetParameter(newTimePitchAudioUnit, 
     kNewTimePitchParam_Pitch, 
     kAudioUnitScope_Global, 
     0, 
     -1000, 
     0) 

Các thông số cho đơn vị âm thanh này như sau

// Parameters for AUNewTimePitch 
enum { 
     // Global, rate, 1/32 -> 32.0, 1.0 
    kNewTimePitchParam_Rate       = 0, 
     // Global, Cents, -2400 -> 2400, 1.0 
    kNewTimePitchParam_Pitch      = 1, 
     // Global, generic, 3.0 -> 32.0, 8.0 
    kNewTimePitchParam_Overlap      = 4, 
     // Global, Boolean, 0->1, 1 
    kNewTimePitchParam_EnablePeakLocking   = 6 
}; 

nhưng bạn sẽ chỉ cần thay đổi các tham số sân cho mục đích của bạn. Để biết hướng dẫn về cách thực hiện điều này, hãy tham khảo câu trả lời của Justin

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