Tôi muốn đọc tệp âm thanh từ gói ứng dụng, sao chép, phát với mức âm lượng tối đa (Giá trị tăng hoặc công suất cực đại, tôi không chắc chắn về tên kỹ thuật của nó), và sau đó viết lại nó thành một tệp khác cho nhóm.Xử lý âm thanh: Chơi với mức âm lượng
Tôi đã sao chép và viết một phần. Tệp kết quả giống với tệp đầu vào. Tôi sử dụng các hàm AudioFileReadBytes() và AudioFileWriteBytes() của các dịch vụ AudioFile trong khung công cụ AudioToolbox để thực hiện điều đó.
Vì vậy, tôi có byte của tệp đầu vào và định dạng dữ liệu âm thanh của nó (thông qua sử dụng AudioFileGetProperty() với kAudioFilePropertyDataFormat) nhưng tôi không thể tìm thấy biến này để phát với mức âm lượng tối đa của tệp gốc.
Để làm rõ mục đích của mình, tôi đang cố gắng tạo một tệp âm thanh khác có mức âm lượng tăng hoặc giảm tương ứng với mức âm lượng gốc, vì vậy tôi không quan tâm đến mức âm lượng của hệ thống do người dùng đặt hoặc iOS.
Có thể thực hiện với khuôn khổ mà tôi đã đề cập không? Nếu không, có đề xuất thay thế nào không?
Cảm ơn
chỉnh sửa: Đi bộ qua câu trả lời của Sam về một số vấn đề cơ bản audio, tôi quyết định mở rộng câu hỏi với thay thế khác.
Tôi có thể sử dụng dịch vụ AudioQueue để ghi tệp âm thanh hiện có (trong gói) vào một tệp khác và phát với mức âm lượng (với sự trợ giúp của khung công tác) trong giai đoạn ghi không?
cập nhật: Đây là cách tôi đọc tệp đầu vào và viết đầu ra. Mã dưới đây làm giảm mức âm thanh cho "một số" của các giá trị biên độ nhưng với rất nhiều tiếng ồn. Thật thú vị, nếu tôi chọn 0,5 là giá trị biên độ nó làm tăng mức âm thanh thay vì giảm nó, nhưng khi tôi sử dụng 0,1 như giá trị biên độ nó làm giảm âm thanh. Cả hai trường hợp liên quan đến tiếng ồn đáng lo ngại. Tôi nghĩ đó là lý do tại sao Art đang nói về bình thường hóa, nhưng tôi không có ý tưởng về việc bình thường hóa.
AudioFileID inFileID;
CFURLRef inURL = [self inSoundURL];
AudioFileOpenURL(inURL, kAudioFileReadPermission, kAudioFileWAVEType, &inFileID)
UInt32 fileSize = [self audioFileSize:inFileID];
Float32 *inData = malloc(fileSize * sizeof(Float32)); //I used Float32 type with jv42's suggestion
AudioFileReadBytes(inFileID, false, 0, &fileSize, inData);
Float32 *outData = malloc(fileSize * sizeof(Float32));
//Art's suggestion, if I've correctly understood him
float ampScale = 0.5f; //this will reduce the 'volume' by -6db
for (int i = 0; i < fileSize; i++) {
outData[i] = (Float32)(inData[i] * ampScale);
}
AudioStreamBasicDescription outDataFormat = {0};
[self audioDataFormat:inFileID];
AudioFileID outFileID;
CFURLRef outURL = [self outSoundURL];
AudioFileCreateWithURL(outURL, kAudioFileWAVEType, &outDataFormat, kAudioFileFlags_EraseFile, &outFileID)
AudioFileWriteBytes(outFileID, false, 0, &fileSize, outData);
AudioFileClose(outFileID);
AudioFileClose(inFileID);
Cảm ơn Nghệ thuật, tôi đã cập nhật cả mã và câu hỏi của tôi theo đề xuất của bạn, nhưng điều này gây ra các vấn đề khác. Có lẽ tôi đã sai, nhưng nó sẽ hoàn hảo nếu bạn có thể nhìn vào câu hỏi được cập nhật với đoạn mã. – cocoatoucher
Tôi đã chỉnh sửa câu trả lời của mình với giải thích tại sao mã của bạn không hoạt động và ví dụ về mã sẽ. –
Nghệ thuật, tôi rất biết ơn câu trả lời này. Bạn không chỉ cung cấp cho tôi mã mà còn giúp tôi hiểu những gì đang xảy ra. Cảm ơn rất nhiều! Hãy tiếp tục chia sẻ. Nhờ những người khác nữa. – cocoatoucher