【问题标题】:Upload audio - http streaming上传音频 - http 流式传输
【发布时间】:2012-05-10 15:26:04
【问题描述】:

我正在尝试以流模式在 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);

【问题讨论】:

    标签: objective-c ios sockets audio-streaming cfstream


    【解决方案1】:

    解决方法是创建一个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]; 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-25
      • 2013-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多