4K (рдЕрд▓реНрдЯреНрд░рд╛ рдПрдЪрдбреА) рдЬреИрд╕реЗ рднрд╛рд░реА рд╡реАрдбрд┐рдпреЛ рдкреНрд░рд╛рд░реВрдкреЛрдВ рдХреЗ рдЖрдЧрдорди рдХреЗ рд╕рд╛рде, рд╡реАрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рдбрд┐рдХреЛрдбрд┐рдВрдЧ рджрдХреНрд╖рддрд╛ рдХреА рд╕рдорд╕реНрдпрд╛ рдХрд╛рдлреА рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реЛ рдЧрдИ рд╣реИред рдПрдХ рдФрд╕рдд рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреА рд╡реАрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рдЙрдкрд╛рдп рдХрд┐рдП рдЬрд╛рдиреЗ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдЦ рдПрдлрдПрдлрдПрдордИрдЬреА-рдЖрдзрд╛рд░рд┐рдд рд╕рдорд╛рдзрд╛рдиреЛрдВ рдореЗрдВ рд╡реАрдбрд┐рдпреЛ рдзрд╛рд░рд╛рдУрдВ рдХреА рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдЧрддрд┐ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рддрд░реАрдХреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдЪ 264 рдФрд░ рдПрдЪрдИрд╡реАрд╕реА (рдПрдЪ 265) рдореЗрдВ рдПрдиреНрдХреЛрдб рдХрд┐рдП рдЧрдП 4K рд╡реАрдбрд┐рдпреЛ рдзрд╛рд░рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдЧрддрд┐ рдХреЛ рдорд╛рдкрдиреЗ рдХреЗ рдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИред
рд╡рд┐рд╖рдп - рд╕реВрдЪреА
1. рд╡реАрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо
1.1 рдХреА рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдЧрддрд┐ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рддреАрди рддрд░реАрдХреЗ ред рдорд╛рдирдХ рдбрд┐рдХреЛрдбрд░
1.2 рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдп рдзрд╛рд░рд╛рдУрдВ рдХрд╛ рдХрдиреЗрдХреНрд╢рди ред рдорд╛рдирдХ рдбрд┐рдХреЛрдбрд░
1.3 рдореЗрдВ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рддреНрд╡рд░рдг рдХреЛ рдЬреЛрдбрд╝рдирд╛ ред рдЬреАрдкреАрдУ рдкрд░ рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╡рд┐рд╢реЗрд╖ рдбрд┐рдХреЛрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
2. рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдЧрддрд┐ рдХреЛ рдорд╛рдкрдирд╛
3. рдХреНрдпреВрдПрд╕рд╡реА рдбрд┐рдХреЛрдбрд░реНрд╕ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдкрд░ рдиреЛрдЯреНрд╕
1. рд╡реАрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рдХреА рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдЧрддрд┐ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рддреАрди рддрд░реАрдХреЗ
рд╣рдо рд╡реАрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рдХреА рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдЧрддрд┐ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рддреАрди рддрд░реАрдХреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред
- рдорд╛рдирдХ рдбрд┐рдХреЛрдбрд░ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдереНрд░реЗрдбреНрд╕ (рдереНрд░реЗрдбреНрд╕) рдХрд╛ рдХрдиреЗрдХреНрд╢рдиред
- рдорд╛рдирдХ рдбрд┐рдХреЛрдбрд░ рдореЗрдВ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рддреНрд╡рд░рдг (HW рддреНрд╡рд░рдг) рдХрд╛ рдХрдиреЗрдХреНрд╢рдиред
- рдЬреАрдкреАрдпреВ рдкрд░ рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╡рд┐рд╢реЗрд╖ рдбрд┐рдХреЛрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред
CPU, .
, FFmpeg. - : тАФ Windows 10, тАФ Intel i5 8400 2.80 (6 hyper-threading), тАФ Intel UHD Graphics 630, тАФ 16 , FFmpeg 4.2.1, zeranoe.
FFmpeg , .
1.1.
(, , ) , . avcodec_open2()
thread_count
AVCodecContext
. тАФ threads
, avcodec_open2()
.
, , (h264
, hevc
, vp9
) , theora
.
-threads
.
1.2.
FFmpeg . FFmpeg API libavutil/hwcontext.h
. enum AVHWDeviceType
, . FFmpeg :
void print_hwtypes_all()
{
AVHWDeviceType hwtype = AV_HWDEVICE_TYPE_NONE;
while ((hwtype = av_hwdevice_iterate_types(hwtype)) !=
AV_HWDEVICE_TYPE_NONE)
{
printf("%s\n", av_hwdevice_get_type_name(hwtype));
}
}
- :
cuda
dxva2
qsv
d3d11va
, cuda
Nvidia , qsv
Intel Quick Sync Video (QSV), Intel (. [1]), dxva2
d3d11va
DirectX Video Acceleration (. [2]), Windows, (Intel, Nvidia, AMD).
( ). , , :
void print_hwtypes(const char* dec_name)
{
const AVCodec* decoder = avcodec_find_decoder_by_name(dec_name);
for (int i = 0; ; ++i) {
const AVCodecHWConfig *config =
avcodec_get_hw_config(decoder, i);
if (config) {
if (config->methods &
AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX) {
printf("%s\n",
av_hwdevice_get_type_name(config->device_type));
}
}
else {
break;
}
}
}
- h264
, hevc
, vp9
, vc1
:
dxva2
d3d11va
cuda
theora
.
, hw_decode.c
. [3], 2expres.
void init_hwdevice(AVHWDeviceType hwtype, AVCodecContext *codec_ctx)
{
AVBufferRef *dev_ctx = NULL;
int ret = av_hwdevice_ctx_create(&dev_ctx, hwtype, NULL, NULL, 0);
if (ret >= 0) {
codec_ctx->get_format = get_hw_format;
codec_ctx->hw_device_ctx = av_buffer_ref(dev_ctx);
}
}
, , av_hwframe_transfer_data()
. dxva2
d3d11va
NV12
.
-hwaccel
.
1.3. ,
FFmpeg , .
Intel Quick Sync Video (QSV), , Intel i3, i5, i7, i9. . [1]. _qsv
. FFmpeg : h264_qsv
, hevc_qsv
, vp8_qsv
, mpeg2_qsv
, vc1_qsv
.
NVDEC, NVENC Nvidia. _cuvid
. FFmpeg : h264_cuvid
, hevc_cuvid
, mpeg2_cuvid
, vc1_cuvid
, vp8_cuvid
, vp9_cuvid
, mjpeg_cuvid
, mpeg4_cuvid
.
:
AVStream *strm;
AVCodecID cid = strm->codecpar->codec_id;
const AVCodec *decoder = avcodec_find_decoder(cid);
. :
const AVCodec *decoder = (cid == AV_CODEC_ID_H264)
? avcodec_find_decoder_by_name("h264_qsv")
: avcodec_find_decoder(cid);
-c:v
-i
ffmpeg -c:v h264_qsv -i INPUT ...
2.
, H264, HEVC(H265). тАФ 38402160 (Ultra HD), тАФ 30 /. тАФ h264
, hevc
QSV тАФ h264_qsv
, hevc_qsv
. 4 : , , , dxva2
. dxva2
, d3d11va
, . , . : , 32- BGRA
libswscale
. ( 12- YUV420P
NV12
.) , , ( ). , 100%, , , . . 64- FFmpeg.
. | h264 | hevc |
---|
Config | # | | CPU | GPU | | CPU | GPU |
---|
default | 1 | 75 | 26 | 0 | 125 | 25 | 0 |
2 | 132 | 28 | 0 | 180 | 27 | 0 |
threads=2 | 1 | 47 | 42 | 0 | 74 | 42 | 0 |
2 | 79 | 48 | 0 | 104 | 46 | 0 |
threads=4 | 1 | 35 | 60 | 0 | 46 | 64 | 0 |
2 | 60 | 54 | 0 | 71 | 70 | 0 |
dxva2 | 1 | 45 | 14 | 72 | 34 | 28 | 70 |
2 | 107 | 28 | 35 | 99 | 30 | 36 |
xxxx_qsv | 1 | 25 | 34 | 80 | 25 | 34 | 72 |
2 | 70 | 39 | 54 | 70 | 40 | 50 |
, , . тАФ BGRA
. , , .
32- FFmpeg. , : hevc
2-3 . .
. -benchmark
. :
ffmpeg -benchmark -i INPUT -an -f null -
ffmpeg -benchmark -threads N -i INPUT -an -f null -
ffmpeg -benchmark -c:v h264_qsv -i INPUT -an -f null -
ffmpeg -benchmark -hwaccel dxva2 -i INPUT -an -f null -
ffmpeg -benchmark -i INPUT -an -pix_fmt bgra -f null -
fps
, speed
. -threads
N
auto
, , 100%.
3. QSV
FFmpeg QSV : h264_qsv
, hevc_qsv
, vp8_qsv
, mpeg2_qsv
, vc1_qsv
. . mpeg2_qsv
, vc1_qsv
. , , , -, , .
. , тАФ avcodec_flush_buffers()
. , .
[1] Intel Quick Sync Video.
[2] DirectX Video Acceleration.
[3] FFmpeg DXVA2.