現在、Libavcodec を使用して、H.264 を使用してビデオ フレームをエンコードしています。このビデオ フレームはエンコード後にストリーミングしているため、レイテンシを最小限に抑えることは非常に重要です。私の現在の設定は次のとおりです。
avcodec_register_all();
codec = avcodec_find_encoder(AV_CODEC_ID_H264);
// allocate and set ffmpeg context
context = avcodec_alloc_context3(encoder->codec);
context->bit_rate = bitrate;
context->width = out_width;
context->height = out_height;
context->time_base.num = 1;
context->time_base.den = 30;
context->gop_size = 1; // send SPS/PPS headers every packet
context->max_b_frames = 0;
context->pix_fmt = AV_PIX_FMT_YUV420P;
// set encoder parameters to max performance
av_opt_set(context->priv_data, "preset", "ultrafast", 0);
av_opt_set(context->priv_data, "tune", "zerolatency", 0);
// open capture encoder
avcodec_open2(context, codec, NULL);
これらの設定はうまく機能しますが、ハードウェア ベースのエンコーディングに切り替えて、CPU の負荷を軽減しようとしています。私は現在NVIDIA GPUを持っているので、次の設定を使用してみましたh264_nvenc
:
codec = avcodec_find_encoder_by_name("h264_nvenc");
// allocate and set ffmpeg context
context = avcodec_alloc_context3(encoder->codec);
context->dct_algo = FF_DCT_FASTINT;
context->bit_rate = bitrate;
context->width = out_width;
context->height = out_height;
context->time_base.num = 1;
context->time_base.den = 30;
context->gop_size = 1; // send SPS/PPS headers every packet
context->max_b_frames = 0;
context->pix_fmt = AV_PIX_FMT_YUV420P;
// set encoder parameters to max performancen
av_opt_set(context->priv_data, "preset", "llhq", 0);
av_opt_set(context->priv_data, "tune", "zerolatency", 0);
問題は、 のレイテンシが(ソフトウェアベースのバージョン)h264_nvenc
のレイテンシよりも大幅に大きいことに気付きました。GPUベースのエンコーディングはソフトウェアベースのエンコーディングよりも高速である必要がAV_CODEC_ID_H264
あるため、私の設定またはセットアップが間違っているに違いないと思います。h264_nvenc
誰かが私を正しい方向に向けることができますか? 本当にありがとう!