c# - 使用命名管道/流转换和输出到流不包含流持续时间
问题描述
我与一个 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 输出到本地文件,然后将其流式传输到服务器,我可以获得流持续时间。但是,额外的步骤会增加下载时间,并且我不得不担心之后删除文件,我试图避免这样做。
如何在不先保存到文件的情况下让我的流包含正确的持续时间?
解决方案
推荐阅读
- javascript - 如何使用 useState 挂钩更新状态
- reactjs - React MUI 数据表日期范围过滤器
- python - 从 sklearn.model_selection 导入 train_test_split 时,为什么会出现错误“AttributeError:模块 'attr' 没有属性 's'”?
- angular - 如何动态创建多个行为主体并订阅?
- python - 如何从 txt 文件中的字符串填写表格 - python mechanize
- java - 如果字符串包含列表中的任何项目,JAVA 返回最长值
- javascript - 将带有文本的元素添加到 DOM 树时遇到问题
- jquery - 将 jquery 中的字符串传递给 asp.net mvc ActionResult
- r - 在不使用应用和子集函数的情况下选择具有特定条件的子数据集
- python - 如何在 Pyqt5 中创建动态按钮