Я пытаюсь объединить 2 файла .wav внутри проекта Objective-C. Идея в том, что я хочу, чтобы он выдавал этот вывод: файл1 + (файл2 - заголовок). В этом случае заголовок первого файла должен быть изменен, чтобы отразить новый размер. Если первый файл пуст (так что только в первый раз), я хочу, чтобы метод возвращал второй файл целиком, но в файле 1 URL. Прямо сейчас у меня есть:
+(NSURL *)mergeFile1:(NSURL *)file1 withFile2:(NSURL *)file2 {
if(file1 == nil) {
return [file2 copy];
}
NSData * wav1Data = [NSData dataWithContentsOfFile:[file1 absoluteString]];
NSData * wav2Data = [NSData dataWithContentsOfFile:[file2 absoluteString]];
int wav1DataSize = [wav1Data length] - 46;
int wav2DataSize = [wav2Data length] - 46;
[NSMutableData dataWithData:[wav1Data subdataWithRange:NSMakeRange(46, wav1DataSize)]];
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(@"%d", totalLength);
[soundFileData replaceBytesInRange:NSMakeRange(4, 4) withBytes:[NSString stringWithFormat:@"%X", totalLength-8]];
[soundFileData replaceBytesInRange:NSMakeRange(42, 4) withBytes:[NSString stringWithFormat:@"%X", totalLength]];
[soundFileData writeToURL:file1 atomically:YES];
return [file1 copy];
}
Я называю это так:
if(soundFileURL != nil) {
NSURL *tempURL = [WavUtils mergeFile1:finalSoundFileURL withFile2:soundFileURL];
if(tempURL != nil) {
NSLog(@"Wav files have been merged.");
finalSoundFileURL = [tempURL copy];
[soundFileURL release];
soundFileURL = nil;
} else {
NSLog(@"Wav files could not be merged.");
}
}
finalSoundFileURL определяется следующим образом:
@interface class : UIViewController
....
NSURL *soundFileURL;
NSURL *finalSoundFileURL;
....
}
Проблема, с которой я столкнулся сейчас, заключается в том, что tempURL
вернется правильно, но когда я сделаю finalSoundFileURL = [tempURL copy];
, finalSoundFileURL
во время отладки скажет «Неверное резюме». tempURL даст правильный URL. Я также не могу воспроизвести wav в URL-адресе, так что что-то явно не так.
У кого-нибудь есть идея, что происходит, потому что я не понимаю, что происходит. Любая помощь приветствуется!
ИЗМЕНИТЬ
Я сделал несколько скриншотов того, что показывает отладчик. Как показано на рисунке ниже, tempURL в порядке:
FinalSoundFileURL в тот же момент (после копирования временного файла в последний) показывает следующее:
Это большая загадка для меня. Это заставляет меня задаться вопросом, почему это недействительно? Он только что был скопирован (поэтому имеет собственное пространство памяти), и для него не требуется освобождение! Пожалуйста, поправьте меня, если я ошибаюсь в этом.
finalSoundFilaURL
NSURL? Установите точку останова после того, как вы назначите ее в `[soundFileURL release] и посмотрите, что она говорит в этот момент. - person Jessedc   schedule 20.12.2011finalSoundFileURL
определяется как @property? пожалуйста, покажите мне, как это синтезируется. - person Jessedc   schedule 20.12.2011finalSoundFileURL
в строке вышеif(soundFileURL != nil) {
, а не там, где вы находитесь в данный момент, и посмотрите, показывает ли отладчик по-прежнему Invalid Summary. - person Jessedc   schedule 20.12.2011finalSoundFileURL
. - person Jessedc   schedule 20.12.2011tempURL
, иfinalSoundFilaURL
имеют один и тот же адрес0x53572f0
. Можете ли вы попробовать добавитьNSLog(@"%@", tempURL)
иNSLog(@"%@", finalSoundFilaURL)
, чтобы дважды проверить, действителен ли URL-адрес? - person Laurent Etiemble   schedule 22.12.2011