1

ICEcast ストリームのオーディオ ソースとして iPhone を使用したいと考えています。

1) このストリームを送信する必要がある AudioQueueInputCallback はどこですか?

2) ICEcast Icecast 2 のプロトコルを特定できました: プロトコルの説明、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 サーバーへのソケット接続を開きます。

4

1 に答える 1

1

これは重要な問題です。あなたが言及する「プロトコル」は、ほんの数人のパケットを盗聴し、いくつかの推測をする人です。ICESソースコードを調べると、Icecastサーバーに送信するための実際の方法がわかります。これは、非常に複雑なカスタムストリーミングプロトコルです。関連するコードは、stream.cとstream_shared.cの2つのファイルにあります。ただし、ストリームがすでに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のルーチンに配信するためのものです。

于 2012-10-25T16:41:17.020 に答える