2011-12-16 19 views
1

我試圖合併Objective-C項目中的2個.wav文件。這個想法是我想讓它輸出:file1 +(file2 - header)。在這種情況下,必須更改第一個文件的標題以反映新的大小。如果第一個文件是空的(所以只有第一次)我希望該方法作爲一個整體返回第二個文件,但在文件1 url中。現在,我有:合併WAV文件時,NSURL返回Invalid Summary

+(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將在調試時說「Invalid Summary」。 tempURL將提供正確的URL。我無法在網址中播放wav,所以有些顯然是錯誤的。

任何人都有一個想法是怎麼回事,因爲我不明白是怎麼回事。任何幫助表示讚賞!

編輯

我做了什麼樣的調試器顯示了一些截圖。如下圖爲tempURL只是罰款: img1

的finalSoundFileURL在確切的同一時刻(臨時複製到最後一節之後)表明這一點: img2

這是很大的謎我。這讓我想知道爲什麼它是無效的?它剛剛被複制(所以它有自己的內存空間),並且沒有發佈對它的調用!如果我錯了,請糾正我。

+0

我每天都在檢查這個問題,所以問我任何你需要知道的東西^ _^ – Manuel 2011-12-19 21:30:06

+0

你在哪裏聲明/分配finalSoundFileURL?是否有可能過度釋放它? – 2011-12-19 21:49:49

回答

1

replaceBytesInRange調用看起來有點怪異:

[soundFileData replaceBytesInRange:NSMakeRange(4, 4) withBytes:[NSString stringWithFormat:@"%X", totalLength-8]]; 
[soundFileData replaceBytesInRange:NSMakeRange(42, 4) withBytes:[NSString stringWithFormat:@"%X", totalLength]]; 

這將通過指針NSString實例作爲新的字節。

我想你想要做這樣的事情:

[soundFileData replaceBytesInRange:NSMakeRange(4, 4) 
         withBytes:&(UInt32){NSSwapHostIntToLittle(totalLength-8)}]; 
[soundFileData replaceBytesInRange:NSMakeRange(42, 4) 
         withBytes:&(UInt32){NSSwapHostIntToLittle(totalLength)}]; 

現在的長度將在小尾序正確的字節爲WAV格式指定。在爲iOS模擬器和ARM構建時,將字節交換爲little endian可能是NOP,但它可能是明確的。