C#WCF Video Streaming来自不断增长的文件?

时间:2011-01-25 13:17:20

标签: c# wcf streaming ffmpeg

将我的头发拉出来应该是一项快速而简单的任务。

我有一个自托管的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);
}

我面临的问题是,返回的Stream只会在返回时向我提供写入文件的内容 - 从而产生相当短的视频文件:)

我已经玩过这里显而易见的了,但无论我做什么,它都只会返回那里可用的东西。

我需要做的是返回Stream而不考虑输出文件的实际当前长度 - 还涉及其他代码,以确保数据永远不会比FFMpeg管理到的更快地发送到客户端编码,所以基本上我只需要一个开放的流。

任何参赛者?

3 个答案:

答案 0 :(得分:0)

最简单的方法是使用内置于操作系统中的Streaming Media服务。请参阅:http://technet.microsoft.com/en-us/windowsserver/dd448620

另一种方法是不读取文件,而是将写入文件的流直接发送给客户端。

答案 1 :(得分:0)

显而易见的是,这不能通过文件系统完成。你需要一个动态的解决方案。

您可以通过自己制作的媒体服务来完成。在您的情况下,它可能是WCF或Windows服务。

此服务应负责写入文件(作为数据接收)和流式传输。

答案 2 :(得分:0)

一种解决方案是创建自定义Stream类,它将从磁盘中包装文件;但是,还存在并发问题,这意味着您需要一些锁定机制来完成写入过程(视频转码器)以正确地与FileStream共享文件。

您的转码器是否可以创建多卷输出?如果是这样,那么你的幸运,这将(几乎)没有任何痛苦,只是做流量N,然后代码转换器写入卷N + 1,你将没有任何文件访问并发问题。

快乐的编码! - 阿德里安