2011-12-28 1 views
1

В первый раз, когда я назову этот метод file1 будет nil и будет возвращен file2. Когда это произойдет, файл будет воспроизводиться нормально (так что вызов этого метода должен быть прекрасным). Но когда я назову его во второй раз, он вернет NSURL, который не воспроизводит AVAudioPlayer. Думаю, я пропустил что-то в заголовке. В режиме отладки я видел, что totalLength точно соответствует длине данных.AVAudioPlayer отказывается воспроизводить измененный wav-файл

+(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]; 
} 

Если кто-нибудь увидит что-то, что может помочь, это было бы очень признательно! На все вопросы будет дан ответ как можно скорее.

EDIT

Я знаю, что есть 2 вида Wav заголовков: 44 байт или 46 байт. Я пробовал и то, и другое.

EDIT

Я посмотрел на Audio File Services Reference, который содержит много хороших вещей я мог бы хотеть использовать, но я не могу понять, как использовать все это. Я не знаю с. Надеюсь, кто-нибудь сможет мне помочь.

EDIT

Пример объединенного файл WAV находится здесь: 7--443522512

+0

перепечатывать? http://stackoverflow.com/questions/8535380/nsurl-returns-invalid-summary-when-merging-wav-files/8569393 –

+0

Вы пробовали сохранить wav в файл при работе в симуляторе, а затем попытались воспроизвести его в каком-то другом игроке? –

+0

@MattiasWadman Это не repost, как с этим я пытался найти способ избавиться от проблемы с памятью, но с этим, который все исправлен, и я пытаюсь заставить wav играть. Кажется то же, другое. Я этого не пробовал, попробую это сейчас. – Manuel

ответ

1

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

Возможно, вам следует попытаться создать файлы WAV без FLLR фрагмента до слияния, шлейфы kAudioFileFlags_DontPageAlignAudioData, чтобы сделать аудиофайлы.

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

+0

У вас есть информация о том, как это сделать (ссылка или код), было бы очень полезно! – Manuel

+0

Откуда вы получаете wav-файлы? вы создаете их с помощью API аудиофайлов? –

+0

Я записываю их с помощью AVAudioRecorder (в том же приложении). – Manuel