iOS аудио манипуляции - проигрывать локальный файл .caf в обратном направлении - PullRequest
3 голосов
/ 15 июля 2011

Я хочу загрузить локальный аудиофайл .caf и перевернуть звук (воспроизвести его в обратном направлении).Я понял, что мне нужно перевернуть массив данных буфера из сообщений типа this

Однако я не уверен, как получить доступ к этим данным буфера из данного аудиофайла.У меня есть небольшой опыт воспроизведения звуков с AVaudioPlayer и ObjectAL (библиотека openAL obj-c), но я не знаю, как получить доступ к чему-то более низкому уровню, например, к этому массиву буферных данных.

Могу ли я получитьпример того, как я хотел бы получить доступ к этому массиву?

Ответы [ 5 ]

4 голосов
/ 10 октября 2013

Ваша проблема сводится к той же проблеме, описанной здесь , которая была связана с P-i в комментарии под вашим вопросом. Киран ответил на этот вопрос и опубликовал свой ответ здесь. Ответ Кирана точен, но вам может понадобиться еще несколько деталей, чтобы решить, как действовать дальше, потому что вы начинаете с файла CAF.

Простейший формат аудиофайла, линейная импульсная кодовая модуляция (LPCM), является самым простым для чтения байт за байт или выборка за выборкой. Это означает, что проще всего повернуть вспять. Решение Киран делает именно это.

Однако формат CAF является форматом контейнера / оболочки. Хотя ваш файл CAF может содержать файл WAV, он также может содержать сжатый формат файла, который не может быть обработан таким же образом.

Вы должны сначала преобразовать файл CAF в WAV, а затем обратить его вспять, как показано в другом решении. Существуют различные библиотеки, которые будут выполнять это преобразование для вас, но для начала лучше всего подойдет AudioToolbox framework , который включает Audio Converter Services . Кроме того, если вы можете использовать формат файла WAV с самого начала, вы можете предотвратить необходимость преобразования в формат WAV.

Возможно, вам придется узнать больше, если вы обнаружите, что пример кода Kiran выдает ошибку (Core Audio очень привередлив) Отличное место для начала - Core Audio 'Bible', "Learning Core Audio" , написанная Chris Adamson и Кевином Авила. Эта книга расширяет ваши знания о цифровом звуке, используя великолепные сэмплы. Вы также должны проверить что-нибудь написанное Майклом Тайсоном , который запустил проект Amazing Audio Engine на github и написал AudioBus.

3 голосов
/ 05 апреля 2013

Я работал над примером приложения, которое записывает, что говорит пользователь, и воспроизводит их в обратном направлении. Я использовал CoreAudio для достижения этой цели. Ссылка на код приложения.

Поскольку каждая выборка имеет размер 16 бит (2 байта) (моноканал). Вы можете загружать каждый семпл за раз, копируя его в другой буфер, начиная с конца записи и читая в обратном направлении. Когда вы дойдете до начала данных, вы перевернули данные, и воспроизведение будет полностью изменено.

// set up output file
AudioFileID outputAudioFile;

AudioStreamBasicDescription myPCMFormat;
myPCMFormat.mSampleRate = 16000.00;
myPCMFormat.mFormatID = kAudioFormatLinearPCM ;
myPCMFormat.mFormatFlags =  kAudioFormatFlagsCanonical; 
myPCMFormat.mChannelsPerFrame = 1;
myPCMFormat.mFramesPerPacket = 1;
myPCMFormat.mBitsPerChannel = 16;
myPCMFormat.mBytesPerPacket = 2;
myPCMFormat.mBytesPerFrame = 2;


AudioFileCreateWithURL((__bridge CFURLRef)self.flippedAudioUrl,
                   kAudioFileCAFType,
                   &myPCMFormat,
                   kAudioFileFlags_EraseFile,
                   &outputAudioFile);
// set up input file
AudioFileID inputAudioFile;
OSStatus theErr = noErr;
UInt64 fileDataSize = 0;

AudioStreamBasicDescription theFileFormat;
UInt32 thePropertySize = sizeof(theFileFormat);

theErr = AudioFileOpenURL((__bridge CFURLRef)self.recordedAudioUrl,kAudioFileReadPermission, 0, &inputAudioFile);

thePropertySize = sizeof(fileDataSize);
theErr = AudioFileGetProperty(inputAudioFile, kAudioFilePropertyAudioDataByteCount, &thePropertySize, &fileDataSize);

UInt32 dataSize = fileDataSize;
void* theData = malloc(dataSize);

//Read data into buffer
UInt32 readPoint  = dataSize;
UInt32 writePoint = 0;
while( readPoint > 0 )
{
   UInt32 bytesToRead = 2;

AudioFileReadBytes( inputAudioFile, false, readPoint, &bytesToRead, theData );
AudioFileWriteBytes( outputAudioFile, false, writePoint, &bytesToRead, theData );

writePoint += 2;
readPoint -= 2;
}

free(theData);
AudioFileClose(inputAudioFile);
AudioFileClose(outputAudioFile);
1 голос
/ 29 мая 2012

Я думаю, этот пример кода может вам помочь.

Пример кода узла микшера

Он загрузит два файла caf из пакета и воспроизведет его. Он содержит вызов функции readAudioFilesIntoMemory , который загружает файл caf в массив данных, как вы сказали.

Вся программа является примером ядра аудио, я надеюсь, что он может вам помочь:)

0 голосов
/ 11 февраля 2013

вы можете использовать libsox для платформы iphone, чтобы легко применять звуковые эффекты.

включает в себя пример проекта, показывающий, как это сделать.

libsox ios

0 голосов
/ 15 июля 2011

Почему бы не позволить CoreAudio AudioConverter сделать это за вас?См. Этот пост о «Получение PCM из файлов MP3 / AAC / ALAC» и Apple Core Audio Essentials

...