上传音频 – http流媒体

我正在尝试在流模式下在http下上传一个线性文件。 想法是同时执行此步骤,1)线程1:记录音频文件并将其存储在临时文件中2)线程2:从临时文件中取n个字节并将其发送到http服务器。

我怎么能写一个http流?,在CFHTTPStream上我没有看到写方法,只读:s我需要使用套接字吗? 谢谢!!!

我的实际代码是

CFWriteStreamRef stream; NSString *strUrl = @"myurl"; NSURL *url = [[[NSURL alloc] initWithString:strUrl] retain]; CFStringRef requestMethod = CFSTR("GET"); CFHTTPMessageRef message= CFHTTPMessageCreateRequest(kCFAllocatorDefault, requestMethod, (CFURLRef)url, kCFHTTPVersion1_1); CFHTTPMessageSetHeaderFieldValue(message, CFSTR("Content-Type"), CFSTR("multipart/form-data")); stream = ?? //CFReadStreamCreateForHTTPRequest(NULL, message); CFRelease(message); //other headers... if (CFWriteStreamSetProperty(stream, kCFStreamPropertyHTTPShouldAutoredirect, kCFBooleanTrue) == false) { NSLog(@"Error"); return NO; } // // Open the stream // if (!CFWriteStreamOpen(stream)) { CFRelease(stream); NSLog(@"Error"); return NO; } CFStreamClientContext context = {0, self, NULL, NULL, NULL}; CFWriteStreamSetClient(stram, kCFStreamEventHasBytesAvailable | kCFStreamEventErrorOccurred | kCFStreamEventEndEncountered, RSWriteStreamCallBack, &context); CFWriteStreamScheduleWithRunLoop(stream, CFRunLoopGetCurrent(), kCFRunLoopCommonModes); 

解决方案是创建NSInputStream的子类,并实现方法open,close,read,hasBytesAvailable并且不要忘记 – (NSStreamStatus)streamStatus。 从http调用最后一个方法来知道我们是打开,关闭还是我们完成了(NSStreamStatusAtEnd)要发送(还有其他状态,但这是最重要的)。 我使用像缓冲区这样的tmp文件,因为我必须发送大量数据,但是,数据内存缓冲区可能更好。 最后我实现了其他类使用我的自定义NSInputStream,这里是代码:

  NSURL *url = [NSURL URLWithString:@"url"]; NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:url]; [req setHTTPMethod:@"POST"]; //set headers if you have to do for example: NSString *contentType = [NSString stringWithFormat:@"multipart/form-data"]; [req setValue:contentType forHTTPHeaderField:@"Content-Type"]; //Create your own InputStream instream = [[CustomStream alloc] init]; [req setHTTPBodyStream:instream]; //I remove instream later NSURLConnection *aConnection = [[NSURLConnection alloc] initWithRequest:req delegate:self startImmediately:NO]; [aConnection scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; [aConnection start];