2010-08-30 11 views

Répondre

0

J'ai créé un service Windows pour encoder des fichiers vidéo afin de créer des fichiers Adaptive Streaming à la volée une fois téléchargés. L'inconvénient pour moi était que je voulais stocker les fichiers de flux adaptatifs dans une base de données. La seule option pour y parvenir était de créer votre propre API de fichier WIN32 ou une sorte de système WebDav qui peut renvoyer les flux de fichiers. Vous ne pouvez pas créer votre propre extension de SmoothStreamHandler pour obtenir votre flux de fichiers d'autres façons (comme de la base de données ou autre). Prenez garde à ce qu'il consomme tous les processeurs que vous avez dans votre système, alors ne l'exécutez pas sur votre serveur web mais ayez un serveur séparé pour cela. De plus, le serveur n'a pas besoin de beaucoup de mémoire car il ne dispose pas d'une version 64 bits, donc il ne peut pas utiliser plus de 3,2 Go. Juste la puissance du processeur et quelques disques rapides seraient les meilleurs.

Il existe également des solutions matérielles prenant en charge Silverlight Adaptive Streaming, telles que Elemental Server.

Le SDK lui-même est assez facile à utiliser:

Exemple:

private void ProcessFile(string filename, string outputFolder) 
{ 
    try 
    { 
     MediaItem mediaItem; 

     AdvancedVC1VideoProfile videoProfile = new AdvancedVC1VideoProfile(); 
     videoProfile.SmoothStreaming = true; 
     videoProfile.AdaptiveGop = false; 
     videoProfile.Streams.RemoveAt(0); 

     try 
     { 
      mediaItem = new MediaItem(filename); 

      // Add streams 
      videoProfile.Streams.Add(new ConstantBitrate(1450), new Size(848, 480)); 
      videoProfile.Streams.Add(new ConstantBitrate(1050), new Size(592, 336)); 
      videoProfile.Streams.Add(new ConstantBitrate(600), new Size(424, 240)); 

      mediaItem.OutputFormat.VideoProfile = videoProfile; 
     } 
     catch (InvalidMediaFileException ex) 
     { 
      Console.WriteLine(ex.Message); 
      return; 
     } 

     using (Job job = new Job()) 
     { 
      job.MediaItems.Add(mediaItem); 
      job.OutputDirectory = outputFolder; 
      job.CreateSubfolder = false; 

      job.EncodeProgress += (object sender, EncodeProgressEventArgs e) => 
      { 
       // Trace progress.. 
      }; 

      job.Encode(); 

     } 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine(ex.Message); 
     return; 
    } 
}