При первом вызове этого метода file1
будет равно нулю и будет возвращено file2
.Когда это произойдет, файл будет воспроизводиться нормально (поэтому вызов этого метода должен быть в порядке).Но когда я вызываю его во второй раз, он возвращает NSURL
, который AVAudioPlayer не воспроизводит.Я думаю, что я что-то пропустил в шапке.В режиме отладки я увидел, что totalLength
ровно столько же, сколько длина данных.
+(NSURL *)mergeFile1:(NSURL *)file1 withFile2:(NSURL *)file2 {
if(file1 == nil) {
return [file2 copy];
}
NSData * wav1Data = [NSData dataWithContentsOfURL:file1];
NSData * wav2Data = [NSData dataWithContentsOfURL:file2];
int wav1DataSize = [wav1Data length] - 46;
int wav2DataSize = [wav2Data length] - 46;
if (wav1DataSize <= 0 || wav2DataSize <= 0) {
return nil;
}
NSMutableData * soundFileData = [NSMutableData dataWithData:[wav1Data subdataWithRange:NSMakeRange(0, 46)]];
[soundFileData appendData:[wav1Data subdataWithRange:NSMakeRange(46, wav1DataSize)]];
[soundFileData appendData:[wav2Data subdataWithRange:NSMakeRange(46, wav2DataSize)]];
unsigned int totalLength = [soundFileData length];
NSLog(@"Calculated: %d - Real: %d", totalLength, [soundFileData length]);
[soundFileData replaceBytesInRange:NSMakeRange(4, 4)
withBytes:&(UInt32){NSSwapHostIntToLittle(totalLength-8)}];
[soundFileData replaceBytesInRange:NSMakeRange(42, 4)
withBytes:&(UInt32){NSSwapHostIntToLittle(totalLength)}];
[soundFileData writeToURL:file1 atomically:YES];
return [file1 copy];
}
Если кто-нибудь увидит что-то, что может помочь, это будет очень цениться!На любые вопросы ответят как можно скорее.
РЕДАКТИРОВАТЬ
Я знаю, что существует 2 вида заголовков wav: 44 байта или 46 байтов.Я пробовал оба.
РЕДАКТИРОВАТЬ
Я посмотрел Справочник по службам аудиофайлов , в котором содержится много приятных вещей, которые я мог бы пожелатьиспользовать, но я не могу понять, как использовать все это.Я не очень знаком с с.Надеюсь, что кто-нибудь может помочь мне с этим.
РЕДАКТИРОВАТЬ
Пример объединенного файла WAV можно найти здесь: 7--443522512