2013-10-16 5 views
0

Actuellement, j'ai une fonctionnalité sur un site Web ASP.NET où l'utilisateur peut lire des fichiers MP3. Le code ressemble à ceci:Streaming MP3 Chunks sur ASP.NET

Response.Clear(); 
Response.ContentType = "audio/mpeg"; 

foreach (DataChunk leChunk in db.Mp3Files.First(mp3 => mp3.Mp3ResourceId.Equals(id)).Data.Chunks.OrderBy(chunk => chunk.ChunkOrder)) 
{ 
    Response.BinaryWrite(leChunk.Data); 
} 

Malheureusement, si un fichier MP3 est plus sélectionné, l'audio ne commence pas à jouer jusqu'à ce que le fichier est téléchargé entier, ce qui peut provoquer un retard notable. Y a-t-il un moyen de lancer immédiatement la lecture du MP3, même si le fichier entier n'est pas encore transféré?

+0

Cela peut aider à http: // stackoverflow.com/questions/9600856/how-to-deliver-gros-fichiers-dans-asp-net-réponse – cem

Répondre

0

Essayez de définir Response.BufferOutput = false avant de diffuser la réponse.

+0

Si vous définissez cette valeur sur false, l'hôte distant a fermé la connexion, le code d'erreur est 0x800703E3. " – GWLlosa

1

Vous devriez être en mesure de faire ce que vous voulez en écrivant à l'outpstream de la réponse, à savoir:

Response.OutputStream.Write

Il est probablement une bonne idée de vérifier au préalable si la réponse. IsClientConnected et abandonner sinon.

J'ai trouvé une démo qui permet la lecture des fichiers mp3 à partir d'une application web asp.net: http://aspsnippets.com/Articles/Save-MP3-Audio-Files-to-database-and-display-in-ASPNet-GridView-with-Play-and-Download-option.aspx

0

Si l'emplacement des fichiers MP3 sont accessibles au public à votre utilisateur, puis une autre approche pourrait être juste retour l'URL du MP3 et utilisez les balises audio HTML 5 dans votre balise pour diffuser la musique. Je suis assez sûr que le comportement par défaut de la balise audio serait de diffuser le fichier plutôt que d'attendre que le fichier entier ait été téléchargé.

1

essayez ceci:

Response.BufferOutput = false; //sets chunked encoding 
    Response.ContentType = "audio/mpeg"; 

    using (var bw = new BinaryWriter(Response.OutputStream)) 
    { 
     foreach (DataChunk leChunk in db.Mp3Files.First(mp3 => mp3.Mp3ResourceId.Equals(id)).Data.Chunks.OrderBy(chunk => chunk.ChunkOrder)) 
     { 
      if (Response.IsClientConnected) //avoids the host closed the connection exception 
      { 
       bw.Write(leChunk.Data); 
      } 
     } 
    } 

Aussi, allez yo votre fichier web.config et faire si vous avez encore des problèmes avec le codage chunked:

<system.webServer> 
    <asp enableChunkedEncoding="true" /> 
</system.webServer> 

L'erreur que vous avez signalé ci-dessus à propos de l'hôte la fermeture de la connexion se fait probablement parce que vous ouvrez la page en utilisant le navigateur et quand le navigateur lit le type de contenu, il ouvre le lecteur multimédia et se ferme avec la connexion ouverte qui était alors fermée, causant cette erreur, donc pour éviter cela, vous devez vérifier pe périodiquement si votre client est toujours connecté ou non. Enfin, je voudrais utiliser un gestionnaire générique (.ashx) ou un gestionnaire personnalisé et définir une extension .mp3 pour cela si vous utilisez une page ASPX pour éviter la surcharge inutile de la page Web.

J'espère que cela aide.

0

Une méthode pour prendre en charge cela implémenterait les requêtes de plage d'octets HTTP. Par défaut, je ne crois pas qu'ASP.NET le fasse, et ne le fera certainement pas si on utilise du code dans les questions ou la réponse.

Vous pouvez implémenter ceci manuellement avec un peu de travail cependant. Une autre option, qui serait beaucoup moins de travail de développement, serait de laisser IIS servir un fichier statique. Je suppose que ce n'est pas une option cependant.

Voici un exemple d'implémentation: http://www.codeproject.com/Articles/820146/HTTP-Partial-Content-In-ASP-NET-Web-API-Video