FFmpeg рдореЗрдВ рд╡реАрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рдХреА рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдЧрддрд┐ рдХреИрд╕реЗ рдмрдврд╝рд╛рдПрдВ


4K (рдЕрд▓реНрдЯреНрд░рд╛ рдПрдЪрдбреА) рдЬреИрд╕реЗ рднрд╛рд░реА рд╡реАрдбрд┐рдпреЛ рдкреНрд░рд╛рд░реВрдкреЛрдВ рдХреЗ рдЖрдЧрдорди рдХреЗ рд╕рд╛рде, рд╡реАрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рдбрд┐рдХреЛрдбрд┐рдВрдЧ рджрдХреНрд╖рддрд╛ рдХреА рд╕рдорд╕реНрдпрд╛ рдХрд╛рдлреА рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реЛ рдЧрдИ рд╣реИред рдПрдХ рдФрд╕рдд рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреА рд╡реАрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рдЙрдкрд╛рдп рдХрд┐рдП рдЬрд╛рдиреЗ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдЦ рдПрдлрдПрдлрдПрдордИрдЬреА-рдЖрдзрд╛рд░рд┐рдд рд╕рдорд╛рдзрд╛рдиреЛрдВ рдореЗрдВ рд╡реАрдбрд┐рдпреЛ рдзрд╛рд░рд╛рдУрдВ рдХреА рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдЧрддрд┐ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рддрд░реАрдХреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдЪ 264 рдФрд░ рдПрдЪрдИрд╡реАрд╕реА (рдПрдЪ 265) рдореЗрдВ рдПрдиреНрдХреЛрдб рдХрд┐рдП рдЧрдП 4K рд╡реАрдбрд┐рдпреЛ рдзрд╛рд░рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдЧрддрд┐ рдХреЛ рдорд╛рдкрдиреЗ рдХреЗ рдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИред




рд╡рд┐рд╖рдп - рд╕реВрдЪреА


  1. рд╡реАрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо
    1.1 рдХреА рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдЧрддрд┐ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рддреАрди рддрд░реАрдХреЗ ред рдорд╛рдирдХ рдбрд┐рдХреЛрдбрд░
    1.2 рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдп рдзрд╛рд░рд╛рдУрдВ рдХрд╛ рдХрдиреЗрдХреНрд╢рди ред рдорд╛рдирдХ рдбрд┐рдХреЛрдбрд░
    1.3 рдореЗрдВ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рддреНрд╡рд░рдг рдХреЛ рдЬреЛрдбрд╝рдирд╛ ред рдЬреАрдкреАрдУ рдкрд░ рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╡рд┐рд╢реЗрд╖ рдбрд┐рдХреЛрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
  2. рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдЧрддрд┐ рдХреЛ рдорд╛рдкрдирд╛
  3. рдХреНрдпреВрдПрд╕рд╡реА рдбрд┐рдХреЛрдбрд░реНрд╕ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдкрд░ рдиреЛрдЯреНрд╕
  




1. рд╡реАрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рдХреА рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдЧрддрд┐ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рддреАрди рддрд░реАрдХреЗ


рд╣рдо рд╡реАрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рдХреА рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдЧрддрд┐ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рддреАрди рддрд░реАрдХреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред


  1. рдорд╛рдирдХ рдбрд┐рдХреЛрдбрд░ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдереНрд░реЗрдбреНрд╕ (рдереНрд░реЗрдбреНрд╕) рдХрд╛ рдХрдиреЗрдХреНрд╢рдиред
  2. рдорд╛рдирдХ рдбрд┐рдХреЛрдбрд░ рдореЗрдВ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рддреНрд╡рд░рдг (HW рддреНрд╡рд░рдг) рдХрд╛ рдХрдиреЗрдХреНрд╢рдиред
  3. рдЬреАрдкреАрдпреВ рдкрд░ рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╡рд┐рд╢реЗрд╖ рдбрд┐рдХреЛрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред

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; // . hw_decode.c
        codec_ctx->hw_device_ctx = av_buffer_ref(dev_ctx);
//   dev_ctx,    
//   av_buffer_unref()
    }
}

, , 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.


.
h264hevc
Config#CPUGPUCPUGPU
default175260125250
2132280180270
threads=214742074420
279480104460
threads=413560046640
26054071700
dxva21451472342870
21072835993036
xxxx_qsv1253480253472
2703954704050


, , . тАФ 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.




Source: https://habr.com/ru/post/undefined/


All Articles