首页 > 解决方案 > 使用命名管道/流转换和输出到流不包含流持续时间

问题描述

我与一个 API 集成,该 API 向我们发送带有 H.264 编解码器的 FLV。我使用 FFMpeg(FFMpegCore,一个与 FFMpeg 交互的 C# 库)将容器转换为分段的 MP4 容器。然后将结果流式传输到 resp.OutputStream,并下载文件。

但是,结果不包含流持续时间,并且 Windows Media Player 无法导航该文件。

流通过以下代码处理:

FFMpegArguments
.FromPipe(new StreamPipeSource(inputStream))
.WithVideoCodec("copy")
.ForceFormat("mp4")
.WithArgument(new FragArgument())
.OutputToPipe(new StreamPipeSink(resp.OutputStream))
.ProcessSynchronously(false);

大致相当于以下命令:

type "Input.flv" | ffmpeg -i - -vcodec copy -f mp4 -movflags frag_keyframe+empty_moov pipe:1 > Output.mp4

(FragArgument 是我自己创建的,只是添加-movflags frag_keyframe+empty_moov到命令中)

输出流的持续时间为 0。 VLC 等媒体播放器似乎能够计算持续时间,但客户端无法使用 VLC 媒体播放器,而必须使用能够播放文件但没有正确记录持续时间。

根据这个堆栈溢出答案,我对处理视频流很陌生,但缺乏持续时间似乎是复用器所做的事情

我想如果我将非分段 mp4 输出到本地文件,然后将其流式传输到服务器,我可以获得流持续时间。但是,额外的步骤会增加下载时间,并且我不得不担心之后删除文件,我试图避免这样做。

如何在不先保存到文件的情况下让我的流包含正确的持续时间?

标签: c#videoffmpegnamedpipeserverstream

解决方案


推荐阅读