ios - Icecast流源客户端iOS

标签 ios core-audio audio-streaming icecast

我想使用 iPhone 作为 ICEcast 流的音频源。

1) AudioQueueInputCallback 是我应该发送这个流的地方吗?

2) 我已经能够识别 ICEcast 的协议(protocol) Icecast 2: protocol description, streaming to it using C# 但是,我不确定如何在回调代码中执行此操作(即如何发送二进制音频)

更新

static void MyAQInputCallback( void *inUserData, 
  AudioQueueRef inQueue,
  AudioQueueBufferRef inBuffer,
  const AudioTimeStamp *inStartTime,
  UInt32 inNumPackets,
  cont AudioStreamPacketDescription *inPacketDesc)
{

    if (inNumPackets > 0)
    {
       // instead of
       //     AudioFileWritePackets(someFile, FALSE, 
       //           inBuffer->mAudioDataByteSize,
       //           inPacketDesc, recordPacketNumber, 
       //           &inNumPackets, inBuffer->mAudioData);

       // I want to send to http://myicecastserver
       // instead
    }

}

更新

我将打开一个套接字连接到我的 icecast 服务器以发送数据。

最佳答案

这是一个不平凡的问题。您提到的“协议(protocol)”只是一些人嗅探几个数据包并进行一些猜测。如果您检查 ICES 源代码,您可以看到发送到 Icecast 服务器的实际方法,它是一个高度复杂的自定义流协议(protocol)。相关代码位于两个文件中:stream.c 和 stream_shared.c 假设您的流已经编码为 PCM。为了了解这种流式传输算法的复杂性,这里是发件人的一小段摘录:

   else if (sdsc->enc)
    {
        ogg_page og;
        int be = (sdsc->input->subtype == INPUT_PCM_BE_16)?1:0;
        int ret=1;

        /* We use critical as a flag to say 'start a new stream' */
        if(buffer->critical)
        {
            if(sdsc->resamp) {
                resample_finish(sdsc->resamp);
                encode_data_float(sdsc->enc, sdsc->resamp->buffers,
                        sdsc->resamp->buffill);
                resample_clear(sdsc->resamp);
                sdsc->resamp = resample_initialise (sdsc->stream->channels,
                        sdsc->stream->resampleinrate, sdsc->stream->resampleoutrate);
            }
            encode_finish(sdsc->enc);
            while(encode_flush(sdsc->enc, &og) != 0)
            {
                if ((ret = stream_send_data(sdsc, og.header, og.header_len)) == 0)
                    return 0;
                if ((ret = stream_send_data(sdsc, og.body, og.body_len)) == 0)
                    return 0;
            }
            encode_clear(sdsc->enc);

            if(sdsc->input->metadata_update)
            {
                vorbis_comment_clear(&sdsc->vc);
                vorbis_comment_init(&sdsc->vc);

                sdsc->input->metadata_update(sdsc->input->internal, &sdsc->vc);
            }

正如我所说,这只是代码的 10% 左右。字面上有一页又一页的错误检查、元数据传输等等。如果你想创建一个自定义的 Icecast 源客户端,你必须复制所有这些代码,将其移植到你的程序中,然后将你的输入编码为 PCM,然后打包它用于传递给 stream.c 和 stream_shared.c 中的例程。

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

相关文章:

ios - Swift - 减少视频的重量

ios - 快速将 float 组写入 wav 音频文件

iphone - 将音频/视频流传输到HTTP服务器以外的iPhone

java - 使用音轨 android studio 改变音调

ios - 中心位置时在 UICollectionViewCell 上添加掩码

ios - AFNetworking 同步运行

audio - 如何创建AIFF文件

iphone - 减小转换后的音频文件的大小

iphone - 如何在 iPhone 中寻找流式音频?

ios - 为什么 iPhone 5S 和 iPad Air 之前的设备在转换 null 变量时不会崩溃?