【问题标题】:C# WCF Video Streaming from growing file?来自不断增长的文件的 C# WCF 视频流?
【发布时间】:2011-07-05 05:43:30
【问题描述】:

一直在努力完成本应快速而简单的任务。

我有一个自托管的 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 管理的速度更快地发送到客户端编码,所以基本上我只需要一个开放式流。

有接受者吗?

【问题讨论】:

    标签: c# wcf streaming ffmpeg


    【解决方案1】:

    一种解决方案是创建您的自定义 Stream 类,该类将环绕磁盘中的文件;但是,也存在并发问题,这意味着您需要一些锁定机制,以便写入过程(视频转码器)与您的 FileStream 正确共享文件。

    您的转码器是否可以创建多音量输出?如果是这样,那么您很幸运,这将(几乎)完全没有痛苦,只需进行卷 N 的流式传输,然后转码器写入卷 N + 1,您将不会遇到任何文件访问并发问题。

    编码愉快! - 阿德里安

    【讨论】:

      【解决方案2】:

      最简单的可能是使用操作系统内置的流媒体服务。见:http://technet.microsoft.com/en-us/windowsserver/dd448620

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

      【讨论】:

      • 在我开始走我现在的道路之前看过它,但据我了解它依赖于 Windows Server。这不适用于这种情况 - 它需要在客户 Windows 7 和 WHS 机器上运行。
      • 至于直接发送流 - 我确实尝试过,使用来自 FFMpeg 的管道输出,但似乎这无法输出我需要的 WMV/ASX。也看到不少cmets这会在一段时间后挂起FFMpeg,这意味着转码从未真正完成。感谢您的建议,非常感谢,但我仍然认为必须有一种方法可以流式传输打开的文件。直接从 FS 打开它可以正常工作,即它会继续读取过去的当前进度。
      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2011-12-20
        • 1970-01-01
        • 2023-03-06
        • 1970-01-01
        • 1970-01-01
        • 2016-12-07
        • 2013-09-27
        • 1970-01-01
        • 2011-02-27
        相关资源
        最近更新 更多