gpt4 book ai didi

ios - ios 的 Icecast 源码客户端

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:21:07 24 4
gpt4 key购买 nike

我一直在尝试为 ios 的 ice cast 创建一个源客户端。我已经能够使用 asyncsocket 连接到套接字。我还可以将数据写入服务器。 icecast 配置是针对 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];

为了录制,我正在使用 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 header 是错误的。尝试 audio/aacaudio/aacpaudio/mp4audio/mpeg4-generic

此外,您只需要一个 User-Agent header ,并且您应该选择与您正在编写的软件相匹配的 header ,而不是复制别人的 header 。将来,您的代码可能需要调整协议(protocol),并且只有在您使用自己的用户代理字符串时才有可能。

关于ios - ios 的 Icecast 源码客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17762019/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com