Я сделал службу Windows для кодирования файлов фильмов для создания файлов Adaptive Streaming на лету после загрузки. Недостатком для меня было то, что я хотел хранить файлы адаптивного потока внутри базы данных. Единственный способ добиться этого - создать собственный файловый API-интерфейс WIN32 или какую-то систему WebDav, которая может возвращать файловые потоки. Вы не можете создать свое собственное расширение SmoothStreamHandler для получения вашего файлового потока другими способами (например, из базы данных или чего-либо еще).
Остерегайтесь того, что он съедает все процессоры, которые у вас есть в вашей системе, поэтому не запускайте его на своем веб-сервере, а используйте для этого отдельный сервер. Кроме того, сервер не должен иметь много памяти, поскольку у него нет 64-битной версии, поэтому он не может использовать больше как 3,2 ГБ. Лучше всего просто мощность процессора и несколько быстрых дисков.
Существуют также аппаратные решения, которые поддерживают адаптивную потоковую передачу Silverlight, например Elemental Server .
Сам SDK довольно прост в использовании:
Пример:
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;
}
}