2009-12-23 5 views
0

J'essaie de diffuser de la vidéo sur http à l'iphone sans un serveur streming avec .net. Après quelques tests, j'ai trouvé que si vous venez de télécharger une vidéo compatible iphone sur votre serveur, iis7 fonctionne très bien et iphone commence à lire de la vidéo après un petit temps tampon et continue à télécharger en arrière-plan.C# streaming sur http pour iphone

Mon problème est, je suis incapable de le faire avec .net. J'ai essayé avec

public static void SmallFile(string filename, string filepath, string contentType) 
{ 
    try 
    { 
     FileStream MyFileStream = new FileStream(filepath, FileMode.Open, FileAccess.Read, FileShare.Read); 
     long FileSize; 
     FileSize = MyFileStream.Length; 
     byte[] Buffer = new byte[(int)FileSize]; 
     MyFileStream.Read(Buffer, 0, (int)MyFileStream.Length); 
     MyFileStream.Close(); 
     HttpContext.Current.Response.ContentType = contentType; 
     HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(filename, System.Text.Encoding.UTF8)); 
     HttpContext.Current.Response.BinaryWrite(Buffer); 

    } 
    catch 
    { 
     HttpContext.Current.Response.ContentType = "text/html"; 
     HttpContext.Current.Response.Write("Downloading Error! " + filename + " not found!"); 
    } 
    HttpContext.Current.Response.End(); 
} 

ou

public static void ResumableFile(string filename, string fullpath, string contentType) 
{ 
    try 
    { 
     FileStream myFile = new FileStream(fullpath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); 
     BinaryReader br = new BinaryReader(myFile); 
     try 
     { 
      HttpContext.Current.Response.AddHeader("Accept-Ranges", "bytes"); 
      HttpContext.Current.Response.Buffer = false; 
      long fileLength = myFile.Length; 
      long startBytes = 0; 

      //int pack = 10240; //10K bytes 
      int pack = 1048576; //1024K bytes 
      if (HttpContext.Current.Request.Headers["Range"] != null) 
      { 
       HttpContext.Current.Response.StatusCode = 206; 
       string[] range = HttpContext.Current.Request.Headers["Range"].Split(new char[] { '=', '-' }); 
       startBytes = Convert.ToInt64(range[1]); 
      } 
      HttpContext.Current.Response.AddHeader("Content-Length", (fileLength - startBytes).ToString()); 
      if (startBytes != 0) 
      { 
       HttpContext.Current.Response.AddHeader("Content-Range", string.Format(" bytes {0}-{1}/{2}", startBytes, fileLength - 1, fileLength)); 
      } 
      HttpContext.Current.Response.AddHeader("Connection", "Keep-Alive"); 
      HttpContext.Current.Response.ContentType = contentType; 
      HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(filename, System.Text.Encoding.UTF8)); 

      br.BaseStream.Seek(startBytes, SeekOrigin.Begin); 
      int maxCount = (int)Math.Floor((double)((fileLength - startBytes)/pack)) + 1; 

      for (int i = 0; i < maxCount; i++) 
      { 
       if (HttpContext.Current.Response.IsClientConnected) 
       { 
        HttpContext.Current.Response.BinaryWrite(br.ReadBytes(pack)); 
        } 
       else 
       { 
        i = maxCount; 
       } 
      } 
     } 
     catch 
     { 
      HttpContext.Current.Response.ContentType = "text/html"; 
      HttpContext.Current.Response.Write("Downloading Error! " + filename + " not found!"); 
     } 
     finally 
     { 
      br.Close(); 
      myFile.Close(); 
     } 
    } 
    catch 
    { 
     HttpContext.Current.Response.ContentType = "text/html"; 
     HttpContext.Current.Response.Write("Downloading Error!" + filename + " not found!"); 
    } 
} 

Dans les deux cas, je reçois erreur indiquant que le serveur est pas correctement configuré. J'ai alors retiré

HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(filename, System.Text.Encoding.UTF8)); 

partie de sorte qu'il ne déclenchera pas le téléchargement complet mais le résultat était le même.

J'ai vérifié les réponses du serveur et il n'y a pas d'en-tête différent/supplémentaire provenant du serveur lorsque je télécharge directement le fichier.

Ce que je suis en train de findout ce qui activerons iphone pour tamponner et commencer à jouer vidéo quand je télécharger directement le fichier vidéo et comment puis-je implemnet avec .net

Si youwonder pourquoi je ne pas utiliser iis , je dois mettre une sorte de protection contre les sangsues en raison des restrictions de bande passante

Quelqu'un a-t-il une expérience?

MISE À JOUR

Voici la première demande et réponse de iis

GET /test.mp4 HTTP/1.1 
Host: 192.168.2.200 
User-Agent: Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_1_2 like Mac OS X; tr-tr) AppleWebKit/528.18 (KHTML, like Gecko) Version/4.0 Mobile/7D11 Safari/528.16 
Cache-Control: max-age=0 
Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5 
Accept-Language: tr-tr 
Accept-Encoding: gzip, deflate 
Connection: keep-alive 


HTTP/1.1 200 OK 
Content-Type: video/mp4 
Last-Modified: Wed, 23 Dec 2009 20:12:57 GMT 
Accept-Ranges: bytes 
ETag: "e6ad9151c84ca1:0" 
Server: Microsoft-IIS/7.5 
X-Powered-By: ASP.NET 
Date: Wed, 23 Dec 2009 21:07:19 GMT 
Content-Length: 2301438 

Et la deuxième demande et la réponse

GET /test.mp4 HTTP/1.1 
Host: 192.168.2.200 
Range: bytes=0-2269183 
Connection: close 
User-Agent: Apple iPhone OS v3.1.2 CoreMedia v1.0.0.7D11 
Accept: */* 
Accept-Encoding: identity 



HTTP/1.1 206 Partial Content 
Content-Type: video/mp4 
Last-Modified: Wed, 23 Dec 2009 20:12:57 GMT 
Accept-Ranges: bytes 
ETag: "e6ad9151c84ca1:0" 
Server: Microsoft-IIS/7.5 
X-Powered-By: ASP.NET 
Date: Wed, 23 Dec 2009 21:11:33 GMT 
Connection: close 
Content-Length: 2269184 
Content-Range: bytes 0-2269183/2301438 

Comme je comprends les demandes iphone différents octets sur seconde demande et ainsi de suite. De toute façon, C# envoie-t-il ces octets au client?

+0

@nLL Pouvez-vous afficher plus d'informations à partir du serveur lorsque dit qu'il n'est pas correctement configuré lorsque l'en-tête Content-Disposition est défini? – casperOne

+0

erreur est de l'iphone. et cela arrive quel que soit le contenu-disposition réglé ou non – nLL

+0

http://developer.apple.com/iphone/library/documentation/NetworkingInternet/Conceptual/StreamingMediaGuide/Introduction/Introduction.html – SLaks

Répondre

1

J'effectuerais une sorte de reniflage de message. Fondamentalement, je mettrais en place quelque chose que vous pouvez diffuser de la vidéo sur iPhone (comme TVersity) et ensuite configurer quelque chose pour intercepter le trafic entre TVersity et l'iPhone afin que vous puissiez inspecter la requête et la réponse HTTP.

Voici un blog sur la façon de mettre en place TVersity:

http://geeks.pirillo.com/profiles/blogs/2300301:BlogPost:38497

L'URL relative "/ iPhone" est celui que vous voulez renifler le trafic sur. Il devrait faire la lumière sur le modèle d'échange de messages approprié pour télécharger la vidéo sur l'iPhone.

+0

s'il vous plaît voir ma mise à jour – nLL

Questions connexes