将 html <video> 中的字节范围转换为时间范围

fen*_*aun 5 html javascript ffmpeg

我有一些服务器端代码当前支持 http 字节范围请求,没有任何问题。但是,我希望能够在将转码块发送到客户端之前使用 ffmpeg 即时转码视频文件(位于磁盘上),但 ffmpeg 要求我在获取字节时给它一个寻道时间范围来自客户。给定客户端浏览器的字节范围,我如何能够计算出视频文件的时间范围(寻道时间)?

我已经看过这个问题,它假设服务器已经知道指定的时间。

我愿意使用 html5 视频播放器,它支持使用时间范围而不是字节范围来请求数据,但我一直无法找到实现或弄清楚缓冲的 javascript 端如何<video>工作。

Gya*_*yan 8

您可以运行 ffprobe 并分析其输出来识别时间戳。

基本命令是

ffprobe -i in.mp4 -show_entries packet=pos,pts_time,flags -select_streams v -of compact=p=0:nk=1 -v 0
Run Code Online (Sandbox Code Playgroud)

这会产生

0.000000|48|K_
0.133333|956|__
0.066667|996|__
0.033333|1053|__
0.100000|1602|__
0.266667|1811|__
0.200000|2371|__
0.166667|2746|__
0.233333|3294|__
....
Run Code Online (Sandbox Code Playgroud)

第一列是视频帧时间戳,第二列是该帧的字节偏移量,第三列是该帧是否是关键帧。

由于您只能在关键帧处剪切视频,因此在复制流时,您必须在标志为 的时间戳处剪切K,或者使用以下命令中的参数:

ffmpeg -ss X -i in.mp4 -c copy -avoid_negative_ts make_zero out.mp4
Run Code Online (Sandbox Code Playgroud)

如果您要对视频流进行转码,则不需要此操作。