Ffmpeg pkt_pos 与 hls 字节范围不同
Ffmpeg pkt_pos vs. hls byterange differs
我有一个 ts 文件并使用 ffmpeg 创建了一个 m3u8 文件。看起来像下面这样
#EXTM3U
#EXT-X-VERSION:4
#EXT-X-TARGETDURATION:1
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:0.000000,
#EXT-X-BYTERANGE:22184@0
video.ts
#EXTINF:1.000667,
#EXT-X-BYTERANGE:713836@22184
video.ts
#EXTINF:1.000667,
#EXT-X-BYTERANGE:549336@736020
video.ts
#EXTINF:1.000667,
#EXT-X-BYTERANGE:568324@1285356
video.ts
#EXTINF:1.000667,
#EXT-X-BYTERANGE:569264@1853680
video.ts
...
m3u8 文件完美运行,但在其创建过程中,ffmpeg 重新创建了 ts 文件。我想避免这种情况,并认为我可以简单地自己创建 m3u8 文件。我使用以下命令获取关键帧的字节偏移量。但是,none 的关键帧位置与 m3u8 文件中的偏移一致。
ffprobe -loglevel error -skip_frame nokey -select_streams v:0 -show_entries frame=pkt_pos -of compact video.m3u8
frame|pkt_pos=22560
frame|pkt_pos=736396
frame|pkt_pos=1285732
...
所有偏移量相差 376 字节。该数字是 mpeg-ts 包大小(即 188)的两倍。这两个位置都包含 ASCII 字符“G”,它是 MPEG-TS 的包头。
如何使用可用于创建 HLS 播放列表的 ffprobe 获得正确的偏移位置? ffmpeg是不是为了安全就减去2个包,重要吗?
ffmpeg re-creates the ts file (which is a byte-wise copy of the original)
不,这不是按字节复制。 ffmpeg 仍然会解析并重新打包文件。你需要一个精确的副本,用 curl 或 wget 下载。
偏移量指向的包是一个 PAT (Program Association Table),然后是一个 PMT(程序映射 Table)。每个数据包占用 188 个字节,总共 376 个字节。在这个元数据之后,真正的关键帧开始。
在简单的情况下,m3u8 偏移量可以直接指向关键帧并且文件将正确播放。但是,在一般情况下,解码器在传输流中间搜索时立即获得节目列表是有意义的。
我有一个 ts 文件并使用 ffmpeg 创建了一个 m3u8 文件。看起来像下面这样
#EXTM3U
#EXT-X-VERSION:4
#EXT-X-TARGETDURATION:1
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:0.000000,
#EXT-X-BYTERANGE:22184@0
video.ts
#EXTINF:1.000667,
#EXT-X-BYTERANGE:713836@22184
video.ts
#EXTINF:1.000667,
#EXT-X-BYTERANGE:549336@736020
video.ts
#EXTINF:1.000667,
#EXT-X-BYTERANGE:568324@1285356
video.ts
#EXTINF:1.000667,
#EXT-X-BYTERANGE:569264@1853680
video.ts
...
m3u8 文件完美运行,但在其创建过程中,ffmpeg 重新创建了 ts 文件。我想避免这种情况,并认为我可以简单地自己创建 m3u8 文件。我使用以下命令获取关键帧的字节偏移量。但是,none 的关键帧位置与 m3u8 文件中的偏移一致。
ffprobe -loglevel error -skip_frame nokey -select_streams v:0 -show_entries frame=pkt_pos -of compact video.m3u8
frame|pkt_pos=22560
frame|pkt_pos=736396
frame|pkt_pos=1285732
...
所有偏移量相差 376 字节。该数字是 mpeg-ts 包大小(即 188)的两倍。这两个位置都包含 ASCII 字符“G”,它是 MPEG-TS 的包头。
如何使用可用于创建 HLS 播放列表的 ffprobe 获得正确的偏移位置? ffmpeg是不是为了安全就减去2个包,重要吗?
ffmpeg re-creates the ts file (which is a byte-wise copy of the original)
不,这不是按字节复制。 ffmpeg 仍然会解析并重新打包文件。你需要一个精确的副本,用 curl 或 wget 下载。
偏移量指向的包是一个 PAT (Program Association Table),然后是一个 PMT(程序映射 Table)。每个数据包占用 188 个字节,总共 376 个字节。在这个元数据之后,真正的关键帧开始。
在简单的情况下,m3u8 偏移量可以直接指向关键帧并且文件将正确播放。但是,在一般情况下,解码器在传输流中间搜索时立即获得节目列表是有意义的。