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];

我是否必须在 musicData 中附加某种类型的标头才能正确格式化 .caf?

4

1 回答 1

2

以下是一些用于识别问题的故障排除说明:

  1. 确保您使用与在本地播放歌曲完全相同的音频阅读器应用程序在服务器中播放歌曲(即消除服务器音频应用程序具有适当解码器来读取.caf文件的可能性。您可以通过尝试轻松解决该问题.caf在远程服务器上播放原始文件(即不是您自己创建的,已证明可以工作的)文件。

  2. 每当您遇到无法确定原因的问题时..然后退后一步并使用第一原则。在这种情况下.. 下载一个像hexfiend这样的十六进制编辑器,并将您在本地获得的可以读取的文件与服务器上的文件进行比较.. 如果您发现值有任何差异,这意味着这些值在传输过程中被弄乱了。发生这种情况是因为整个大端/小端网络传输问题(您可以在此处找到有关大/小端含义的很好的讨论,您可以使用CFSwapInt16BigToHost等函数解决此问题(用作示例......它可能不会成为你最终不得不使用的那个)。

  3. 您正在使用ASIHTTPRequest API.. 它是 CFNetwork API 的包装器。它的目的是让您的生活更轻松,但在这种情况下,如果隐藏在引擎盖下的太多(即您无法轻松调试问题),则不再实现该目的。如果是这样的话,我建议你更深一层,直接使用CFNetwork API。(这并不难,而且肯定更容易调试)。

于 2013-03-24T06:46:40.080 回答