AVAudioPlayer отказывается воспроизводить модифицированный файл WAV - PullRequest
1 голос
/ 29 декабря 2011

При первом вызове этого метода 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

1 Ответ

1 голос
/ 03 января 2012

Похоже, ваш WAV-файл содержит поврежденный блок FLLR перед блоком data, или, по крайней мере, VLC считает, что блок FLLR имеет размер более 2 ГБ, поэтому он пытается перейти к следующему блоку, который находится за пределами файла конец.

Может быть, вам следует попытаться создать WAV-файлы без FLLR чанка перед объединением, швы kAudioFileFlags_DontPageAlignAudioData заставят Audio File Services пропустить его.

Другой вариант - извлечь фрагменты data и записать новый wav-файл, здесь было сделано подтверждение концепции: https://gist.github.com/1555889

...