C # WCF Потоковое видео из растущего файла? - PullRequest
0 голосов
/ 25 января 2011

Я потянулся за то, что должно было быть быстрой и легкой задачей.

У меня есть сервис WCF, в котором мне нужно реализовать транскодирование видео в реальном времени, транскодирование непроблема как таковая, с использованием FFMpeg для локального временного файла.

Быстрый пример того, как выглядит мой код;

public Stream StreamMedia(int a)
{
    String input = @"\media\" + a + ".mkv";
    String output = @"\temp\transcoded\" + a + DateTime.Now.Ticks.ToString() + ".wmv";

    ProcessStartInfo pi = new ProcessStartInfo("ffmpeg.exe");
    pi.Arguments = "-i " + input + " -y -ab 64k -vcodec wmv2 -b 800k -mbd 2 -cmp 2 -subcmp 2 -s 320x180 -f asf " + output;
    Process p = new Process;
    p.StartInfo = pi;
    p.Start();

    Thread.Sleep(2500);

    return new FileStream(output, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
}

Проблема, с которой я сталкиваюсь, заключается в том, что возвращенный поток дает мне толькочто было записано в файл при его возврате - в результате получился довольно короткий видеофайл:)

Я поиграл с очевидным здесь, но независимо от того, что я делаю, он вернет только то, что доступно там, изатем.

Мне нужно, чтобы поток возвращался независимо от фактической текущей длины выходного файла - здесь задействован другой код, который гарантирует, что данные никогда не отправляются клиенту быстреечем то, что FFMpeg удается закодировать, так что в основном мне просто нужен открытый поток.

Любые получатели?

Ответы [ 3 ]

0 голосов
/ 22 февраля 2011

Что очевидно, это нельзя сделать через файловую систему.Вам нужно динамическое решение.

Вы можете сделать это через свой собственный медиа сервис.В вашем случае это может быть служба WCF или windows.

Эта служба должна отвечать как за запись в файл (при получении данных), так и за потоковую передачу.

0 голосов
/ 05 июля 2011

Одним из решений было бы создание собственного пользовательского класса Stream, который обернул бы файл с диска; НО, есть также проблема параллелизма, означающая, что вам нужен какой-то механизм блокировки для процесса записи (видео транскодер), чтобы правильно делиться файлом с FileStream.

Возможно ли для вашего транскодера создание многотомного выхода? Если это так, то вам повезет, и это будет работать (почти) безболезненно, просто выполните потоковую передачу тома N, тогда транскодер запишет том N + 1, и у вас не возникнет проблем с параллелизмом при доступе к файлам.

счастливого кодирования! - Адриан

0 голосов
/ 25 января 2011

Самым простым может быть использование службы потокового мультимедиа, встроенной в операционную систему. Смотри: http://technet.microsoft.com/en-us/windowsserver/dd448620

Другим способом сделать это будет не чтение из файла, а отправка потока, записывающего в файл, прямо клиенту.

...