iPhone: NSData представление аудио файла для редактирования - PullRequest
4 голосов
/ 22 февраля 2012

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

Для этого я написал следующий код. Я получил эту идею от здесь .

NSString *file1 = [[NSBundle mainBundle] pathForResource:@"file1" ofType:@"caf"]; // Using PCM format
NSString *file2 = [[NSBundle mainBundle] pathForResource:@"file2" ofType:@"caf"];

NSData *file1Data = [[NSData alloc] initWithContentsOfFile:file1];
NSData *file2Data = [[NSData alloc] initWithContentsOfFile:file2];

NSMutableData *mergedData =[[NSMutableData alloc] initWithCapacity:([file1Data length] + [file2Data length])];

// First chunk from original sound file 
NSRange firstChunk;
firstChunk.length = startingPosition;
firstChunk.location = 0;
[mergedData appendData:[file1Data subdataWithRange:firstChunk]];

// Add new sound
[mergedData appendData:file2Data];

// First chunk from original sound file 
NSRange secondChunk;
secondChunk.length = [file1Data length] - startingPosition;
secondChunk.location = startingPosition;
[mergedData appendData:[file1Data subdataWithRange:secondChunk]];

NSLog(@"File1: %d, File2: %d, Merged: %d", [file2Data length], [file2Data length],   [mergedData length]);

// Convert mergedData to Audio file
[mergedData writeToFile:[self filePath:@"converted.caf"] atomically:YES];

[file1Data release];
[file2Data release];
[mergedData release];

Использование следующего кода для воспроизведения преобразованного звукового файла:

AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc] 
                          initWithContentsOfURL:[NSURL URLWithString:[self filePath:@"converted.caf"]]  error:nil];
[audioPlayer prepareToPlay];
[audioPlayerr play];

Преобразованный файл не воспроизводится. Дальнейшие исследования этого я обнаружил, что преобразование звука в NSData усекает заголовок / колонтитул звука. Это правильно? Может кто-нибудь, пожалуйста, помогите мне разобраться, пожалуйста.

Спасибо.

1 Ответ

3 голосов
/ 22 февраля 2012

Я думаю, что вам лучше всего использовать ExtAudioFileRef для извлечения аудиосэмплов каждого файла в буферы.

Затем вы можете свободно смешивать сэмплы вместе и из любой позиции и сохранять новый смешанный файл на диск, используя ExtAudioFileWriteAsync.

Например: Извлечь звук 1 в буфер А. Извлечь звук 2 в буфер B.

Создать буфер C, размер которого равен длине A плюс длина B. Затем запишите этот буфер на диск в любом формате с помощью ExtAudioFileWriteAsync.

Этот файл должен затем воспроизводиться AVAudioPlayer.

...