为iOS投冰源客户端

我一直在试图为ios创build一个用于投冰的源代码客户端。 我已经能够连接使用asyncsocket连接到套接字。 我也能够写入数据到服务器。 icecastconfiguration是为mp3格式完成的。 但写入服务器的MP3文件已损坏。 我正在提供一些代码片段。

标题:

NSString *string = @"SOURCE /sync HTTP/1.0\r\n" "Authorization: Basic c291cmNlOmhhY2ttZQ==\r\n" "User-Agent: butt-0.1.12\r\n" "User-Agent: butt-0.1.12\r\n" "content-type: audio/mpeg\r\n" "ice-name: sync's Stream\r\n" "ice-public: 0\r\n" "ice-genre: Rock\r\n" "ice-description: This is my server description\r\n" "Connection: keep-alive\r\n" "ice-audio-info: ice-samplerate=44100;ice-bitrate=48;ice-channels=2\r\n\r\n"; NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding]; //sending http request to write the header NSLog(@"Sending HTTP Request."); [socket writeData:data withTimeout:-1 tag:1]; //write buffer data to server [socket writeData:self.dataBuffer withTimeout:-1 tag:1]; 

对于录音我使用下面的代码来logging它使用aqrecorder。

 void AQRecorder::MyInputBufferHandler( void * inUserData, AudioQueueRef inAQ, AudioQueueBufferRef inBuffer, const AudioTimeStamp * inStartTime, UInt32 inNumPackets, const AudioStreamPacketDescription* inPacketDesc) { AQRecorder *aqr = (AQRecorder *)inUserData; try { if (inNumPackets > 0) { // write packets to file XThrowIfError(AudioFileWritePackets(aqr->mRecordFile, FALSE, inBuffer->mAudioDataByteSize, inPacketDesc, aqr->mRecordPacket, &inNumPackets, inBuffer->mAudioData), "AudioFileWritePackets failed"); aqr->mRecordPacket += inNumPackets; NSLog(@"size = %u",(unsigned int)inBuffer->mAudioDataByteSize); data = [[[NSData alloc]initWithBytes:inBuffer->mAudioData length:inBuffer->mAudioDataByteSize]retain]; server *srv = [[server alloc]init]; srv.dataBuffer=data; [srv connecting]; } // if we're not stopping, re-enqueue the buffe so that it gets filled again if (aqr->IsRunning()) XThrowIfError(AudioQueueEnqueueBuffer(inAQ, inBuffer, 0, NULL), "AudioQueueEnqueueBuffer failed"); } catch (CAXException e) { char buf[256]; fprintf(stderr, "Error: %s (%s)\n", e.mOperation, e.FormatError(buf)); } } void AQRecorder::StartRecord(CFStringRef inRecordFile) { // server *srv=[[server alloc]init]; // [srv connecting]; int i, bufferByteSize; UInt32 size; CFURLRef url = nil; try { mFileName = CFStringCreateCopy(kCFAllocatorDefault, inRecordFile); // // specify the recording format // SetupAudioFormat(kAudioFormatMPEG4AAC); // specify the recording format, use hardware AAC if available // otherwise use IMA4 if(IsAACHardwareEncoderAvailable()) SetupAudioFormat(kAudioFormatMPEG4AAC); else SetupAudioFormat(kAudioFormatAppleIMA4); // create the queue XThrowIfError(AudioQueueNewInput( &mRecordFormat, MyInputBufferHandler, this /* userData */, NULL /* run loop */, NULL /* run loop mode */, 0 /* flags */, &mQueue), "AudioQueueNewInput failed"); // get the record format back from the queue's audio converter -- // the file may require a more specific stream description than was necessary to create the encoder. mRecordPacket = 0; size = sizeof(mRecordFormat); XThrowIfError(AudioQueueGetProperty(mQueue, kAudioQueueProperty_StreamDescription, &mRecordFormat, &size), "couldn't get queue's format"); NSString *recordFile = [NSTemporaryDirectory() stringByAppendingPathComponent: (NSString*)inRecordFile]; //url = CFURLCreateWithString(kCFAllocatorDefault, (CFStringRef)recordFile, NULL); url = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, (CFStringRef)recordFile, kCFURLPOSIXPathStyle, false); // create the audio file OSStatus status = AudioFileCreateWithURL(url, kAudioFileCAFType, &mRecordFormat, kAudioFileFlags_EraseFile, &mRecordFile); CFRelease(url); XThrowIfError(status, "AudioFileCreateWithURL failed"); // copy the cookie first to give the file object as much info as we can about the data going in // not necessary for pcm, but required for some compressed audio CopyEncoderCookieToFile(); // allocate and enqueue buffers bufferByteSize = ComputeRecordBufferSize(&mRecordFormat, kBufferDurationSeconds); // enough bytes for half a second for (i = 0; i < kNumberRecordBuffers; ++i) { XThrowIfError(AudioQueueAllocateBuffer(mQueue, bufferByteSize, &mBuffers[i]), "AudioQueueAllocateBuffer failed"); XThrowIfError(AudioQueueEnqueueBuffer(mQueue, mBuffers[i], 0, NULL), "AudioQueueEnqueueBuffer failed"); } // start the queue mIsRunning = true; XThrowIfError(AudioQueueStart(mQueue, NULL), "AudioQueueStart failed"); } catch (CAXException e) { char buf[256]; fprintf(stderr, "Error: %s (%s)\n", e.mOperation, e.FormatError(buf)); } catch (...) { fprintf(stderr, "An unknown error occurred\n");; } } 

我是否需要更改写入服务器的格式?

你不发送MP3数据,你正在发送AAC或M4A数据。 我不相信Icecast支持M4A。 你真的使用Icecast或其他服务器?

对于AAC,您的Content-Type标头是错误的。 尝试audio/aacaudio/aacpaudio/mp4audio/mpeg4-generic

另外,您只需要一个User-Agent头,您应该select与您正在编写的软件相匹配的内容,而不是复制其他人的内容。 将来,可能需要对代码进行协议调整,而且只有在使用自己的用户代理string时才有可能。