srs 所有转码参数介绍
srs版本v2
参考来自srs官方FFMPEG教程
首先是原官方文档:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
listen 1935;
vhost __defaultVhost__ {
# the streaming transcode configs.
transcode {
# whether the transcode enabled.
# if off, donot transcode.
# default: off.
enabled on;
# the ffmpeg
ffmpeg ./objs/ffmpeg/bin/ffmpeg;
# the transcode engine for matched stream.
# all matched stream will transcoded to the following stream.
# the transcode set name(ie. hd) is optional and not used.
engine example {
# whether the engine is enabled
# default: off.
enabled on;
# input format, can be:
# off, do not specifies the format, ffmpeg will guess it.
# flv, for flv or RTMP stream.
# other format, for example, mp4/aac whatever.
# default: flv
iformat flv;
# ffmpeg filters, follows the main input.
vfilter {
# the logo input file.
i ./doc/ffmpeg-logo.png;
# the ffmpeg complex filter.
# for filters, @see: http://ffmpeg.org/ffmpeg-filters.html
filter_complex 'overlay=10:10';
}
# video encoder name. can be:
# libx264: use h.264(libx264) video encoder.
# copy: donot encoder the video stream, copy it.
# vn: disable video output.
vcodec libx264;
# video bitrate, in kbps
# @remark 0 to use source video bitrate.
# default: 0
vbitrate 1500;
# video framerate.
# @remark 0 to use source video fps.
# default: 0
vfps 25;
# video width, must be even numbers.
# @remark 0 to use source video width.
# default: 0
vwidth 768;
# video height, must be even numbers.
# @remark 0 to use source video height.
# default: 0
vheight 320;
# the max threads for ffmpeg to used.
# default: 1
vthreads 12;
# x264 profile, @see x264 -help, can be:
# high,main,baseline
vprofile main;
# x264 preset, @see x264 -help, can be:
# ultrafast,superfast,veryfast,faster,fast
# medium,slow,slower,veryslow,placebo
vpreset medium;
# other x264 or ffmpeg video params
vparams {
# ffmpeg options, @see: http://ffmpeg.org/ffmpeg.html
t 100;
# 264 params, @see: http://ffmpeg.org/ffmpeg-codecs.html#libx264
coder 1;
b_strategy 2;
bf 3;
refs 10;
}
# audio encoder name. can be:
# libfdk_aac: use aac(libfdk_aac) audio encoder.
# copy: donot encoder the audio stream, copy it.
# an: disable audio output.
acodec libfdk_aac;
# audio bitrate, in kbps. [16, 72] for libfdk_aac.
# @remark 0 to use source audio bitrate.
# default: 0
abitrate 70;
# audio sample rate. for flv/rtmp, it must be:
# 44100,22050,11025,5512
# @remark 0 to use source audio sample rate.
# default: 0
asample_rate 44100;
# audio channel, 1 for mono, 2 for stereo.
# @remark 0 to use source audio channels.
# default: 0
achannels 2;
# other ffmpeg audio params
aparams {
# audio params, @see: http://ffmpeg.org/ffmpeg-codecs.html#Audio-Encoders
# @remark SRS supported aac profile for HLS is: aac_low, aac_he, aac_he_v2
profile:a aac_low;
bsf:a aac_adtstoasc;
}
# output format, can be:
# off, do not specifies the format, ffmpeg will guess it.
# flv, for flv or RTMP stream.
# other format, for example, mp4/aac whatever.
# default: flv
oformat flv;
# output stream. variables:
# [vhost] the input stream vhost.
# [port] the intput stream port.
# [app] the input stream app.
# [stream] the input stream name.
# [engine] the tanscode engine name.
output rtmp://127.0.0.1:[port]/[app]?vhost=[vhost]/[stream]_[engine];
}
}
}
1 | listen 1935; |
转码engine配置
一个 transcode 中可以配置多个 engine 来进行转码:
1
2
3
4
5
6
7
8
9
10
11
12
13
vhost www.test.com {
transcode {
engine 360p {
...
}
engine 480p {
...
}
engine 720p {
...
}
}
}
1 | vhost www.test.com { |
srs 中可使用的转码参数
整体参数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# 输入格式,其中flv表示输入格式为flv或者是RTMP。
iformat flv;
# ffmpeg 滤镜
vfilter {
}
# 视频相关参数
vcodec libx264;
vbitrate 1500;
vfps 25;
vwidth 768;
vheight 320;
vthreads 12;
vprofile main;
vpreset medium;
vparams {
t 100;
coder 1;
b_strategy 2;
bf 3;
refs 10;
}
# 音频相关参数
acodec libfdk_aac;
abitrate 70;
asample_rate 44100;
achannels 2;
aparams {
profile:a aac_low;
bsf:a aac_adtstoasc;
}
# 输出格式,其中flv表示输出格式为flv或者是RTMP。
oformat flv;
# 转码后的输出流
output rtmp://127.0.0.1:[port]/[app]?vhost=[vhost]/[stream]_[engine];
1 | # 输入格式,其中flv表示输入格式为flv或者是RTMP。 |
视频相关参数
vcodec:
视频编码器名称,通常使用 libx264。
vbitrate:
视频编码所使用的码率,单位kbps。这里所设置的应该是视频的平均码率。
vfps:
视频帧率。
vwidth:
视频宽度。
vheight:
视频高度。
vthreads:
使用多少个线程来进行转码。开启多个线程需要codec(编解码器)支持才行。
vprofile:
可以简单理解为H264的版本,可以选择high,main,baseline。 暂时知道:压缩率 high > main > baseline。 暂时不知道它与画质有没有直接关系。
vpreset:
用于调节编码速度和质量的平衡。 可以设置为:ultrafast,superfast,veryfast,faster,fast,medium,slow,slower,veryslow,placebo
vparams:
可以添加一些x264或者视频相关的参数。
- t:限制从输入文件读取的时长
- coder:x264使用,熵编码相关参数。
- b_strategy:x264使用,自适应的添加B帧数目,
Use only on first-pass
。 - bf:
max number of B frames
。 - refs:
Set reference frames to consider for motion compensation
。
实际上可以在这个参数中添加各种参数,而这些参数都会被添加在-preset后面。
视频滤镜 vfilter
i:
表示输入,例如加水印时,就需要额外的图片作为输入。
可以有多个输入,并且输入也可以是流的形式,意思是可以支持多路流合并成为一路流。
filter_complex:
也就是FFmpeg的filter_complex,一个filtergraph
,支持多个输入流。
使用它可以做各种事情,后面使用举例说明。
详细使用方法可以参考官方文档:4.1 Filtergraph syntax
音频相关参数
acodec:
音频编码器,通常使用 libfdk_aac 。
abitrate:
音频码率,单位kbps,[16, 72] for libfdk_aac
。
asample_rate:
音频采样率,对于 flv和rtmp,只能设置为 44100,22050,11025,5512。
achannels:
声道,1表示单声道,2表示双声道。
aparams:
可以在里面填一些与音频相关的转码参数,同样的,这些参数会接在achannels
(-ac
)的后面。
- profile:a 与h264编码中的profile类似,这里支持 aac_low, aac_he, aac_he_v2 这几种参数的设置。
- bsf:a 表示
Bitstream Filters
,详细参考18 Bitstream Filters。
转码配置举例
改变视频分辨率
方法一:
使用vwidth
和vheight
参数。
1 | vhost www.transcode.com { |
上面转码将视频转码成1080P+60fps
和720P+60fps
。
方法二:
使用filter_complex
,在其中使用scale滤镜来缩减分辨率,并将vwidth
和vheight
设置为0。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
vhost www.transcode.com {
transcode {
enabled on;
ffmpeg ./objs/ffmpeg/bin/ffmpeg;
engine 720_60 {
enabled on;
vfilter {
filter_complex 'scale=1280:-1';
}
vcodec libx264;
vbitrate 3500;
vfps 60;
vwidth 0;
vheight 0;
vthreads 12;
vprofile main;
vpreset fast;
vparams {
}
acodec libfdk_aac;
abitrate 50;
asample_rate 44100;
achannels 2;
aparams {
}
output rtmp://192.168.90.229:2019/persist?vhost=lrm.test.com/long_720_60;
}
}
}
1 | vhost www.transcode.com { |
结论:推荐使用方法二。
如果输入视频不是16:9分辨率时,使用方法一转码视频造成画面拉伸,因为它的vwidth
和vheight
参数反映到FFmpeg中是-s vwidth x vheight
,
使用-1时则会报错。而使用方法二则可以使用-1来维持原画面比例。
添加水印
官方例子:
1 | vhost __defaultVhost__ { |
实现方法,使用vfilter
,输入图片并使用滤镜overlay
来完成。
CBR恒定编码实现
先来看一下使用bitrate
来控制码率的情况:
1 | vhost lrm.test.com { |
这里将vbitrate
设置在3500,也就是我们希望码率可以控制在3500kbps,使用VLC播放器可以看到大概的统计效果:
参数中虽然可以使用bitrate
来指定码率,但是实际上这只是平均码率,但是实际码率还是会上下波动,并且范围也不小。
可以使用下面方法来实现CBR,也是FFmpeg文档中所述的:
1 | vhost lrm.test.com { |
可以看到上面配置中,增加设置maxrate
,minrate
,bufsize
来配合控制视频的码率。
实际效果并不能固定码率,码率仍然在上下波动,但很明显能达到更小的波动范围。