我一直在尝试实现一个类似 Plex 的视频播放器,可以按需转码任意视频文件,并在网页上使用 MPEG-Dash 播放它。我能够使用dash.js参考实现来实现客户端播放器,因此它将动态地从服务器请求片段(SegmentTemplate在 mpd 文件中使用)。
但我在实时生成这些块时遇到一些问题。Ffmpeg 允许我设置-ss和-t定义所需片段的边界,但它们无法在播放器中正常播放,因为它们是“完整”视频文件而不是 Dash 片段。
那么,如何调整 ffmpeg 命令以将我需要的部分转码为 Dash 片段,而无需提前生成整个视频文件的片段?
输入视频文件可以是任何格式,因此不能假设它采用 mp4/dash 兼容的编解码器。因此需要转码(使用ffmpeg或类似工具)。
我当前的 ffmpeg 命令如下所示(经过多次尝试):
ffmpeg -ss 10 -t 5 -i video.mkv -f mp4 -c:a aac -c:v h264 -copyts -movflags empty_moov+frag_keyframe temp/segment.mp4
Run Code Online (Sandbox Code Playgroud)
客户端播放器应该能够缓冲接下来的 X 段,并且用户应该能够查看持续时间栏上的当前位置并寻找不同的位置。因此,将其视为直播并不是一个选择。
我有一个具有两种泛型类型的函数,In并且Out:
function createTask<
In extends Record<string, any> = {},
Out extends Record<string, any>,
>(task : TaskFunction<In, Out>) : Task<In, Out>
type TaskFunction<In, Out> = (args : TaskWrapper<In>) => Out | Promise<Out>;
// TaskWrapper wraps several other types and interfaces, so args is more than just `In`
Run Code Online (Sandbox Code Playgroud)
此代码当前无法编译,因为Out在可选类型 ( ) 之后不能有必需的泛型类型( In)。
我如何告诉 Typescript 编译器我想让这个函数的用户做三件事之一:
不要指定任何泛型:createTask(...). 的类型In应该默认为{},并且Out应该从 的返回值中推断出来TaskFunction。
仅指定In:createTask<A>(...)。如上,Out …