2011-12-28 29 views
1

我第一次調用此方法file1將是零和file2將被退回。當這個hapen文件將會正常播放(所以這個方法的調用應該沒問題)。但是當我第二次打電話時,它會返回AVAudioPlayer無法播放的NSURL。我的猜測是我錯過了標題中的內容。在調試模式下,我看到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個字節。我已經嘗試了兩個。

編輯

我已經看過其中包含了很多不錯的東西,我可能想使用Audio File Services Reference,但我無法弄清楚如何使用這一切。我真的不知道c。希望任何人都可以幫我解決這個問題。

編輯

合併wav文件的例子在這裏找到:7--443522512

+0

轉播? http://stackoverflow.com/questions/8535380/nsurl-returns-invalid-summary-when-merging-wav-files/8569393 – 2011-12-29 00:51:48

+0

您是否嘗試過在模擬器上運行時,WAV保存到一個文件,然後試圖發揮它在其他一些球員? – 2011-12-29 00:52:55

+0

@MattiasWadman它不是一個重新發布與一個我試圖找到一種方法來擺脫內存的問題,但是這一個是所有的固定,我試圖讓WAV播放。似乎一樣,是不同的。 我還沒有嘗試過,現在就試試。 – Manuel 2011-12-29 08:39:29

回答

1

看起來你的WAV文件包括data塊前的碎FLLR塊,或者至少VLC認爲FLLR塊超過2GB大小,因此它會嘗試跳到超出文件結尾的下一個塊。

也許你應該嘗試在合併之前創建沒有FLLR區塊的WAV文件,kAudioFileFlags_DontPageAlignAudioData接縫使音頻文件服務跳過它。

另一種選擇是提取data塊譜寫新的WAV文件,沒有概念的實施在這裏的證明:https://gist.github.com/1555889

+0

你有關於如何做到這一點(鏈接或代碼)的任何信息,將大大appriciated! – Manuel 2012-01-03 10:20:09

+0

從哪裏得到wav文件?你用音頻文件服務API創建它們嗎? – 2012-01-03 11:39:41

+0

我用AVAudioRecorder錄製它們(在同一個應用程序中)。 – Manuel 2012-01-03 14:39:21