2012-10-16 7 views
1

Je souhaite utiliser un iPhone comme source audio pour un flux ICEcast.Client source de flux Icecast iOS

1) est le AudioQueueInputCallback où je devrais envoyer ce flux?

2) Je suis en mesure d'identifier le protocole de Icecast Icecast 2: protocol description, streaming to it using C# Cependant, je ne suis pas certain comment faire cela dans le code de rappel (comment envoyer l'audio binaire)

MISE À JOUR

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 
    } 

} 

MISE à JOUR

Je vais ouvrir une connexion socket à mon serveur Icecast pour envoyer les données.

+0

Pouvez-vous poster le code que vous avez déjà saisi? – Brad

+0

J'ai ajouté du code. – JonathanC

+0

@JonathanC Bonjour, Avez-vous réalisé ceci? Pourriez-vous s'il vous plaît partager le code comment envoyez-vous les données au serveur icecast? Et quelle bibliothèque de socket vous utilisez? – TheTiger

Répondre

1

Ceci est un problème non-trivial. Le "protocole" que vous mentionnez est juste un gars reniflant quelques paquets et faisant quelques suppositions. Si vous examinez le code source ICES, vous pouvez voir la méthodologie actuelle d'envoi à un serveur Icecast et il s'agit d'un protocole de streaming personnalisé très complexe. Le code correspondant se trouve dans deux fichiers: stream.c et stream_shared.c en supposant que votre flux est déjà codé sur PCM. Pour donner une idée de la complexité de cet algorithme de diffusion en continu, voici un petit extrait de l'expéditeur:

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); 
      } 

Comme je l'ai dit, ce ne représente qu'environ 10% du code. Si vous souhaitez créer un client source Icecast personnalisé, vous devez copier tout ce code, le porter sur votre programme, puis encoder votre entrée en tant que PCM, puis mettre en paquet pour la distribution aux routines dans stream.c et stream_shared.c.

+0

Je suppose que c'est la bonne façon de le faire. Je travaille sur une preuve de concept donc je pense que pour ma première étape je vais simplement essayer de créer un client source rudimentaire en utilisant les informations que d'autres personnes ont collectées en reniflant des paquets. Ensuite, je pourrais essayer de faire un bon port. – JonathanC

+1

@Tyler, Si vous avez des corrections à apporter à ma réponse, s'il vous plaît faire. Bien sûr, si vous souhaitez inclure du code GPL dans votre projet, vous pouvez utiliser du code provenant du client source Icecast. Si vous avez du temps libre, vous pouvez le démonter et le travailler. Ou, vous pouvez regarder les données brutes envoyées, ce qui est très simple. Je ne suis pas en désaccord sur le fait que l'utilisation de ce qui est déjà construit est la voie à suivre lorsque cela est possible, mais vous laissez entendre que ce que j'ai posté est incorrect car il a été écrit sur la base de l'observation. Je ne suis pas d'accord. Encore une fois, si vous voyez quelque chose de mal, n'hésitez pas à modifier, ou commenter et je vais modifier. – Brad

Questions connexes