小编syf*_*uqs的帖子

使用 ffmpeg 进行动态转码和 HLS 流传输

我正在构建一个涉及提供各种视频内容的 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)

video ffmpeg http-live-streaming

11
推荐指数
1
解决办法
8930
查看次数

标签 统计

ffmpeg ×1

http-live-streaming ×1

video ×1