Avec l'avĂšnement de formats vidĂ©o lourds tels que 4K (Ultra HD), le problĂšme de l'efficacitĂ© du dĂ©codage des flux vidĂ©o est devenu trĂšs pertinent. Sur un ordinateur moyen, des mesures spĂ©ciales doivent ĂȘtre prises afin de traiter un tel flux vidĂ©o en temps rĂ©el. L'article dĂ©crit les moyens possibles d'augmenter la vitesse de dĂ©codage des flux vidĂ©o dans les solutions basĂ©es sur FFmpeg, et prĂ©sente les rĂ©sultats d'expĂ©riences sur la mesure de la vitesse de dĂ©codage pour les flux vidĂ©o 4K encodĂ©s en H264 et HEVC (H265).
Table des matiĂšres
1. Trois façons d'augmenter la vitesse de décodage du flux vidéo
1.1. Connexion de flux de travail supplémentaires dans les décodeurs standard
1.2. Connexion de l'accélération matérielle dans les décodeurs standard
1.3. Utilisation de décodeurs spéciaux qui implémentent le décodage sur les GPU
2. Mesure de la vitesse de décodage
3. Remarques sur les décodeurs QSV
Ressources
1. Trois façons d'augmenter la vitesse de décodage d'un flux vidéo
Nous considérerons trois façons d'augmenter la vitesse de décodage d'un flux vidéo.
- Connexion de threads de travail supplémentaires (threads) dans les décodeurs standard.
- Connexion de l'accélération matérielle (HW Acceleration) dans les décodeurs standard.
- Utilisation de décodeurs spéciaux qui implémentent le décodage sur les GPU.
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.