将我的头发拉出来应该是一项快速而简单的任务。
我有一个自托管的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管理到的更快地发送到客户端编码,所以基本上我只需要一个开放的流。
任何参赛者?
答案 0 :(得分:0)
最简单的方法是使用内置于操作系统中的Streaming Media服务。请参阅:http://technet.microsoft.com/en-us/windowsserver/dd448620
另一种方法是不读取文件,而是将写入文件的流直接发送给客户端。
答案 1 :(得分:0)
显而易见的是,这不能通过文件系统完成。你需要一个动态的解决方案。
您可以通过自己制作的媒体服务来完成。在您的情况下,它可能是WCF或Windows服务。
此服务应负责写入文件(作为数据接收)和流式传输。
答案 2 :(得分:0)
一种解决方案是创建自定义Stream类,它将从磁盘中包装文件;但是,还存在并发问题,这意味着您需要一些锁定机制来完成写入过程(视频转码器)以正确地与FileStream共享文件。
您的转码器是否可以创建多卷输出?如果是这样,那么你的幸运,这将(几乎)没有任何痛苦,只是做流量N,然后代码转换器写入卷N + 1,你将没有任何文件访问并发问题。
快乐的编码! - 阿德里安