我目前正在 iPhone 中构建一个 http 服务器,允许 wifi 扬声器从中下载音乐。到目前为止,这是我所做的:
这是初始化http服务器的部分:
- (void)startHttpServer
{
[DDLog addLogger:[DDTTYLogger sharedInstance]];
_httpServer = [[HTTPServer alloc] init];
[_httpServer setType:@"_http._tcp."];
NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
[_httpServer setDocumentRoot:documentPath];
[_httpServer setPort:9088];
[_httpServer setName:@"Music Server"];
[self startServer]; }
这是获取音乐文件资产 URL 的部分:
if (currentGroupIndex < currentGroupPlayList.count)
{
[self.savedIndexInfo setObject:[NSNumber numberWithInteger:currentGroupIndex] forKey:groupIDNum];
//makes sure that there is no existing duplicated url;
NSURL *oneURL = [self.savedURLInfo objectForKey:groupIDNum];
[[NSFileManager defaultManager] removeItemAtURL:oneURL error:nil];
MPMediaItem *music = [currentGroupPlayList objectAtIndex:currentGroupIndex];
NSURL *assetURL = [music valueForProperty:MPMediaItemPropertyAssetURL];
[self exportAssetAtURL:assetURL
withTitle:[NSString stringWithFormat:@"song_%lld_%ld", groupID, (long)currentGroupIndex]
groupAdress:groupIP
groupID:groupID
songDuration:[[music valueForProperty:MPMediaItemPropertyPlaybackDuration]intValue]];
}
这是导入音乐文件并导出输出 url 的部分:
- (void)exportAssetAtURL:(NSURL*)assetURL withTitle:(NSString*)title groupAdress:(NSString *)groupAdress groupID:(UInt64)groupID songDuration:(NSInteger)duration
{
NSString *ext = [TSLibraryImport extensionForAssetURL:assetURL];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSURL *outURL = [[NSURL fileURLWithPath:[documentsDirectory stringByAppendingPathComponent:title]] URLByAppendingPathExtension:ext];
// we're responsible for making sure the destination url doesn't already exist
[[NSFileManager defaultManager] removeItemAtURL:outURL error:nil];
// create the import object
TSLibraryImport* import = [[TSLibraryImport alloc] init];
[import importAsset:assetURL toURL:outURL completionBlock:^(TSLibraryImport* import)
{
if (import.status == AVAssetExportSessionStatusCompleted)
{
NSString *musicURL = [NSString stringWithFormat:@"http://%@:9088/%@.%@", [self currentIPAddress], title, ext];
NSLog(@"URL: %@", musicURL);
cntl_http_pb_pkt pb;
pb.header.packet_type = CONTROL_PACKET;
pb.header.op = CNTL_PB_HTTP_PLAY;
pb.header.body_len = sizeof(pb.body);
const char *adressChar = [groupAdress cStringUsingEncoding:NSASCIIStringEncoding];
pb.body.group_addr = inet_addr(adressChar);
pb.body.group_port = htons(INIT_GROUP_PORT);
pb.body.seq = [NSDate timeIntervalSinceReferenceDate];
self.playSeq = pb.body.seq;
const char *urlChar = [musicURL cStringUsingEncoding:NSASCIIStringEncoding];
memcpy(pb.body.url, urlChar, 200);
NSData *data = [NSData dataWithBytes:&pb length:sizeof(pb)];
[self.savedURLInfo setObject:outURL forKey:[NSNumber numberWithUnsignedLongLong:groupID]];
[self.savedPlayData setObject:musicURL forKey:[NSNumber numberWithUnsignedLongLong:groupID]];
[self performSelectorOnMainThread:@selector(sendUdpData:) withObject:data waitUntilDone:YES];
_acting = NO;
}
else
{
_acting = NO;
NSLog(@"Error importing: %@", import.error);
}
import = nil;
}];
}
我的问题:
50% 的时候,要么无法从服务器下载音乐文件,要么下载速度极慢(低于 10kb/s)。我的问题是我不知道这个问题的可能原因是什么,我该如何解决这个问题。
不同的实例:
有时一开始下载速度还可以(下载速度在200+kb/s),然后什么都不做,速度会突然下降,使扬声器完全无法从服务器获取文件。请注意,没有其他设备连接到路由器,只有扬声器和电话。
有时一开始歌曲没有播放,几秒钟后开始播放。
有一次我尝试将8个扬声器连接到一个路由器,播放流畅,很好。但是在一个小时或更短的时间内,就会出现问题,就像会发生很多停止一样。
我尝试过的解决方案:
尝试连接不同类型路由器(TP-LINK、腾达、Netgear、mi等)下的所有扬声器。上述情况仍会发生。当歌曲停止播放或接收到的数据非常慢时,我尝试重新启动应用程序,重新启动手机,甚至重新启动路由器,但一开始速度仍然很慢。
尝试断开路由器与调制解调器的连接。
尝试仅连接四台设备和一部手机。
5.尝试关闭甚至不在同一网络下的所有其他wifi设备。
尝试更改http服务器的端口。
当问题发生时,我尝试检查连接是否消失,或者http服务器已关闭。但两者都可以。
记笔记:
我尝试使用浏览器访问该网址,下载速度与扬声器播放歌曲不流畅的时间一样慢。所以我想问题不在扬声器上。
出现问题时完全没有返回错误信息
在 NSLog 上检查时没有连接终止。
我的请求:
所以,如果你们知道可能导致这个问题的原因,请告诉我,或者更好,如果你知道这个问题的解决方案。真的很难确定问题是什么。因为没有反映错误消息,我尝试删除很多可能导致此问题的内容,但仍然没有好的结果。
任何帮助将不胜感激。