2011-12-16 3 views
1

Objective-Cプロジェクト内で2つの.wavファイルをマージしようとしています。私はそれがこの出力を与えることを考えています:file1 +(file2 - header)。その場合、新しいサイズを反映するために最初のファイルのヘッダーを変更する必要があります。最初のファイルが空の場合(初めての場合のみ)、メソッドは2番目のファイルを全体として返しますが、ファイル1のURLに返します。今私が持っている:WAVファイルをマージすると、NSURLが無効なサマリを返します

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は次のように定義されています:

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

が、私はこのようにそれを呼び出す

@interface class : UIViewController 
     .... 
     NSURL *soundFileURL; 
     NSURL *finalSoundFileURL; 
     .... 
    } 

私が今持っている問題は、tempURLます正しく返されますが、私がfinalSoundFileURL = [tempURL copy];を実行すると、finalSoundFileURLはデバッグ中に「無効な要約」と表示されます。 tempURLは正しいURLを返します。私はURLの中でwavを再生することはできませんので、何かが間違っています。

何が起こっているのか分かりません。どんな助けもありがとう!

EDIT

は私が何デバッガショーのいくつかのスクリーンショットを作りました。下の写真はtempURLだけで結構です示したよう:(一時は最後の1にコピーされた後)は、まったく同じ瞬間に img1

finalSoundFileURLはこれを示しています img2

これはのための大きな謎であります私。これは私に不思議にさせる、それはなぜ無効ですか?それはちょうどコピーされているので(それ自身のメモリ空間を持っています)、リリースされていません!私がこれに間違っているなら、私を修正してください。

+0

私は毎日この質問をチェックしていますので、知りたいことを聞いてください^ _^ – Manuel

+0

finalSoundFileURLはどこに宣言しますか?あなたはそれを過剰にリリースする可能性はありますか? –

+0

変数が一時停止している場所を基準にスコープ外にある場合、デバッガに「無効なサマリー」が表示されます。 'finalSoundFilaURL' NSURL変数はどこに定義されていますか? '[soundFileURL release]に割り当てた後にブレークポイントを設定し、その時点で何が表示されているのかを確認してください。 – Jessedc

答えて

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の両方をビルドするときはおそらくNOPですが、明示的にするのはおそらく良いでしょう。

+0

チップをありがとう、私はこれを変更しました(残念ながら、問題を解決しませんでした:)。 – Manuel

+0

あなたはそれを解決しましたか? –

関連する問題