2017-11-03 10 views
0

Ich benutze FFmpeg (3.4) h264_qsv Encoder in meiner Kamera-Live-Software, fand ich, dass die codierten Daten empfangen nach dem Senden von 40 Bildern! Es gibt ungefähr 1,5 Sekunden Latenz, es ist nicht geeignet für Echtzeit-Situation. Wie konfiguriert man den Encoder? Danke vielmals.Wie reduziert man die Latenz von FFmpeg h264_qsv Encoder?

mein Code:

AVCodecContext* OpenH264Codec(int width, int height, int bitrate, int framerate) 
{ 
    AVCodecContext* ctx = 0; 
    AVCodec* c = 0; 
    c = avcodec_find_encoder_by_name("h264_qsv"); 
    if (c == NULL) return NULL; 
    ctx = avcodec_alloc_context3(c); 
    if (ctx == NULL) return NULL; 
    ctx->width = width; 
    ctx->height = height; 
    ctx->pix_fmt = c->pix_fmts[0]; 
    ctx->bit_rate = bitrate; 
    ctx->bit_rate_tolerance = ctx->bit_rate/2; 
    ctx->rc_min_rate = 32000; 
    ctx->rc_max_rate = ctx->bit_rate*1.5; 
    ctx->time_base.den = framerate; 
    ctx->time_base.num = 1; 
    ctx->framerate.den = 1; 
    ctx->framerate.num = framerate; 
    ctx->gop_size = framerate*5; 
    ctx->max_b_frames = 0; 

    av_opt_set(ctx->priv_data, "preset", "veryfast", 0); 
    av_opt_set(ctx->priv_data, "avbr_accuracy", "1", 0); 
    av_opt_set(ctx->priv_data, "async_depth", "1", 0); 
    av_opt_set(ctx->priv_data, "profile", "main", 0); 
    ctx->flags |= AV_CODEC_FLAG_QSCALE; 
    if (avcodec_open2(ctx, c, 0) < 0) 
    { 
     avcodec_free_context(&ctx); 
     return NULL; 
    } 
    return ctx; 
} 
+0

Möglicherweise mit Lookahead zu tun. – Mulvya

+0

Sie slove mein großes Problem! Vielen Dank!! –

Antwort

0

Dank für Mulvya Tipp. Es gibt jetzt nur noch 5 Frames Latenz.

AVCodecContext* OpenH264Codec(int width, int height, int bitrate, int framerate) 
{ 
    AVCodecContext* ctx = 0; 
    AVCodec* c = 0; 
    c = avcodec_find_encoder_by_name("h264_qsv"); 
    if (c == NULL) return NULL; 
    ctx = avcodec_alloc_context3(c); 
    if (ctx == NULL) return NULL; 
    ctx->width = width; 
    ctx->height = height; 
    ctx->pix_fmt = c->pix_fmts[0]; 
    ctx->bit_rate = bitrate; 
    ctx->bit_rate_tolerance = ctx->bit_rate/2; 
    ctx->time_base.den = framerate; 
    ctx->time_base.num = 1; 
    ctx->framerate.den = 1; 
    ctx->framerate.num = framerate; 
    ctx->gop_size = framerate*5; 
    ctx->max_b_frames = 0; 
    av_opt_set(ctx->priv_data, "preset", "medium", 0); 
    av_opt_set(ctx->priv_data, "look_ahead", "0", 0); 
    //av_opt_set(ctx->priv_data, "look_ahead_depth", "8", 0); 
    if (avcodec_open2(ctx, c, 0) < 0) 
    { 
     avcodec_free_context(&ctx); 
     return NULL; 
    } 
    return ctx; 
} 
Verwandte Themen