ffmpeg转HLS参数介绍
-hls_time
此选项设置每个HLS分片的最大持续时间(以秒为单位)。默认值为2秒。例如,-hls_time 10 将使每个分片的持续时间
为10秒。
-hls_list_size
设置播放列表中字段最大数。如果为0,则包含所有分段。默认为5
-hls_wrap
此选项确定当分段索引达到hls_list_size所设置的大小时,是否开始覆盖旧的分段文件。例如,-hls_wrap 10 将在生成
10个分段后开始覆盖最早的分段。
-hls_flags
此选项允许用户设置各种HLS标志。例如:
delete_segments:删除过时的分段。
append_list:在现有列表而不是新列表中添加新分段。
split_by_time 不根据gop间隔进行切片,强制使用hls_time时间进行切割ts分片
hls_delete_threshold
ts切片自动删除阈值,默认值为1,表示早于hls_list_size+1的切片将被删除
高级参数
一些高级的FFmpeg参数可以更精细地控制HLS流的转换:
-start_number
此选项用于设置播放列表中首个媒体分段的序列号。例如,-start_number 100 将使首个分段的序列号为100。
-start_number是ffmpeg在转换视频到HLS格式时使用的一个参数。这个参数主要用来指定生成的HLS切片的起始索引
号。
例如,如果你设定 -start_number 0,那么生成的第一段切片文件名可能会是fileSequence0.ts,然后是
fileSequence1.ts,以此类推。
如果你设定 -start_number 100,那么生成的第一段切片文件名可能会是fileSequence100.ts,然后是
fileSequence101.ts,以此类推。
这个参数对于某些特定场景非常有用,比如你希望继续一个已经存在的HLS流,并且不希望覆盖已经存在的切片。
-hls_allow_cache
此选项指定是否允许客户端缓存媒体分段0=不可以 1=可以。例如,-hls_allow_cache 0 将禁止客户端缓存分段。(但
事实上似乎无法禁用,用户想缓存时仍然可以缓存)
-hls_key_info_file
如果你需要对HLS进行加密,这个参数可以指定一个包含秘钥信息的文件。例如,-hls_key_info_file key_info.txt 将使用
该文本文件中的秘钥信息对HLS流进行加密。
使用key_info_file对段进行加密。key_info_file 中的第一行指定一个URI,是写入播放列表的,这个key URL被用于存放
播放期访问的加密密钥。第二行指定用于加密过程中的key文件路径。key文件作为一个单一排列的16进制数组以二进制
格式数据读入。可选的第三行则指定初始化向量(IV,一个十六进制字符串用于代替部分序列(默认)进行加密)。改
变key_info_file将导致段加密采用新的key/IV 以及播放列表中任意条目采用新的 URI/IV
1
完整key_info_file 示例:
2 http://server/file.key
3 /path/to/file.key
4 0123456789ABCDEF0123456789ABCDEF
-hls_base_url
此选项可以为所有分段URL添加一个前缀。例如,-hls_base_url 将会把这个URL加到m3u8文件中
每个分片的前面。
这个有什么用?如果我用nginx代理,根本不需要网络url前缀啊,这个是在什么场景下需要把网络url拼凑在前面?
-hls_base_url 参数在一些特殊的应用场景下会很有用。其主要作用是在生成的 .m3u8 文件中,为每个分片的 URI 添加
一个基础 URL 前缀。
假设你的流媒体服务器和你的内容分发网络(CDN)不在同一个地方,或者你需要将 HLS 分片放在不同的域名或服务
器上,这时候 -hls_base_url 就非常有用了。例如,你可以把所有的 .ts 文件上传到 CDN 或者云存储服务,然后在
.m3u8 播放列表文件中,使用完整的 URL(包含 前缀)来引用这些 .ts 文件。这样,客户端播放器
就可以直接从 CDN 或云服务上获取分片,而不是从你的原始流媒体服务器获取。
另外,如果你的应用需要跨域访问 HLS 流,那么 -hls_base_url 参数也会非常有用。因为在同源策略下,Web
页面只能获取和其自身同源的资源,如果需要获取其他源的资源,就需要使用完整的 URL。
所以,即使你使用 nginx 代理,有些情况下也可能需要使用 -hls_base_url 参数。
-hls_playlist_type
此选项设置播放列表类型。例如,-hls_playlist_type vod 将生成点播(VOD)样式的播放列表。另一个选项是 event,
它将生成一个"live"样式的播放列表,但如果新的分片被添加,旧的不会被删除。
-hls_segment_filename
此选项允许用户指定分段文件的命名模式。例如,-hls_segment_filename ‘segment%d.ts’ 将使用给定的模式为分段文
件命名。
-hls_flags single_file
此选项使得所有媒体数据都被写入一个单独的分段文件,同时生成一个与之配套的索引文件。这可以避免产生大量的小
文件。
-hls_flags independent_segments
此选项强制每个分段文件都从新的关键帧开始,这样可以确保每个分段文件都可以独立解码。
-hls_flags discont_start
此选项使播放列表以EXT-X-DISCONTINUITY标签开始,这在有广告插入等情况下可能很有用。
hls_ts_options options_list
设置输出格式选项,使用’-‘分割的key=value参数对,如果包括特殊字符需要被转义处理
使用FFmpeg创建主播放列表(m3u8)
hls_playlist_type=vod: 通过设置该值,FFmpeg创建了一个点播播放列表,将#EXT-X-PLAYLIST-TYPE:VOD插入到
m3u8头部中,并强制hls_list_size为0。
hls_time seconds:我们需要使用它设置目标切片长度(以秒为单位)。
默认值为2秒,当2秒过去,切片将在下一个关键帧处被切片。
之所以要求确保每个比特流变体在每N秒结束的时候都有一个关键帧(这点非常重要),因为ABR要求切片时候的关键
帧要对齐,这样才能无缝切换。
hls_segment_type:这里有两个值:mpegts或fmp4,用于指定创建TS片段或fmp4(CMAF)片段,这对创建HLS和
DASH的单一数据流很有用。
hls_flags independent_segments:当确保播放列表中所有切片都以一个关键帧开始时,将#EXT-X-INDEPENDENT-
SEGMENTS添加到播放列表中。
hls_segment_filename filename: 设置段文件名。除非hls_flags single_file被设置,设置这个文件名可以用于段命名
格式化(依据段序数):
使用FFmpeg进行HLS直播打包
1.删除-hls_playlist_type vod
2.添加-hls_list_size ,并将其设置为一个数字,该数字表示各个变体播放列表中的切片数(你希望设置的数字)。
FFmepg中其他有用的HLS打包选项
hls_base_url baseurl : 可用于将baseurl表示的值追加到播放列表的每个条目。
hls_fmp4_init_filename filename : 设置文件名为分片文件头文件,默认文件名为init.mp4。当你把片段类型设置为
fmp4而非mpegts时,就会用到这个文件。
hls_fmp4_init_resend:在m3u8文件每次刷新时,重新发送init文件,默认为0。
审校者注:当__var_stream_map__设置为两个或多个变体流时,文件名模式必须包含字符串"%v",这个字符串指定变
体流索引在生成的init文件名中的位置。这时候可以结合上面的 hls_fmp4_init_resend 重新发送init文件。
iframes_only : 将#EXT-X-I-FRAMES-ONLY添加到包含视频切片并只能在 #EXT-X-BYTERANGE 模式下播放I帧的
播放列表中。
设置零延迟
# recorder.setVideoOption("tune", "zerolatency");
recorder.setVideoOption("tune", "fastdecode");
// 快速
recorder.setVideoOption(“preset”, “ultrafast”);
// recorder.setVideoOption(“crf”, “26”);
recorder.setVideoOption(“threads”, “12”);
recorder.setVideoOption(“vsync”, “2”);
//recorder.setGopSize(25);// 设置gop,与帧率相同,相当于间隔1秒chan's一个关键帧
//recorder.setVideoBitrate(100 * 1000);// 码率500kb/s