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文件中

http://myserver.com/

每个分片的前面。

这个有什么用?如果我用nginx代理,根本不需要网络url前缀啊,这个是在什么场景下需要把网络url拼凑在前面?

-hls_base_url 参数在一些特殊的应用场景下会很有用。其主要作用是在生成的 .m3u8 文件中,为每个分片的 URI 添加

一个基础 URL 前缀。

假设你的流媒体服务器和你的内容分发网络(CDN)不在同一个地方,或者你需要将 HLS 分片放在不同的域名或服务

器上,这时候 -hls_base_url 就非常有用了。例如,你可以把所有的 .ts 文件上传到 CDN 或者云存储服务,然后在

.m3u8 播放列表文件中,使用完整的 URL(包含 前缀)来引用这些 .ts 文件。这样,客户端播放器

http://mycdn.com/

就可以直接从 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