1

我目前正在 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个扬声器连接到一个路由器,播放流畅,很好。但是在一个小时或更短的时间内,就会出现问题,就像会发生很多停止一样。

我尝试过的解决方案:


  1. 尝试连接不同类型路由器(TP-LINK、腾达、Netgear、mi等)下的所有扬声器。上述情况仍会发生。

  2. 当歌曲停止播放或接收到的数据非常慢时,我尝试重新启动应用程序,重新启动手机,甚至重新启动路由器,但一开始速度仍然很慢。

  3. 尝试断开路由器与调制解调器的连接。

  4. 尝试仅连接四台设备和一部手机。

    5.尝试关闭甚至不在同一网络下的所有其他wifi设备。

  5. 尝试更改http服务器的端口。

  6. 当问题发生时,我尝试检查连接是否消失,或者http服务器已关闭。但两者都可以。

记笔记:

我尝试使用浏览器访问该网址,下载速度与扬声器播放歌曲不流畅的时间一样慢。所以我想问题不在扬声器上。

出现问题时完全没有返回错误信息

在 NSLog 上检查时没有连接终止。

我的请求:

所以,如果你们知道可能导致这个问题的原因,请告诉我,或者更好,如果你知道这个问题的解决方案。真的很难确定问题是什么。因为没有反映错误消息,我尝试删除很多可能导致此问题的内容,但仍然没有好的结果。

任何帮助将不胜感激。

4

0 回答 0