ios - iPhone : Error uploading audio wav bytes data to server

标签 ios audio

我正在开发 iOS 应用程序。我必须以编程方式将音频文件发送到我们的服务器。我正在使用以下代码将示例 wav 音频文件发送到服务器。我们的服务器只接受有符号字节数组格式的音频文件进行接收。

NSURL *urlPath = [NSURL fileURLWithPath: [[NSBundle mainBundle] pathForResource:@"Crash" ofType:@"wav"]];
NSString *wavbundlepath = [urlPath absoluteString];
NSLog(@"wavbundlepath: %@",wavbundlepath);
NSData *bytes = [wavbundlepath dataUsingEncoding:NSUTF8StringEncoding];
NSLog(@"bytes: %@",bytes);

NSString *recordPostLength = [NSString stringWithFormat:@"%d", [bytes length]];

NSMutableString *urlstr = [NSMutableString stringWithFormat:@"%@", @"http://www.mywebserver/api/UploadFile?Name="];
[urlstr appendString:@"crash"];
[urlstr appendFormat:@"&MemberID=%d", 0];
[urlstr appendFormat:@"&Type=%@",@"Recording"];
[urlstr appendFormat:@"&client=%@",@"ios"];
NSLog(@"urlstr.......%@",urlstr);

NSMutableURLRequest *recordRequest = [[NSMutableURLRequest alloc] init] ;
[recordRequest setURL:[NSURL URLWithString:urlstr]];
[recordRequest setHTTPMethod:@"POST"];
[recordRequest setValue:recordPostLength forHTTPHeaderField:@"Content-Length"];
[recordRequest setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
[recordRequest setHTTPBody:bytes];

NSURLResponse *recordResponse;
NSError *recordError;
NSData *recordResponseData = [NSURLConnection sendSynchronousRequest:recordRequest returningResponse:&recordResponse error:&recordError];
NSString *recordResp = [[NSString alloc]initWithData:recordResponseData encoding:NSUTF8StringEncoding];

NSLog(@"recordResp:%@", recordResp);

但问题是,总是收到“输入字符串不正确”。响应错误。

我不太了解将音频字节上传到服务器。有人可以检查此代码并告诉我这是用于将 wav 音频字节数组上传到服务器的有效代码吗?

谢谢。


更新代码

我尝试了下面的代码,因为我的服务器端工程师说不要在正文中添加任何其他东西,它工作正常并得到了积极的回应。但是,服务器无法处理我发送的格式 NSData 字节(32 位元素),因为服务器端实现为仅接收字节数组或仅接收带符号的字节数据格式。

NSURL *urlPath = [NSURL fileURLWithPath: [[NSBundle mainBundle] pathForResource:@"Temp" ofType:@"wav"]];

NSString *wavbundlepath = [urlPath absoluteString];
NSLog(@"wavbundlepath: %@",wavbundlepath);

NSData *bytes=[NSData dataWithContentsOfURL:urlPath];
NSLog(@"bytes: %@",bytes);

NSString *recordPostLength = [NSString stringWithFormat:@"%d", [bytes length]];

NSMutableString *urlstr = [NSMutableString stringWithFormat:@"%@", @"http://www.myserver.com/api/UploadFile?Name="];
[urlstr appendString:@"Temp"];
[urlstr appendFormat:@"&MemberID=%d", 0];
[urlstr appendFormat:@"&Type=%@",@"Recording"];
[urlstr appendFormat:@"&client=%@",@"ios"];
NSLog(@"urlstr.......%@",urlstr);

NSMutableURLRequest *recordRequest = [[NSMutableURLRequest alloc] init] ;
[recordRequest setURL:[NSURL URLWithString:urlstr]];

NSInputStream *dataStream = [NSInputStream inputStreamWithData:bytes];
[recordRequest setHTTPBodyStream:dataStream];

[recordRequest setHTTPMethod:@"POST"];

NSURLResponse *recordResponse;
NSError *recordError;
NSData *recordResponseData = [NSURLConnection sendSynchronousRequest:recordRequest returningResponse:&recordResponse error:&recordError];

NSString *recordResp = [[NSString alloc]initWithData:recordResponseData encoding:NSUTF8StringEncoding];
NSLog(@"recordResp:%@", recordResp);
recordResponceJson = [recordResp JSONValue]; 
NSLog(@"recordResponceJson = %@",recordResponceJson);
recId = [recordResponceJson valueForKey:@"ID"];
NSLog(@"recId....%@", recId);

有人可以指导我吗,我如何在这个 http 帖子中发送字节数组?

最佳答案

有几个问题: 首先,您读取文件的方式不会返回有效的 WAV 文件:

您应该使用 [NSData dataWithContentsOfURL:] 来读取字节。您阅读它们的方式将尝试将字节转换为字符。这会损坏您的 wav 文件。

其次,POST 正文的内容类型可能不正确。查看行:

[recordRequest setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];

音频字节不会以 x-www-form-urlencoded 格式编码。服务器更有可能接受 audio/wav 或 application/octet-stream 内容类型。请咨询您的服务器开发人员,以了解服务器的确切期望。

此外,您可能想查看名为 setHTTPBodyStream: 的 NSMutableURLRequest 方法,它让您无需将整个文件加载到内存中即可发送文件。

关于ios - iPhone : Error uploading audio wav bytes data to server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10862354/

相关文章:

java - Java播放的24位音频不正确

c# - Monogame-音乐和声音效果无法同时播放

ios - 无法识别的选择器发送到实例 0x7f9ccc8886a0

ios - Firebase 查询的问题

ios - iOS 中的自定义切换

android - Media.setLooping无法正常使用[Android]

ios - 这是什么 Apple Watch OS 警告 : "No custom interface defined for category "(null )". Will use system default presentation" mean?

ios - 如何在ios swift中实时更新单元格内容时实时更新tableview单元格内容

ubuntu - linux 使用 pactl 将音频通过管道传输到虚拟麦克风

iOS:同时录制和播放的示例代码