2

AVAssetReaderを使用して、コンピューターでローカルに再生できる.cafファイルを作成しています。ただし、.cafをサーバーにアップロードしようとすると、アップロードされたファイルを読み取ることができなくなります。これが私のコードです:

NSLog(@"Posting to server");
NSURL *serverURL = [NSURL URLWithString:serverString];
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:serverURL];
[request setRequestMethod:@"POST"];
[request setData:songData
    withFileName:@"exported.caf"
  andContentType:@"audio/x-caf"
          forKey:@"musicfile"];
[request setDelegate:self];
[request startAsynchronous];

興味深いことに、次のことを行うと、生成されたファイルは私のコンピューターで機能します。

NSString *applicationDocumentsDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *storePath = [applicationDocumentsDir stringByAppendingPathComponent:@"test.caf"];
[songData writeToFile:storePath atomically:NO];

.cafを適切にフォーマットするには、musicDataに何らかのヘッダーを追加する必要がありますか?

4

1 に答える 1

2

問題を特定するためのトラブルシューティングのメモを次に示します。

  1. ローカルで再生したのとまったく同じオーディオリーダーアプリを使用してサーバーで曲を再生していることを確認します(つまり、サーバーオーディオアプリに.cafファイルを読み取るための適切なデコーダーがある可能性を排除します。これを試すことで簡単にトラブルシューティングできます。リモートサーバーで元のファイル(つまり、自分で作成していないファイル、動作することが証明されている.cafファイル)を再生します。

  2. 原因を特定するのに問題がある問題に直面したときはいつでも、一歩下がって最初の原則を使用してください。この場合..hexfiendのような16進エディタをダウンロードし、ローカルで取得したファイルをサーバー上のファイルと比較します。値に不一致が見られる場合は、転送中に値が混乱したことを意味します。これは、ビッグエンディアン/スモールエンディアンネットワーク転送の問題全体が原因で発生します(ビッグ/スモールエンディアンの意味については、ここで詳しく説明しています。CFSwapInt16BigToHostなどの関数を使用してこの問題を解決します(例として使用されます。最終的に使用する必要があるものになります)。

  3. CFNetworkAPIのラッパーであるASIHTTPRequestAPIを使用しています。目的はあなたの生活を楽にすることであると述べられていますが、この場合、内部に隠されているものが多すぎると(つまり、問題を簡単にデバッグできない場合)、その目的は達成されなくなります。その場合は、レイヤーをさらに深くジャンプして、CFNetworkAPIを直接使用することをお勧めします。(それほど難しくはなく、間違いなくデバッグが簡単です)。

于 2013-03-24T06:46:40.080 に答える