objective-c - 上载音频-HTTP流

标签 objective-c ios sockets audio-streaming cfstream

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

我该如何写一个HTTP流?在CFHTTPStream上我没有看到写方法,只读了:s
我需要使用 socket 吗?
谢谢!!!

我的实际代码是

   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的子类,并实现打开,关闭,读取,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]; 

关于objective-c - 上载音频-HTTP流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10537302/

相关文章:

node.js - NodeJS - 我的应用程序无法启动

objective-c - 每次在核心数据中插入数据后,应用程序变得更慢

ios - 在自定义单元格中设置自定义附件类型

objective-c - Xcode 8.1 未检测到何时未定义 Objective-c 方法

ios - 调整父 View 的大小以使其大小等于其 subview 的大小

iphone - 我的新版 iOS 应用程序仅在从应用程序商店加载时才会崩溃

ios - 访问iphone文件系统并复制文件

php - fsockopen-如何检测消息结束?

ios - 当我用 Obj-C 初始化时,可变的 Swift 数组变成 NSArray

到服务器的 Javascript TCP 连接