[Résolu] NSURLRequest + NSInputStream et NSMutableData

Am_MeAm_Me Membre
juillet 2013 modifié dans API UIKit #1

Voila donc ce post se lie avec http://forum.cocoacafe.fr/topic/11274-envoyer-un-fichier-txt-ou-audio-par-paquet/ où j'explique que je cherche à  envoyer des bouts d'audio en streaming


 


En gros j'enregistre et en meme temps j'envoi l'audio que je vient d'acquérir


 


Est-ce possible avec NSInputStream, NSUrlrequest et une mutabledata d'envoyer un bout du fichier en construction ?


 


Ici en l'occurence j'utilise l'AudioQueue pour enregistrer l'audio


 


Merci


 


MAJ : sachant que si ma piste audio ressemble a ca par exemple:


 


0 seconde |__________ | __________ | __________ | __________| 12 secondes


                              *1                     *2                         *3                      *4


 


Pour ceux qui auraient des problèmes d'affichage voici une image : 


Réponses

  • AliGatorAliGator Membre, Modérateur
    Je n'ai jamais fait mumuse avec encore, mais rien qu'en regardant la doc de CFReadStream, la classe CoreFoundation toll-free bridged équivalente à  NSInputStream, il semble que cela soit possible, puisqu'on peut initialiser le CFReadStream avec un buffer en mode NoCopy, et remplir le buffer après coup. Avec HasBytesAvailable qui dit s'il y a des octets lisibles dans le stream sans bloquer, ce qui sous-entend qu'on peut ne pas en avoir encore car on est en famine mais que y'en aura plus tard, etc... y'a sans doute moyen de faire ce que tu veux, puisqu'après tout CFReadStream reprend les principes d'un pipe ou de tout canal de données que l'on peut remplir au fur et à  mesure, lire au fur et à  mesure, et savoir si on arrive en famine ou si on arrive en surcharge de buffer, etc


    Après pour la mise en pratique je ne me base que sur ce que je viens de lire dans la doc, y'a sans doute des exemples associes il va falloir tester un peu ;)
  • Ok merci pour ta réponse : Je vais faire un tour sur CFReadStream et WriteStream


    Mmmmh je sens que je vais m'amuser ;D


  • FKDEVFKDEV Membre
    juillet 2013 modifié #4

    Tu peux regarder le fichier PostController.m dans l'exemple SimpleURLConnections d'Apple.


     


    Il faut regarder la variable producerStream.


     


    Pour tester dans ton coin, tu peux mettre en place CocoaHTTPServer et activer tous les logs. Tu devrais voir tes paquets arrivés en mode "chunk".


  • Am_MeAm_Me Membre
    juillet 2013 modifié #5

    Finalement je laisse tomber le writeStream et ReadStream ca ne me mene à  rien


     


    @FKDEV merci j'ai lu mais ca pourrait aider beaucoup de personnes mais pas moi :/ ca me parrait difficile pour ce que je veux faire


     


    Finalement je vais me lancer sur le CFSocket ... En gros je vais coder dans le pur  :o


     


    Pour ceux qui n'ont pas le livre iOS sdk ... Livre Numérique


     


     


    MAJ : Ceux qui auraient un tuto à  proposer sur CFSocket ou une classe simple d'utilisation je suis preneur et cela pourrait aider les futurs utilisateurs du CFSocket ;D


  • Sans vouloir te dissuader, il y a ASIHTTPRequest aussi.


    Le projet n'est plus maintenu mais ça reste un bon outil qui gère l'envoi en mode chunk.


     


    http://allseeing-i.com/ASIHTTPRequest/How-to-use#streaming


  • Merci !


     


    Mais la encore le meme problème revient : Sur ces classes on envoi un fichier finalisé. Ou je me trompe ?


  • FKDEVFKDEV Membre
    juillet 2013 modifié #8

    Oui en fait je crois que tu as raison pour ASIHTTPRequest car si on peut faire plusieurs appels à  la méthode appendPostData, j'ai l'impression qu'ils sont tous fait avant le démarrage de la requête via startSynchronous.



    NSURL *url = [NSURL URLWithString:@http://allseeing-i.com/ignore];
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    [request setShouldStreamPostDataFromDisk:YES];
    [request appendPostData:myBigNSData];
    [request appendPostDataFromFile:@/Users/ben/Desktop/bigfile.txt];
    [request startSynchronous];

    Cependant, ASIHTTPRequest utilise la fonction CFReadStreamCreateForStreamedHTTPRequest.


    Si j'ai bien compris, cette fonction te permet d'alimenter une requête avec un CFStreamReadRef. Donc tu pourrais intervenir dans ASIHTTPRequest au moment où cet appel se fait pour fournir ta propre classe dérivé de NSInputStream. Tu as 3 méthodes à  surcharger pour fournir tes propres données dont la source peut donc être tes paquets audio.


     


    Dans l'autre exemple, par contre, je pense que cela correspond aussi à  ce que tu veux, maisl il y a sans doute un peu plus de travail. D'ailleurs il y a un autre exemple dans la doc, plus simple à  lire :



    - (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode
    {
    switch(eventCode) {
    case NSStreamEventHasSpaceAvailable: {
    uint8_t *readBytes = (uint8_t *)[_data mutableBytes];
    readBytes += byteIndex; // instance variable to move pointer
    int data_len = [_data length];
    unsigned int len = ((data_len - byteIndex >= 1024) ? 1024 : (data_len-byteIndex));
    uint8_t buf[len];
    (void)memcpy(buf, readBytes, len);
    len = [stream write:(const uint8_t *)buf maxLength:len];
    byteIndex += len;
    break;
    }
    // continued ...
    }
    }

    En gros dès qu'un buffer a été envoyé, tu reçois un événement NSStreamEventHasSpaceAvailable  pour t'indiquer que tu peux envoyer le buffer suivant.


  • Am_MeAm_Me Membre
    juillet 2013 modifié #9

    Bon finalement j'ai pas mal avancé niveau CFNetworking 


     


    Petit probleme j'utilise la fonction send ou sendmsg ou sendfile mais quand je compile j'ai ca 

  • Doit te manquer un import : sys/socket ou un truc du genre...


  • Am_MeAm_Me Membre
    juillet 2013 modifié #11


    Doit te manquer un import : sys/socket ou un truc du genre...




     


    Alors en framework j'ai ca : 

  • Am_MeAm_Me Membre
    juillet 2013 modifié #12

    Je sens que c'est le karma :D


    Bon je vais essayer de trouver une alternative de cette méthode


     


    MAJ : Je viens de remarquer un warning en relation avec mon send : Implicit declaration of function 'SFSocketGetNative' is invalid in C99


  • Am_MeAm_Me Membre
    juillet 2013 modifié #13

    Hmmm la fonction s'appel plutot CFSocketGetNative  :o  alors que sur certain tuto c'est SFSocketGetNative ....


    Bon j'ai EXC_BAD_ACCESS  <3 </p>

    Je vais me débrouiller pour trouver la raison


     


    Merci à  tous


     


    MAJ : LE sigpipe se produit quand le port n'est pas ouvert , actuellement j'utilise netcat et si je ne tape pas la commande pour écouter les paquets au niveau application ca crash et c'est normal


Connectez-vous ou Inscrivez-vous pour répondre.