使用ASIHTTPRequest将.caf发送到服务器

时间:2013-03-24 05:57:51

标签: ios objective-c core-audio asihttprequest

我正在使用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?

1 个答案:

答案 0 :(得分:1)

这里有一些解决问题的麻烦,以确定问题:

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

  2. 每当您遇到无法确定原因的问题时,请退一步并使用第一原则。在这种情况下..下载一个像hexfiend这样的十六进制编辑器,并将你在本地获得的文件与服务器上的文件进行比较..如果你看到值有任何差异,那就意味着这些值搞砸了在转移期间。这是因为整个 big endian / small endian 网络转移issue(您可以找到关于大/小端所指的here的良好讨论,您可以通过以下方式解决此问题:使用CFSwapInt16BigToHost等函数(用作示例..它可能不是您最终必须使用的那个)。

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