我正在构建一个涉及提供各种视频内容的 Web 应用程序。Web 友好的音频和视频编解码器的处理没有任何问题,但我在设计与 HTML5 视频播放器(如 mkv 容器或 H265)不兼容的视频文件的传输时遇到了麻烦。
到目前为止,我所做的是使用 ffmpeg 在服务器上对视频文件进行转码,制作 HLS 主控和 VOD 播放列表,并在前端使用 hls.js。然而,问题在于 ffmpeg 将播放列表视为直播流播放列表,直到整个文件的转码完成,然后将播放列表更改为 VOD。因此,在转码结束之前用户无法进行搜索,并且如果用户决定提前一半搜索视频文件,则我的服务器不必要地对整个文件进行转码。我正在使用以下 ffmpeg 命令行参数
ffmpeg -i sample.mkv \
-c:v libx264 \
-crf 18 \
-preset ultrafast \
-maxrate 4000k \
-bufsize 8000k \
-vf "scale=1280:-1,format=yuv420p" \
-c:a copy -start_number 0 \
-hls_time 10 \
-hls_list_size 0 \
-f hls \
file.m3u8
Run Code Online (Sandbox Code Playgroud)
现在为了改进这个系统,我尝试通过我的应用程序而不是 ffmpeg 生成 VOD 播放列表,因为格式是不言自明的。Web 应用程序将使用视频属性(例如持续时间、分辨率和比特率(服务器已知))预先生成 HLS 主播放列表和 VOD 播放列表,并将主播放列表提供给客户端。然后,客户端开始请求各个视频片段,此时服务器将单独转码并生成每个片段并为其提供服务。搜索是可能的,因为客户端已经拥有完整的 VOD 播放列表,并且它可以请求用户搜索的特定片段。在我看来,这样做的好处是,如果用户决定向前搜索并播放视频中途,我的服务器不必对整个文件进行转码。
现在我尝试sample.mkv使用以下命令手动创建段(每个段 10 秒)
ffmpeg -ss 90 \ …Run Code Online (Sandbox Code Playgroud)