Question

J'ai un serveur qui envoie des données via un socket, les données sont un fichier wav. Je peux facilement écrire les données sur disque, puis les lire au format WMP, mais je ne sais pas comment je peux les jouer lorsque je les lis depuis le socket. Est-ce possible?

Question bonus: comment le ferais-je si le flux était au format mp3 ou autre?

Ceci concerne les fenêtres en C ++ natif.

Était-ce utile?

La solution

Comme vous avez dit WMP, je suppose que la question s’applique à la lecture d’un fichier wav sur une machine Windows. Sinon, cette réponse n'est pas pertinente.

Ce que vous voulez faire n’est pas trivial. Il existe un bon article ici sur le projet de code décrivant le format audio Windows. modèle. Il décrit comment configurer le périphérique audio et comment transférer des données dans le périphérique pour la lecture. Vous " simplement " besoin de fournir des données provenant de votre socket en tant que données pour les tampons de lecture. Mais c’est là que réside tout le travail délicat. Vous devez être sûr que

  • Vous avez suffisamment de données pour commencer une lecture
  • Traitez le cas lorsque votre socket manque de données et que vous n'avez rien à envoyer au tampon de lecture
  • Vous êtes en mesure de lire les données hors du socket avec une vitesse suffisante pour que les tampons de lecture soient saturés

C'est un exercice intéressant. Mais délicat.

Autres conseils

Mark a raison de dire que ce problème est délicat. Cela risque d’être moins compliqué si vous utilisez DirectSound au lieu de waveOut. Voici un article sur le streaming de fichiers wave à partir du disque: le streaming depuis le réseau est essentiellement le même processus. Assurez-vous de collecter suffisamment de données sur le réseau avant de commencer - vous voudrez plus que les 2 mémoires tampons mentionnées dans l'article.

FMOD serait encore moins compliqué. De la FAQ :

Fonctionnalités Internet améliorées

  • streaming audio sur Internet. Un code de diffusion Internet personnalisé est inclus, ce qui permet une prise en charge transparente de la diffusion SHOUTcast, Icecast et http.
  • Capacité de téléchargement. Un effet secondaire du système de fichiers modulaire de FMOD qui prend en charge les fichiers réseau, même des échantillons statiques peut être chargé à partir d’Internet.

Prise en charge des formats de fichier : le FMOD prend actuellement en charge une large gamme de formats de fichiers audio. liste partielle :

  • MP3 - (MPEG I / II couche 3, avec prise en charge de VBR)
  • OGG - (format Ogg Vorbis)
  • WAV - (fichiers Microsoft Wave, y compris les fichiers wav compressés. Fichier wav compressé PCM, MP3 et IMA ADPCM

Mark a raison de dire que ce problème est délicat. L'API waveOutXXXX est ancienne (elle est antérieure à Windows 95) et nécessite un codage plus sujet aux erreurs que vous ne le pensez. Vous aurez plus de facilité à interagir avec l'API en C ++ qu'avec C #. Assurez-vous simplement que c'est quelque chose que vous voulez vraiment faire.

Si votre flux utilise un format autre que les données de fichier WAV (comme MP3 ou WMA), vous devrez effectuer l'étape supplémentaire consistant à décoder les données au format WAV et à les lire à l'aide de l'API waveOutXXXX. Trouver un bon composant pour effectuer le décodage MP3 est plus délicat que prévu - je pense que cela est lié à la situation en matière de licences Fraunhofer (vous êtes censé les payer si vous utilisez du code MP3 de quelque manière que ce soit).

Je trouverais un produit prêt à l'emploi pour le faire, à moins que vous ne souhaitiez une expérience d'apprentissage.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top